summaryrefslogtreecommitdiff
path: root/opentracker.c
diff options
context:
space:
mode:
authorerdgeist <>2006-12-07 02:58:02 +0000
committererdgeist <>2006-12-07 02:58:02 +0000
commit1c1fd9fe4a2ff21bad94190875c12bd353c13360 (patch)
tree9e480aaeae5f168c7b4e80fb5a7f0e40d15b96aa /opentracker.c
parente31f00dac1cd4d30c192d3287d3c726e3b2a0372 (diff)
Started to implement glue
Diffstat (limited to 'opentracker.c')
-rw-r--r--opentracker.c97
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
37int header_complete(struct http_data* r) { 36int 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
73static 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
105const 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
115const char* http_header(struct http_data* r,const char* h) { 70const 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
129void httpresponse(struct http_data* h,int64 s) { 84void 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) {
257buffer_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 }