From 3ef788959b54c635638b84fd628fab7bfbbf1e46 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sat, 14 May 2011 01:52:20 +0200 Subject: [PATCH] lib: Moved parseresponse from htparser into lib for reusage. --- lib/req.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/req.h | 1 + src/htparser.c | 68 +--------------------------------------------------------- 3 files changed, 68 insertions(+), 67 deletions(-) diff --git a/lib/req.c b/lib/req.c index da8e3f0..662df0f 100644 --- a/lib/req.c +++ b/lib/req.c @@ -164,6 +164,72 @@ fail: return(-1); } +struct hthead *parseresponse(FILE *in) +{ + struct hthead *req; + int code; + struct charbuf ver, msg; + int c; + + req = NULL; + bufinit(ver); + bufinit(msg); + code = 0; + while(1) { + c = getc(in); + if(c == ' ') { + break; + } else if((c == EOF) || (c < 32) || (c >= 128)) { + goto fail; + } else { + bufadd(ver, c); + if(ver.d >= 128) + goto fail; + } + } + while(1) { + c = getc(in); + if(c == ' ') { + break; + } else if((c == EOF) || (c < '0') || (c > '9')) { + goto fail; + } else { + code = (code * 10) + (c - '0'); + if(code >= 10000) + goto fail; + } + } + while(1) { + c = getc(in); + if(c == 10) { + break; + } else if(c == 13) { + } else if((c == EOF) || (c < 32)) { + goto fail; + } else { + bufadd(msg, c); + if(msg.d >= 512) + goto fail; + } + } + bufadd(msg, 0); + bufadd(ver, 0); + req = mkresp(code, msg.b, ver.b); + if(parseheaders(req, in)) + goto fail; + goto out; + +fail: + if(req != NULL) { + freehthead(req); + req = NULL; + } +out: + buffree(msg); + buffree(ver); + return(req); +} + void replrest(struct hthead *head, char *rest) { char *tmp; diff --git a/lib/req.h b/lib/req.h index 752ff77..71a7a06 100644 --- a/lib/req.h +++ b/lib/req.h @@ -22,6 +22,7 @@ int sendreq(int sock, struct hthead *req, int fd); int recvreq(int sock, struct hthead **reqp); void replrest(struct hthead *head, char *rest); int parseheaders(struct hthead *head, FILE *in); +struct hthead *parseresponse(FILE *in); int writeresp(FILE *out, struct hthead *resp); char *unquoteurl(char *in); diff --git a/src/htparser.c b/src/htparser.c index bc8f7fd..a195fab 100644 --- a/src/htparser.c +++ b/src/htparser.c @@ -127,72 +127,6 @@ out: return(req); } -static struct hthead *parseresp(FILE *in) -{ - struct hthead *req; - int code; - struct charbuf ver, msg; - int c; - - req = NULL; - bufinit(ver); - bufinit(msg); - code = 0; - while(1) { - c = getc(in); - if(c == ' ') { - break; - } else if((c == EOF) || (c < 32) || (c >= 128)) { - goto fail; - } else { - bufadd(ver, c); - if(ver.d >= 128) - goto fail; - } - } - while(1) { - c = getc(in); - if(c == ' ') { - break; - } else if((c == EOF) || (c < '0') || (c > '9')) { - goto fail; - } else { - code = (code * 10) + (c - '0'); - if(code >= 10000) - goto fail; - } - } - while(1) { - c = getc(in); - if(c == 10) { - break; - } else if(c == 13) { - } else if((c == EOF) || (c < 32)) { - goto fail; - } else { - bufadd(msg, c); - if(msg.d >= 512) - goto fail; - } - } - bufadd(msg, 0); - bufadd(ver, 0); - req = mkresp(code, msg.b, ver.b); - if(parseheaders(req, in)) - goto fail; - goto out; - -fail: - if(req != NULL) { - freehthead(req); - req = NULL; - } -out: - buffree(msg); - buffree(ver); - return(req); -} - static off_t passdata(FILE *in, FILE *out, off_t max) { size_t read; @@ -318,7 +252,7 @@ void serve(FILE *in, struct conn *conn) /* Make sure to send EOF */ shutdown(pfds[1], SHUT_WR); - if((resp = parseresp(out)) == NULL) + if((resp = parseresponse(out)) == NULL) break; replstr(&resp->ver, req->ver); -- 2.11.0