diff options
author | Mike Crute <mcrute@gmail.com> | 2009-12-01 10:11:58 -0500 |
---|---|---|
committer | Mike Crute <mcrute@gmail.com> | 2009-12-01 10:11:58 -0500 |
commit | c8d560969d979b7ed978cafde1a0501cab20eab5 (patch) | |
tree | 23c90d7639d60a10069d96c7be27c123fd238929 | |
download | myturl_clients-c8d560969d979b7ed978cafde1a0501cab20eab5.tar.bz2 myturl_clients-c8d560969d979b7ed978cafde1a0501cab20eab5.tar.xz myturl_clients-c8d560969d979b7ed978cafde1a0501cab20eab5.zip |
-rw-r--r-- | MyTurl.java | 46 | ||||
-rw-r--r-- | myturl_client.c | 204 |
2 files changed, 250 insertions, 0 deletions
diff --git a/MyTurl.java b/MyTurl.java new file mode 100644 index 0000000..53125ed --- /dev/null +++ b/MyTurl.java | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * myturl.com URL Shortener (Java Client) | ||
3 | * by Mike Crute (mcrute@gmail.com) | ||
4 | * on December 1, 2009 | ||
5 | * | ||
6 | * compile with: javac MyTurl.java | ||
7 | * run with: java MyTurl | ||
8 | */ | ||
9 | |||
10 | import java.net.URL; | ||
11 | import java.net.HttpURLConnection; | ||
12 | import java.net.URLEncoder; | ||
13 | |||
14 | |||
15 | public class MyTurl | ||
16 | { | ||
17 | public static void blow_up(String message) | ||
18 | { | ||
19 | System.err.println(message); | ||
20 | System.exit(1); | ||
21 | } | ||
22 | |||
23 | |||
24 | public static void main(String[] args) | ||
25 | throws Exception | ||
26 | { | ||
27 | if (args.length < 1) { | ||
28 | blow_up("This program takes one argument, the URL."); | ||
29 | } | ||
30 | |||
31 | String target = URLEncoder.encode(args[0], "US-ASCII"); | ||
32 | URL myTurl = new URL("http://myturl.com/add-url?url=" + target); | ||
33 | HttpURLConnection conn = (HttpURLConnection)myTurl.openConnection(); | ||
34 | |||
35 | if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { | ||
36 | blow_up("Couldn't contact the service!"); | ||
37 | } | ||
38 | |||
39 | String turl = conn.getHeaderField("X-MyTurl"); | ||
40 | if (turl == null) { | ||
41 | blow_up("No turl was generated. Check your URL."); | ||
42 | } | ||
43 | |||
44 | System.out.println(turl); | ||
45 | } | ||
46 | } | ||
diff --git a/myturl_client.c b/myturl_client.c new file mode 100644 index 0000000..68af292 --- /dev/null +++ b/myturl_client.c | |||
@@ -0,0 +1,204 @@ | |||
1 | /* | ||
2 | * myturl.com URL Shortener (C Client) | ||
3 | * by Mike Crute (mcrute@gmail.com) | ||
4 | * on December 1, 2009 | ||
5 | * | ||
6 | * compile with: gcc -lcurl -o myturl myturl_client.c | ||
7 | */ | ||
8 | |||
9 | #include <stdio.h> | ||
10 | #include <stdlib.h> | ||
11 | #include <string.h> | ||
12 | #include <curl/curl.h> | ||
13 | |||
14 | #define TRUE 1 | ||
15 | #define FALSE 0 | ||
16 | |||
17 | |||
18 | static const char *URL_BASE = "http://myturl.com/add-url?url="; | ||
19 | static int it_worked = FALSE; | ||
20 | |||
21 | |||
22 | inline | ||
23 | void | ||
24 | blow_up(const char *message) | ||
25 | { | ||
26 | perror(message); | ||
27 | exit(EXIT_FAILURE); | ||
28 | } | ||
29 | |||
30 | |||
31 | inline | ||
32 | void * | ||
33 | safe_malloc(size_t size) | ||
34 | { | ||
35 | char *location = calloc(1, size); | ||
36 | |||
37 | if (location == NULL) { | ||
38 | blow_up("You ran out of memory!"); | ||
39 | } | ||
40 | |||
41 | return location; | ||
42 | } | ||
43 | |||
44 | |||
45 | inline | ||
46 | void | ||
47 | safe_free(void *stuff) | ||
48 | { | ||
49 | free(stuff); | ||
50 | stuff = NULL; | ||
51 | } | ||
52 | |||
53 | |||
54 | char * | ||
55 | chomp_end(const char *instr) | ||
56 | { | ||
57 | size_t len = strlen(instr); | ||
58 | |||
59 | char *output = safe_malloc(len); | ||
60 | strlcpy(output, instr, len - 1); | ||
61 | |||
62 | return output; | ||
63 | } | ||
64 | |||
65 | |||
66 | inline | ||
67 | int | ||
68 | starts_with(const char *instr, const char* value) | ||
69 | { | ||
70 | return !(strncmp(instr, value, strlen(value))); | ||
71 | } | ||
72 | |||
73 | |||
74 | inline | ||
75 | int | ||
76 | char_in(const char *instr, char testval) | ||
77 | { | ||
78 | return !(strchr(instr, (int)testval) == NULL); | ||
79 | } | ||
80 | |||
81 | |||
82 | char | ||
83 | to_hex(char code) | ||
84 | { | ||
85 | static char hex[] = "0123456789abcdef"; | ||
86 | return hex[code & 15]; | ||
87 | } | ||
88 | |||
89 | |||
90 | char * | ||
91 | url_quote(char *string) | ||
92 | { | ||
93 | static char *acceptable = "-_.~"; | ||
94 | |||
95 | char *buffer = safe_malloc(strlen(string) * 3 + 1); | ||
96 | char *strpos = string; | ||
97 | char *bufpos = buffer; | ||
98 | |||
99 | while (*strpos) { | ||
100 | if (isalnum(*strpos) || char_in(acceptable, *strpos)) { | ||
101 | *bufpos++ = *strpos; | ||
102 | } else if (*strpos == ' ') { | ||
103 | *bufpos++ = '+'; | ||
104 | } else { | ||
105 | *bufpos++ = '%'; | ||
106 | *bufpos++ = to_hex(*strpos >> 4); | ||
107 | *bufpos++ = to_hex(*strpos & 15); | ||
108 | } | ||
109 | |||
110 | *strpos++; | ||
111 | } | ||
112 | |||
113 | return buffer; | ||
114 | } | ||
115 | |||
116 | |||
117 | char * | ||
118 | get_value_part(const char *instr) | ||
119 | { | ||
120 | size_t len = strlen(instr); | ||
121 | |||
122 | char *offset = strpbrk(instr, ":") + 2; | ||
123 | size_t slice_size = len - (instr - offset); | ||
124 | |||
125 | char *output = safe_malloc(len); | ||
126 | strlcpy(output, offset, slice_size); | ||
127 | |||
128 | return output; | ||
129 | } | ||
130 | |||
131 | |||
132 | size_t | ||
133 | handle_headers(char *instr, size_t size, size_t slen, void *outstream) | ||
134 | { | ||
135 | char *header = chomp_end(instr); | ||
136 | |||
137 | if (starts_with(header, "X-MyTurl:")) { | ||
138 | char *value = get_value_part(header); | ||
139 | printf("%s\n", value); | ||
140 | safe_free(value); | ||
141 | it_worked = TRUE; | ||
142 | } | ||
143 | |||
144 | safe_free(header); | ||
145 | return size * slen; | ||
146 | } | ||
147 | |||
148 | |||
149 | void | ||
150 | silence_curl(CURL *curl) | ||
151 | { | ||
152 | FILE *devnull = fopen("/dev/null", "w"); | ||
153 | if (devnull == NULL) { | ||
154 | blow_up("Could not open /dev/null."); | ||
155 | } | ||
156 | |||
157 | curl_easy_setopt(curl, CURLOPT_WRITEDATA, devnull); | ||
158 | } | ||
159 | |||
160 | |||
161 | inline | ||
162 | char * | ||
163 | string_join(const char *lhs, const char *rhs) | ||
164 | { | ||
165 | char *output = safe_malloc(strlen(lhs) + strlen(rhs)); | ||
166 | sprintf(output, "%s%s", lhs, rhs); | ||
167 | return output; | ||
168 | } | ||
169 | |||
170 | |||
171 | int | ||
172 | main(int argc, char **argv) | ||
173 | { | ||
174 | if (argc < 2) { | ||
175 | blow_up("This program takes only one argument, the URL."); | ||
176 | } | ||
177 | |||
178 | CURL *curl = curl_easy_init(); | ||
179 | if (!curl) { | ||
180 | blow_up("Failed to initialize curl!"); | ||
181 | } | ||
182 | |||
183 | silence_curl(curl); | ||
184 | curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, handle_headers); | ||
185 | |||
186 | char *encoded = url_quote(argv[1]); | ||
187 | char *url = string_join(URL_BASE, encoded); | ||
188 | curl_easy_setopt(curl, CURLOPT_URL, url); | ||
189 | |||
190 | CURLcode result = curl_easy_perform(curl); | ||
191 | if (result != 0) { | ||
192 | blow_up("Couldn't contact the service!"); | ||
193 | } | ||
194 | |||
195 | if (it_worked == FALSE) { | ||
196 | perror("No turl was generated. Check your URL."); | ||
197 | } | ||
198 | |||
199 | curl_easy_cleanup(curl); | ||
200 | safe_free(url); | ||
201 | safe_free(encoded); | ||
202 | |||
203 | return EXIT_SUCCESS; | ||
204 | } | ||