diff options
author | Luigi Rizzo <rizzo@icir.org> | 2006-10-08 22:20:35 +0000 |
---|---|---|
committer | Luigi Rizzo <rizzo@icir.org> | 2006-10-08 22:20:35 +0000 |
commit | 36e4f62e7cce1523c2799a31b645542da919577c (patch) | |
tree | 6b6694241245d380962e6018013d2a4e0ee081f6 /channels | |
parent | b90f91c3b40770effa6fd61c6654129ed2ad345f (diff) |
Simplify function parse_request() using a single loop instead
of two very similar ones.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@44747 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 91 |
1 files changed, 32 insertions, 59 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index f8f499298..a2356bcfe 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -4393,70 +4393,43 @@ static int lws2sws(char *msgbuf, int len) */ static void parse_request(struct sip_request *req) { - /* Divide fields by NULL's */ - char *c; - int f = 0; - - c = req->data; - - /* First header starts immediately */ - req->header[f] = c; - while(*c) { - if (*c == '\n') { - /* We've got a new header */ - *c = 0; + char *c = req->data, **dst = req->header; + int i = 0, lim = SIP_MAX_HEADERS - 1; + req->header[0] = c; + req->headers = -1; /* mark that we are working on the header */ + for (; *c; c++) { + if (*c == '\r') /* remove \r */ + *c = '\0'; + else if (*c == '\n') { /* end of this line */ + *c = '\0'; if (sipdebug && option_debug > 3) - ast_log(LOG_DEBUG, "Header %d: %s (%d)\n", f, req->header[f], (int) strlen(req->header[f])); - if (ast_strlen_zero(req->header[f])) { - /* Line by itself means we're now in content */ - c++; - break; + ast_log(LOG_DEBUG, "%7s %2d [%3d]: %s\n", + req->headers < 0 ? "Header" : "Body", + i, strlen(dst[i]), dst[i]); + if (ast_strlen_zero(dst[i]) && req->headers < 0) { + req->headers = i; /* record number of header lines */ + dst = req->line; /* start working on the body */ + i = 0; + lim = SIP_MAX_LINES - 1; + } else { /* move to next line, check for overflows */ + if (i++ >= lim) + break; } - if (f >= SIP_MAX_HEADERS - 1) { - ast_log(LOG_WARNING, "Too many SIP headers. Ignoring.\n"); - } else - f++; - req->header[f] = c + 1; - } else if (*c == '\r') { - /* Ignore but eliminate \r's */ - *c = 0; + dst[i] = c + 1; /* record start of next line */ } - c++; + } + /* update count of header or body lines */ + if (req->headers >= 0) /* we are in the body */ + req->lines = i; + else { /* no body */ + req->headers = i; + req->lines = 0; + req->line[0] = ""; } - /* Check for last header */ - if (!ast_strlen_zero(req->header[f])) { - if (sipdebug && option_debug > 3) - ast_log(LOG_DEBUG, "Header %d: %s (%d)\n", f, req->header[f], (int) strlen(req->header[f])); - f++; - } - req->headers = f; - /* Now we process any mime content */ - f = 0; - req->line[f] = c; - while(*c) { - if (*c == '\n') { - /* We've got a new line */ - *c = 0; - if (sipdebug && option_debug > 3) - ast_log(LOG_DEBUG, "Line: %s (%d)\n", req->line[f], (int) strlen(req->line[f])); - if (f >= SIP_MAX_LINES - 1) { - ast_log(LOG_WARNING, "Too many SDP lines. Ignoring.\n"); - } else - f++; - req->line[f] = c + 1; - } else if (*c == '\r') { - /* Ignore and eliminate \r's */ - *c = 0; - } - c++; - } - /* Check for last line */ - if (!ast_strlen_zero(req->line[f])) - f++; - req->lines = f; - if (*c) - ast_log(LOG_WARNING, "Odd content, extra stuff left over ('%s')\n", c); + + if (*c) + ast_log(LOG_WARNING, "Too many lines, skipping <%s>\n", c); /* Split up the first line parts */ determine_firstline_parts(req); } |