diff options
author | erdgeist <> | 2006-12-07 02:58:02 +0000 |
---|---|---|
committer | erdgeist <> | 2006-12-07 02:58:02 +0000 |
commit | 1c1fd9fe4a2ff21bad94190875c12bd353c13360 (patch) | |
tree | 9e480aaeae5f168c7b4e80fb5a7f0e40d15b96aa /opentracker.c | |
parent | e31f00dac1cd4d30c192d3287d3c726e3b2a0372 (diff) |
Started to implement glue
Diffstat (limited to 'opentracker.c')
-rw-r--r-- | opentracker.c | 97 |
1 files changed, 7 insertions, 90 deletions
diff --git a/opentracker.c b/opentracker.c index 1c0d558..16f2f1e 100644 --- a/opentracker.c +++ b/opentracker.c | |||
@@ -31,7 +31,6 @@ struct http_data { | |||
31 | io_batch iob; | 31 | io_batch iob; |
32 | char* hdrbuf; | 32 | char* hdrbuf; |
33 | int hlen; | 33 | int hlen; |
34 | int keepalive; | ||
35 | }; | 34 | }; |
36 | 35 | ||
37 | int header_complete(struct http_data* r) { | 36 | int header_complete(struct http_data* r) { |
@@ -58,9 +57,7 @@ void httperror(struct http_data* r,const char* title,const char* message) { | |||
58 | } else { | 57 | } else { |
59 | c+=fmt_str(c,"HTTP/1.0 "); | 58 | c+=fmt_str(c,"HTTP/1.0 "); |
60 | c+=fmt_str(c,title); | 59 | c+=fmt_str(c,title); |
61 | c+=fmt_str(c,"\r\nContent-Type: text/html\r\nConnection: "); | 60 | c+=fmt_str(c,"\r\nContent-Type: text/html\r\nConnection: close\r\nContent-Length: "); |
62 | c+=fmt_str(c,r->keepalive?"keep-alive":"close"); | ||
63 | c+=fmt_str(c,"\r\nContent-Length: "); | ||
64 | c+=fmt_ulong(c,strlen(message)+strlen(title)+16-4); | 61 | c+=fmt_ulong(c,strlen(message)+strlen(title)+16-4); |
65 | c+=fmt_str(c,"\r\n\r\n<title>"); | 62 | c+=fmt_str(c,"\r\n\r\n<title>"); |
66 | c+=fmt_str(c,title+4); | 63 | c+=fmt_str(c,title+4); |
@@ -70,48 +67,6 @@ void httperror(struct http_data* r,const char* title,const char* message) { | |||
70 | iob_addbuf(&r->iob,r->hdrbuf,r->hlen); | 67 | iob_addbuf(&r->iob,r->hdrbuf,r->hlen); |
71 | } | 68 | } |
72 | 69 | ||
73 | static struct mimeentry { const char* name, *type; } mimetab[] = { | ||
74 | { "html", "text/html" }, | ||
75 | { "css", "text/css" }, | ||
76 | { "dvi", "application/x-dvi" }, | ||
77 | { "ps", "application/postscript" }, | ||
78 | { "pdf", "application/pdf" }, | ||
79 | { "gif", "image/gif" }, | ||
80 | { "png", "image/png" }, | ||
81 | { "jpeg", "image/jpeg" }, | ||
82 | { "jpg", "image/jpeg" }, | ||
83 | { "mpeg", "video/mpeg" }, | ||
84 | { "mpg", "video/mpeg" }, | ||
85 | { "avi", "video/x-msvideo" }, | ||
86 | { "mov", "video/quicktime" }, | ||
87 | { "qt", "video/quicktime" }, | ||
88 | { "mp3", "audio/mpeg" }, | ||
89 | { "ogg", "audio/x-oggvorbis" }, | ||
90 | { "wav", "audio/x-wav" }, | ||
91 | { "pac", "application/x-ns-proxy-autoconfig" }, | ||
92 | { "sig", "application/pgp-signature" }, | ||
93 | { "torrent", "application/x-bittorrent" }, | ||
94 | { "class", "application/octet-stream" }, | ||
95 | { "js", "application/x-javascript" }, | ||
96 | { "tar", "application/x-tar" }, | ||
97 | { "zip", "application/zip" }, | ||
98 | { "dtd", "text/xml" }, | ||
99 | { "xml", "text/xml" }, | ||
100 | { "xbm", "image/x-xbitmap" }, | ||
101 | { "xpm", "image/x-xpixmap" }, | ||
102 | { "xwd", "image/x-xwindowdump" }, | ||
103 | { 0,0 } }; | ||
104 | |||
105 | const char* mimetype(const char* filename) { | ||
106 | int i,e=str_rchr(filename,'.'); | ||
107 | if (filename[e]==0) return "text/plain"; | ||
108 | ++e; | ||
109 | for (i=0; mimetab[i].name; ++i) | ||
110 | if (str_equal(mimetab[i].name,filename+e)) | ||
111 | return mimetab[i].type; | ||
112 | return "application/octet-stream"; | ||
113 | } | ||
114 | |||
115 | const char* http_header(struct http_data* r,const char* h) { | 70 | const char* http_header(struct http_data* r,const char* h) { |
116 | long i; | 71 | long i; |
117 | long l=array_bytes(&r->r); | 72 | long l=array_bytes(&r->r); |
@@ -128,7 +83,6 @@ const char* http_header(struct http_data* r,const char* h) { | |||
128 | 83 | ||
129 | void httpresponse(struct http_data* h,int64 s) { | 84 | void httpresponse(struct http_data* h,int64 s) { |
130 | char* c; | 85 | char* c; |
131 | const char* m; | ||
132 | array_cat0(&h->r); | 86 | array_cat0(&h->r); |
133 | c=array_start(&h->r); | 87 | c=array_start(&h->r); |
134 | if (byte_diff(c,4,"GET ")) { | 88 | if (byte_diff(c,4,"GET ")) { |
@@ -152,28 +106,15 @@ e404: | |||
152 | io_close(fd); | 106 | io_close(fd); |
153 | goto e404; | 107 | goto e404; |
154 | } | 108 | } |
155 | if ((m=http_header(h,"Connection"))) { | ||
156 | if (str_equal(m,"keep-alive")) | ||
157 | h->keepalive=1; | ||
158 | else | ||
159 | h->keepalive=0; | ||
160 | } else { | ||
161 | if (byte_equal(d+1,8,"HTTP/1.0")) | ||
162 | h->keepalive=0; | ||
163 | else | ||
164 | h->keepalive=1; | ||
165 | } | ||
166 | m=mimetype(c); | ||
167 | c=h->hdrbuf=(char*)malloc(500); | 109 | c=h->hdrbuf=(char*)malloc(500); |
168 | c+=fmt_str(c,"HTTP/1.1 Coming Up\r\nContent-Type: "); | 110 | c+=fmt_str(c,"HTTP/1.1 Coming Up\r\nContent-Type: text/plain"); |
169 | c+=fmt_str(c,m); | ||
170 | c+=fmt_str(c,"\r\nContent-Length: "); | 111 | c+=fmt_str(c,"\r\nContent-Length: "); |
112 | /* ANSWER SIZE*/ | ||
171 | c+=fmt_ulonglong(c,s.st_size); | 113 | c+=fmt_ulonglong(c,s.st_size); |
172 | c+=fmt_str(c,"\r\nLast-Modified: "); | 114 | c+=fmt_str(c,"\r\nLast-Modified: "); |
115 | /* MODIFY DATE */ | ||
173 | c+=fmt_httpdate(c,s.st_mtime); | 116 | c+=fmt_httpdate(c,s.st_mtime); |
174 | c+=fmt_str(c,"\r\nConnection: "); | 117 | c+=fmt_str(c,"\r\nConnection: close\r\n\r\n"); |
175 | c+=fmt_str(c,h->keepalive?"keep-alive":"close"); | ||
176 | c+=fmt_str(c,"\r\n\r\n"); | ||
177 | iob_addbuf(&h->iob,h->hdrbuf,c - h->hdrbuf); | 118 | iob_addbuf(&h->iob,h->hdrbuf,c - h->hdrbuf); |
178 | iob_addfile(&h->iob,fd,0,s.st_size); | 119 | iob_addfile(&h->iob,fd,0,s.st_size); |
179 | } | 120 | } |
@@ -201,14 +142,6 @@ int main() { | |||
201 | if (i==s) { | 142 | if (i==s) { |
202 | int n; | 143 | int n; |
203 | while ((n=socket_accept6(s,ip,&port,&scope_id))!=-1) { | 144 | while ((n=socket_accept6(s,ip,&port,&scope_id))!=-1) { |
204 | char buf[IP6_FMT]; | ||
205 | buffer_puts(buffer_2,"accepted new connection from "); | ||
206 | buffer_put(buffer_2,buf,fmt_ip6(buf,ip)); | ||
207 | buffer_puts(buffer_2,":"); | ||
208 | buffer_putulong(buffer_2,port); | ||
209 | buffer_puts(buffer_2," (fd "); | ||
210 | buffer_putulong(buffer_2,n); | ||
211 | buffer_puts(buffer_2,")"); | ||
212 | if (io_fd(n)) { | 145 | if (io_fd(n)) { |
213 | struct http_data* h=(struct http_data*)malloc(sizeof(struct http_data)); | 146 | struct http_data* h=(struct http_data*)malloc(sizeof(struct http_data)); |
214 | io_wantread(n); | 147 | io_wantread(n); |
@@ -217,10 +150,8 @@ int main() { | |||
217 | io_setcookie(n,h); | 150 | io_setcookie(n,h); |
218 | } else | 151 | } else |
219 | io_close(n); | 152 | io_close(n); |
220 | } else { | 153 | } else |
221 | buffer_puts(buffer_2,", but io_fd failed."); | ||
222 | io_close(n); | 154 | io_close(n); |
223 | } | ||
224 | buffer_putnlflush(buffer_2); | 155 | buffer_putnlflush(buffer_2); |
225 | } | 156 | } |
226 | if (errno==EAGAIN) | 157 | if (errno==EAGAIN) |
@@ -237,11 +168,6 @@ int main() { | |||
237 | iob_reset(&h->iob); | 168 | iob_reset(&h->iob); |
238 | free(h->hdrbuf); h->hdrbuf=0; | 169 | free(h->hdrbuf); h->hdrbuf=0; |
239 | } | 170 | } |
240 | buffer_puts(buffer_2,"io_tryread("); | ||
241 | buffer_putulong(buffer_2,i); | ||
242 | buffer_puts(buffer_2,"): "); | ||
243 | buffer_puterror(buffer_2); | ||
244 | buffer_putnlflush(buffer_2); | ||
245 | io_close(i); | 171 | io_close(i); |
246 | } else if (l==0) { | 172 | } else if (l==0) { |
247 | if (h) { | 173 | if (h) { |
@@ -249,12 +175,8 @@ int main() { | |||
249 | iob_reset(&h->iob); | 175 | iob_reset(&h->iob); |
250 | free(h->hdrbuf); h->hdrbuf=0; | 176 | free(h->hdrbuf); h->hdrbuf=0; |
251 | } | 177 | } |
252 | buffer_puts(buffer_2,"eof on fd #"); | ||
253 | buffer_putulong(buffer_2,i); | ||
254 | buffer_putnlflush(buffer_2); | ||
255 | io_close(i); | 178 | io_close(i); |
256 | } else if (l>0) { | 179 | } else if (l>0) { |
257 | buffer_puts(buffer_2,"Garr"); | ||
258 | array_catb(&h->r,buf,l); | 180 | array_catb(&h->r,buf,l); |
259 | if (array_failed(&h->r)) { | 181 | if (array_failed(&h->r)) { |
260 | httperror(h,"500 Server Error","request too long."); | 182 | httperror(h,"500 Server Error","request too long."); |
@@ -272,17 +194,12 @@ emerge: | |||
272 | while ((i=io_canwrite())!=-1) { | 194 | while ((i=io_canwrite())!=-1) { |
273 | struct http_data* h=io_getcookie(i); | 195 | struct http_data* h=io_getcookie(i); |
274 | int64 r=iob_send(i,&h->iob); | 196 | int64 r=iob_send(i,&h->iob); |
275 | /* printf("iob_send returned %lld\n",r); */ | ||
276 | if (r==-1) io_eagain(i); else | 197 | if (r==-1) io_eagain(i); else |
277 | if (r<=0) { | 198 | if (r<=0) { |
278 | array_trunc(&h->r); | 199 | array_trunc(&h->r); |
279 | iob_reset(&h->iob); | 200 | iob_reset(&h->iob); |
280 | free(h->hdrbuf); h->hdrbuf=0; | 201 | free(h->hdrbuf); h->hdrbuf=0; |
281 | if (h->keepalive) { | 202 | io_close(i); |
282 | io_dontwantwrite(i); | ||
283 | io_wantread(i); | ||
284 | } else | ||
285 | io_close(i); | ||
286 | } | 203 | } |
287 | } | 204 | } |
288 | } | 205 | } |