deflate is broken.
[elinks.git] / contrib / proxy / gen.c
blob6e7807aba0235c9f7b3bcece735bef702aae348a
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <sys/stat.h>
5 #include <unistd.h>
7 struct stat st;
8 char *file = "/tmp/log";
9 unsigned char *data;
10 int counter = 0;
12 struct {
13 unsigned char *string;
14 unsigned char *host;
15 unsigned char *data;
16 int length;
17 } tab[100000]; /* should be enough */
19 unsigned char header[] =
20 "#!/usr/bin/env python\n"
21 "import BaseHTTPServer\n\n";
23 unsigned char footer[] =
24 "class Serwer(BaseHTTPServer.BaseHTTPRequestHandler):\n"
25 "\tdef do_GET(self):\n"
26 "\t\tglobal slownik\n"
27 "\t\tof = open(slownik[self.path])\n"
28 "\t\tprint (self.path)\n"
29 "\t\tself.wfile.write(of.read())\n"
30 "\t\tof.close()\n\n"
31 "\tdef do_POST(self):\n"
32 "\t\tself.do_GET()\n\n"
33 "def run(server_class = BaseHTTPServer.HTTPServer, handler_class = Serwer):\n"
34 "\tserver_address = ('', 8000)\n"
35 "\thttpd = server_class(server_address, handler_class)\n"
36 "\thttpd.serve_forever()\n\n"
37 "run()\n";
39 static unsigned char *
40 find(unsigned char *from, unsigned char *key)
42 unsigned char *end = data + st.st_size;
43 unsigned char *beg;
44 int l = strlen(key);
46 for (beg = from;; beg++) {
47 beg = memchr(beg, key[0], end - beg);
48 if (!beg)
49 break;
50 if (!strncmp(beg, key, l))
51 break;
53 return beg;
56 static void
57 parse(void)
59 unsigned char *current = data;
61 while (1) {
62 unsigned char *conn = find(current, "CONNECTION:");
63 unsigned char *get = find(current, "GET /");
64 unsigned char *post = find(current, "POST /");
65 unsigned char *host, *space, *http;
66 size_t enter;
68 if (counter) {
69 unsigned char *min = data + st.st_size;
71 if (conn)
72 min = conn;
73 if (get && get < min)
74 min = get;
75 if (post && post < min)
76 min = post;
77 tab[counter - 1].length = min - http;
79 if (get && post) {
80 if (get < post) {
81 current = get + 4;
82 } else {
83 current = post + 5;
85 } else {
86 if (get) {
87 current = get + 4;
88 } else if (post) {
89 current = post + 5;
90 } else {
91 return;
95 space = strchr(current, ' ');
96 if (!space)
97 return;
99 host = find(space + 1, "Host: ");
100 if (!host)
101 return;
103 *space = '\0';
104 tab[counter].string = current;
105 host += 6;
106 enter = strcspn(host, "\r\n\0");
107 host[enter] = '\0';
108 tab[counter].host = host;
110 http = find(host + enter + 1, "HTTP/");
111 if (!http)
112 return;
113 tab[counter++].data = http;
117 static void
118 dicts(FILE *f)
120 int i;
122 fprintf(f, "slownik = {\n");
123 for (i = 0; i < counter - 1; i++) {
124 fprintf(f, "\t'http://%s%s' : '%d.http',\n", tab[i].host, tab[i].string, i);
126 for (; i < counter; i++) {
127 fprintf(f, "\t'http://%s%s' : '%d.http'\n", tab[i].host, tab[i].string, i);
129 fprintf(f, "}\n\n");
132 static void
133 save(void)
135 int i;
136 FILE *f;
138 for (i = 0; i < counter; i++) {
139 char buf[12];
141 snprintf(buf, 12, "%d.http", i);
142 f = fopen(buf, "w");
143 if (!f)
144 return;
145 fwrite(tab[i].data, 1, tab[i].length, f);
146 fclose(f);
148 f = fopen("proxy.py", "w");
149 if (!f)
150 return;
151 fprintf(f, "%s", header);
152 dicts(f);
153 fprintf(f, "%s", footer);
154 fclose(f);
158 main(int argc, char **argv)
160 FILE *f;
162 if (argc > 1)
163 file = argv[1];
164 f = fopen(file, "r");
165 if (!f)
166 return 1;
167 stat(file, &st);
168 data = calloc(1, st.st_size + 1);
169 if (!data)
170 return 2;
171 fread(data, 1, st.st_size, f);
172 fclose(f);
174 parse();
175 save();
176 return 0;