From 4af218734ff2ac7da1a6bdd55fde1ea71848fee7 Mon Sep 17 00:00:00 2001 From: David Troy Date: Mon, 3 Apr 2006 21:33:51 +0000 Subject: git-svn-id: http://svncommunity.digium.com/svn/astmanproxy/branches/1.20pre@77 f02b47b9-160a-0410-81a6-dc3441afb0ec --- TODO | 2 +- src/http.c | 74 ++++++++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/TODO b/TODO index 224e4b8..5febf5a 100644 --- a/TODO +++ b/TODO @@ -8,4 +8,4 @@ libtool/autoconf/automake support SetInputFormat proxyaction? clean up autodisconnect vs. inputcomplete/outputcomplete -deal with no empty http better (no formdata) +deal with no empty http better (no formdata; return error header?) diff --git a/src/http.c b/src/http.c index ff876a1..8a8d245 100644 --- a/src/http.c +++ b/src/http.c @@ -32,24 +32,43 @@ int ParseHTTPInput(char *buf, struct message *m) { return (m->hdrcount > 0); } -int BuildHTTPHeader(char *hdr) { +int HTTPHeader(struct mansession *s, char *status) { time_t t; struct tm tm; char date[80]; + char ctype[15], hdr[MAX_LEN]; time(&t); localtime_r(&t, &tm); strftime(date, sizeof(date), "%a, %d %b %Y %H:%M:%S %z", &tm); - sprintf(hdr, - "HTTP/1.1 200 OK\r\n" - "Date: %s\r\n" - "Content-Type: text/xml\r\n" - "Connection: close\r\n" - "Server: %s/%s\r\n\r\n", - date, PROXY_BANNER, PROXY_VERSION); + if ( !strcasecmp("xml", s->output->formatname) ) + sprintf(ctype, "text/xml"); + else + sprintf(ctype, "text/plain"); + + if (!strcmp("200 OK", status) ) + sprintf(hdr, + "HTTP/1.1 %s\r\n" + "Date: %s\r\n" + "Content-Type: %s\r\n" + "Connection: close\r\n" + "Server: %s/%s\r\n\r\n", status, + date, ctype, PROXY_BANNER, PROXY_VERSION); + else + sprintf(hdr, + "HTTP/1.1 %s\r\n" + "Date: %s\r\n" + "Status: %s\r\n" + "Server: %s/%s\r\n\r\n", status, date, status, PROXY_BANNER, PROXY_VERSION); + + pthread_mutex_lock(&s->lock); + s->inputcomplete = 1; + ast_carefulwrite(s->fd, hdr, strlen(hdr), s->writetimeout); + pthread_mutex_unlock(&s->lock); + debugmsg("http header: %s", hdr); return 0; } @@ -59,12 +78,12 @@ int _read(struct mansession *s, struct message *m) { /* Note: No single line may be longer than MAX_LEN/s->inbuf, as per get_input */ /* No HTTP Input may be longer than BUFSIZE */ - char line[MAX_LEN], method[10], formdata[MAX_LEN], header[MAX_LEN]; + char line[MAX_LEN], method[10], formdata[MAX_LEN], status[15]; int res, clength = 0; memset(method, 0, sizeof method); memset(formdata, 0, sizeof formdata); - memset(header, 0, sizeof header); + memset(status, 0, sizeof status); /* for http, don't do get_input forever */ for (;;) { @@ -87,11 +106,15 @@ int _read(struct mansession *s, struct message *m) { if (!*method) { if ( !strncmp(line,"POST",4) ) { strncpy(method, line, 4); - } else if ( !strncmp(line,"GET",3) && strlen(line)>14 ) { - /* GET / HTTP/1.1 ---- this is bad */ - /* GET /?Action=Ping&ActionID=Foo HTTP/1.1 */ - strncpy(method, line, 3); - memcpy(formdata, line+6, strstr(line, " HTTP")-line-6); + } else if ( !strncmp(line,"GET",3)) { + if ( strlen(line) > 14 ) { + /* GET / HTTP/1.1 ---- this is bad */ + /* GET /?Action=Ping&ActionID=Foo HTTP/1.1 */ + strncpy(method, line, 3); + memcpy(formdata, line+6, strstr(line, " HTTP")-line-6); + sprintf(status, "200 OK"); + } else + sprintf(status, "501 Not Implemented"); } } } else if (res == 0) { @@ -101,6 +124,7 @@ int _read(struct mansession *s, struct message *m) { strncpy(formdata, s->inbuf, clength); s->inlen = 0; pthread_mutex_unlock(&s->lock); + sprintf(status, "200 OK"); } } } @@ -108,17 +132,19 @@ int _read(struct mansession *s, struct message *m) { if (res < 0) break; - if (*method && *formdata) { - BuildHTTPHeader(header); - pthread_mutex_lock(&s->lock); - s->inputcomplete = 1; - ast_carefulwrite(s->fd, header, strlen(header), s->writetimeout); - pthread_mutex_unlock(&s->lock); - debugmsg("header: %s", header); + if (*status) { + HTTPHeader(s, status); /* now, let's transform and copy into a standard message block */ - res = ParseHTTPInput(formdata, m); - return res; + if (!strcmp("200 OK", status) ) { + res = ParseHTTPInput(formdata, m); + return res; + } else { + pthread_mutex_lock(&s->lock); + s->outputcomplete = 1; + pthread_mutex_unlock(&s->lock); + return 0; + } } } return -1; -- cgit