summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Crute <mcrute@gmail.com>2009-12-01 10:11:58 -0500
committerMike Crute <mcrute@gmail.com>2009-12-01 10:11:58 -0500
commitc8d560969d979b7ed978cafde1a0501cab20eab5 (patch)
tree23c90d7639d60a10069d96c7be27c123fd238929
downloadmyturl_clients-master.tar.bz2
myturl_clients-master.tar.xz
myturl_clients-master.zip
Initial importHEADmaster
-rw-r--r--MyTurl.java46
-rw-r--r--myturl_client.c204
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
10import java.net.URL;
11import java.net.HttpURLConnection;
12import java.net.URLEncoder;
13
14
15public 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
18static const char *URL_BASE = "http://myturl.com/add-url?url=";
19static int it_worked = FALSE;
20
21
22inline
23void
24blow_up(const char *message)
25{
26 perror(message);
27 exit(EXIT_FAILURE);
28}
29
30
31inline
32void *
33safe_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
45inline
46void
47safe_free(void *stuff)
48{
49 free(stuff);
50 stuff = NULL;
51}
52
53
54char *
55chomp_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
66inline
67int
68starts_with(const char *instr, const char* value)
69{
70 return !(strncmp(instr, value, strlen(value)));
71}
72
73
74inline
75int
76char_in(const char *instr, char testval)
77{
78 return !(strchr(instr, (int)testval) == NULL);
79}
80
81
82char
83to_hex(char code)
84{
85 static char hex[] = "0123456789abcdef";
86 return hex[code & 15];
87}
88
89
90char *
91url_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
117char *
118get_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
132size_t
133handle_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
149void
150silence_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
161inline
162char *
163string_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
171int
172main(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}