Fri, 06 Feb 2026 14:06:04 +0100
refactor HttpParser to support parsing of Http responses
| 1 | 1 | /* |
| 2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | |
| 3 | * | |
|
44
3da1f7b6847f
added some error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
25
diff
changeset
|
4 | * Copyright 2013 Olaf Wintermann. All rights reserved. |
| 1 | 5 | * |
| 6 | * Redistribution and use in source and binary forms, with or without | |
| 7 | * modification, are permitted provided that the following conditions are met: | |
| 8 | * | |
| 9 | * 1. Redistributions of source code must retain the above copyright | |
| 10 | * notice, this list of conditions and the following disclaimer. | |
| 11 | * | |
| 12 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 13 | * notice, this list of conditions and the following disclaimer in the | |
| 14 | * documentation and/or other materials provided with the distribution. | |
| 15 | * | |
| 16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| 17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
| 20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
| 21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
| 22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
| 23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
| 24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
| 25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
| 26 | * POSSIBILITY OF SUCH DAMAGE. | |
| 27 | */ | |
| 28 | ||
| 29 | #include <stdio.h> | |
| 30 | #include <stdlib.h> | |
| 31 | ||
| 32 | #include "httpparser.h" | |
|
14
b8bf95b39952
New source folder layout
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
33 | #include "../public/nsapi.h" |
| 1 | 34 | //include "request.h" |
| 35 | ||
| 36 | ||
| 37 | HttpParser* http_parser_new(HTTPRequest *request) { | |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
38 | return http_parser_new2(0, request->netbuf, request->headers); |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
39 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
40 | |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
41 | HttpParser* http_parser_new2(int type, netbuf *netbuf, HeaderArray *headers) { |
|
183
f33974f0dce0
fixes http parser init
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
182
diff
changeset
|
42 | HttpParser *parser = calloc(1, sizeof(HttpParser)); |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
43 | parser->type = type; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
44 | parser->netbuf = netbuf; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
45 | parser->headers = headers; |
| 1 | 46 | |
| 47 | parser->state = 0; | |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
48 | parser->start_line.ptr = (char*)netbuf->inbuf; |
| 1 | 49 | parser->start_line.length = 0; |
|
101
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
50 | |
|
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
51 | parser->offset = 0; |
| 1 | 52 | |
| 53 | return parser; | |
| 54 | } | |
| 55 | ||
| 56 | void http_parser_free(HttpParser *parser) { | |
| 57 | free(parser); | |
| 58 | } | |
| 59 | ||
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
60 | void http_parser_update_request(HttpParser *parser, HTTPRequest *request) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
61 | request->method = parser->method; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
62 | request->uri = parser->uri; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
63 | request->httpv = parser->httpv; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
64 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
65 | |
| 1 | 66 | int http_parser_process(HttpParser *parser) { |
| 67 | switch(parser->state) { | |
| 68 | case 0: { | |
| 69 | int r = get_start_line(parser); | |
| 70 | switch(r) { | |
| 71 | case 0: break; | |
| 72 | default: return r; | |
| 73 | } | |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
74 | if(parser->type == 0) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
75 | if(parse_request_line(parser)) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
76 | return 2; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
77 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
78 | } else { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
79 | if(parse_response_line(parser)) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
80 | return 2; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
81 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
82 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
83 | |
| 1 | 84 | parser->state++; |
| 85 | } | |
| 86 | case 1: { | |
| 87 | return http_parser_parse_header(parser); | |
| 88 | } | |
| 89 | case 2: { | |
| 90 | return 0; | |
| 91 | } | |
| 92 | } | |
|
25
5dee29c7c530
Fixed config parser bug
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
20
diff
changeset
|
93 | return -1; |
| 1 | 94 | } |
| 95 | ||
|
180
98462e878ca7
fixes crash with broken http requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
163
diff
changeset
|
96 | int http_parser_validate(HttpParser *parser) { |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
97 | if(parser->type == 0) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
98 | if (!parser->method.ptr || parser->method.length == 0 |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
99 | || !parser->uri.ptr || parser->uri.length == 0 |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
100 | || !parser->httpv.ptr || parser->httpv.length == 0) |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
101 | { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
102 | return 0; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
103 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
104 | } else { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
105 | if (!parser->httpv.ptr || parser->httpv.length == 0 |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
106 | || !parser->msg.ptr || parser->msg.length == 0 |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
107 | || parser->status == 0) |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
108 | { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
109 | return 0; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
110 | } |
|
180
98462e878ca7
fixes crash with broken http requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
163
diff
changeset
|
111 | } |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
112 | |
|
180
98462e878ca7
fixes crash with broken http requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
163
diff
changeset
|
113 | return 1; |
|
98462e878ca7
fixes crash with broken http requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
163
diff
changeset
|
114 | } |
|
98462e878ca7
fixes crash with broken http requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
163
diff
changeset
|
115 | |
| 1 | 116 | int get_start_line(HttpParser *parser) { |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
117 | netbuf *buf = parser->netbuf; |
| 1 | 118 | while(buf->pos < buf->cursize) { |
| 119 | unsigned char c = buf->inbuf[buf->pos]; | |
| 120 | if(c == '\n') { | |
|
101
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
121 | size_t lnlen = buf->pos - parser->offset + 1; |
|
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
122 | if(lnlen <= 2) { |
|
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
123 | if(lnlen == 1 || buf->inbuf[buf->pos-1] == '\r') { |
|
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
124 | // skip empty line |
|
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
125 | buf->pos++; |
|
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
126 | parser->offset = buf->pos; |
|
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
127 | return 1; |
|
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
128 | } |
| 1 | 129 | // insufficient chars for request, return error |
| 130 | return 2; | |
| 131 | } | |
| 132 | if(buf->inbuf[buf->pos - 1] == '\r') { | |
|
101
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
133 | parser->start_line.length = lnlen - 1; |
| 1 | 134 | } else { |
|
101
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
135 | parser->start_line.length = lnlen; |
| 1 | 136 | } |
|
101
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
137 | parser->start_line.ptr = (char*)buf->inbuf + parser->offset; |
| 1 | 138 | buf->pos++; |
| 139 | return 0; | |
| 140 | } | |
| 141 | buf->pos++; | |
| 142 | } | |
| 143 | return 1; | |
| 144 | } | |
| 145 | ||
| 146 | int http_parser_parse_header(HttpParser *parser) { | |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
147 | netbuf *buf = parser->netbuf; |
| 1 | 148 | |
| 149 | parser->offset = buf->pos; // line offset | |
| 150 | parser->name.ptr = NULL; | |
|
101
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
151 | parser->name.length = 0; |
| 1 | 152 | parser->value.ptr = NULL; |
|
101
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
153 | parser->value.length = 0; |
| 1 | 154 | while(1) { |
| 155 | if(buf->pos >= buf->cursize) { | |
| 156 | return 1; | |
| 157 | } | |
| 158 | char c = (char)buf->inbuf[buf->pos++]; | |
| 159 | ||
| 160 | if(c > 32) { | |
| 161 | parser->wl = 0; | |
| 162 | if(c == ':' && parser->value.ptr == NULL) { | |
| 163 | parser->name.ptr = (char*)buf->inbuf + parser->offset; | |
|
101
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
164 | parser->name.length = buf->pos - parser->offset - 1; |
| 1 | 165 | } else if(parser->name.ptr != NULL && parser->value.ptr == NULL) { |
| 166 | parser->value.ptr = (char*)buf->inbuf + buf->pos - 1; | |
| 167 | } | |
| 168 | } else if(c == '\n') { | |
| 169 | if(parser->wl) { | |
| 170 | // line contains only white space -> end of request | |
| 171 | parser->state++; | |
| 172 | return 0; | |
| 173 | } else { | |
| 174 | parser->offset = buf->pos; | |
|
162
b169992137a8
improves cgi error handling and allows requests with empty headers
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
175 | if(parser->name.length != 0) { |
|
b169992137a8
improves cgi error handling and allows requests with empty headers
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
176 | if(parser->value.ptr) { |
|
b169992137a8
improves cgi error handling and allows requests with empty headers
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
177 | parser->value.length = (buf->inbuf + buf->pos - 1) |
|
101
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
178 | - (unsigned char*)parser->value.ptr; |
|
162
b169992137a8
improves cgi error handling and allows requests with empty headers
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
179 | if(buf->inbuf[buf->pos-2] == '\r') { |
|
b169992137a8
improves cgi error handling and allows requests with empty headers
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
180 | parser->value.length--; |
|
b169992137a8
improves cgi error handling and allows requests with empty headers
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
101
diff
changeset
|
181 | } |
|
163
3589ed579127
fixes empty headers
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
162
diff
changeset
|
182 | } else { |
|
3589ed579127
fixes empty headers
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
162
diff
changeset
|
183 | parser->value.ptr = ""; |
|
20
7b235fa88008
Some fixes for mod_jk
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
14
diff
changeset
|
184 | } |
| 1 | 185 | // add header |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
186 | header_array_add( |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
187 | parser->headers, |
|
101
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
188 | parser->name, |
|
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
189 | parser->value); |
| 1 | 190 | } else { |
| 191 | // error: no value | |
| 192 | return 2; | |
| 193 | } | |
| 194 | parser->name.ptr = NULL; | |
| 195 | parser->value.ptr = NULL; | |
|
101
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
196 | parser->name.length = 0; |
|
7fbcdbad0baa
added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
44
diff
changeset
|
197 | parser->value.length = 0; |
| 1 | 198 | parser->wl = 1; |
| 199 | } | |
| 200 | } | |
| 201 | } | |
| 202 | } | |
| 203 | ||
| 204 | int parse_request_line(HttpParser *parser) { | |
|
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
351
diff
changeset
|
205 | cxmutstr line = parser->start_line; |
| 1 | 206 | |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
207 | // parse method, url and http version |
| 1 | 208 | |
| 209 | int i = 0; | |
| 210 | int ns = 0; | |
| 211 | ||
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
212 | parser->method.ptr = line.ptr; |
| 1 | 213 | for(;i<line.length;i++) { |
| 214 | if(!ns && line.ptr[i] == ' ') { | |
| 215 | ns = 1; | |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
216 | parser->method.length = i; |
| 1 | 217 | } else if(ns) { |
| 218 | if(line.ptr[i] != ' ') { | |
| 219 | break; | |
| 220 | } | |
| 221 | } | |
| 222 | } | |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
223 | if(i == line.length) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
224 | return 1; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
225 | } |
| 1 | 226 | |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
227 | parser->uri.ptr = line.ptr + i; |
| 1 | 228 | ns = 0; |
| 229 | int s = i; | |
| 230 | for(;i<line.length;i++) { | |
|
351
5533db9b64e2
fix parse_request_line not detecting the uri correctly in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
183
diff
changeset
|
231 | if(!ns && isspace(line.ptr[i])) { |
| 1 | 232 | ns = 1; |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
233 | parser->uri.length = i - s; |
| 1 | 234 | } else if(ns) { |
| 235 | if(line.ptr[i] > 32) { | |
| 236 | break; | |
| 237 | } | |
| 238 | } | |
| 239 | } | |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
240 | if(i == line.length) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
241 | return 1; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
242 | } |
| 1 | 243 | |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
244 | parser->httpv.ptr = line.ptr + i; |
| 1 | 245 | ns = 0; |
| 246 | s = i; | |
| 247 | for(;i<line.length;i++) { | |
|
351
5533db9b64e2
fix parse_request_line not detecting the uri correctly in some cases
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
183
diff
changeset
|
248 | if(!ns && isspace(line.ptr[i])) { |
| 1 | 249 | ns = 1; |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
250 | parser->httpv.length = i - s; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
251 | } else if(ns) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
252 | if(line.ptr[i] > 32) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
253 | return 1; // non-whitespace char after httpv |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
254 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
255 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
256 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
257 | |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
258 | return 0; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
259 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
260 | |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
261 | int parse_response_line(HttpParser *parser) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
262 | cxmutstr line = parser->start_line; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
263 | |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
264 | // parse http version, status num, status message |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
265 | |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
266 | int i = 0; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
267 | int ns = 0; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
268 | |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
269 | parser->httpv.ptr = line.ptr; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
270 | for(;i<line.length;i++) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
271 | if(!ns && line.ptr[i] == ' ') { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
272 | ns = 1; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
273 | parser->httpv.length = i; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
274 | } else if(ns) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
275 | if(line.ptr[i] != ' ') { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
276 | break; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
277 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
278 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
279 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
280 | |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
281 | ns = 0; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
282 | int s = i; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
283 | cxmutstr num_str; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
284 | num_str.ptr = line.ptr + i; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
285 | num_str.length = 0; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
286 | for(;i<line.length;i++) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
287 | if(!ns && isspace(line.ptr[i])) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
288 | ns = 1; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
289 | num_str.length = i - s; |
| 1 | 290 | } else if(ns) { |
| 291 | if(line.ptr[i] > 32) { | |
| 292 | break; | |
| 293 | } | |
| 294 | } | |
| 295 | } | |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
296 | |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
297 | if(num_str.length != 3) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
298 | return 1; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
299 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
300 | if(cx_strtoi(num_str, &parser->status, 10)) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
301 | return 1; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
302 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
303 | |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
304 | parser->msg.ptr = line.ptr + i; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
305 | ns = 1; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
306 | s = i; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
307 | for(;i<line.length;i++) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
308 | char c = line.ptr[i]; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
309 | if(ns && c < 33) { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
310 | parser->msg.length = i - s; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
311 | ns = 0; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
312 | } else { |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
313 | ns = 1; |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
314 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
315 | } |
|
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
316 | |
| 1 | 317 | return 0; |
| 318 | } | |
|
662
70fdf948b642
refactor HttpParser to support parsing of Http responses
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
319 |