73 int get_start_line(HttpParser *parser) { |
75 int get_start_line(HttpParser *parser) { |
74 netbuf *buf = parser->request->netbuf; |
76 netbuf *buf = parser->request->netbuf; |
75 while(buf->pos < buf->cursize) { |
77 while(buf->pos < buf->cursize) { |
76 unsigned char c = buf->inbuf[buf->pos]; |
78 unsigned char c = buf->inbuf[buf->pos]; |
77 if(c == '\n') { |
79 if(c == '\n') { |
78 if(buf->pos <= 1) { |
80 size_t lnlen = buf->pos - parser->offset + 1; |
|
81 if(lnlen <= 2) { |
|
82 if(lnlen == 1 || buf->inbuf[buf->pos-1] == '\r') { |
|
83 // skip empty line |
|
84 buf->pos++; |
|
85 parser->offset = buf->pos; |
|
86 return 1; |
|
87 } |
79 // insufficient chars for request, return error |
88 // insufficient chars for request, return error |
80 return 2; |
89 return 2; |
81 } |
90 } |
82 if(buf->inbuf[buf->pos - 1] == '\r') { |
91 if(buf->inbuf[buf->pos - 1] == '\r') { |
83 parser->start_line.length = buf->pos; |
92 parser->start_line.length = lnlen - 1; |
84 } else { |
93 } else { |
85 parser->start_line.length = buf->pos + 1; |
94 parser->start_line.length = lnlen; |
86 } |
95 } |
87 parser->start_line.ptr = (char*)buf->inbuf; |
96 parser->start_line.ptr = (char*)buf->inbuf + parser->offset; |
88 buf->pos++; |
97 buf->pos++; |
89 return 0; |
98 return 0; |
90 } |
99 } |
91 buf->pos++; |
100 buf->pos++; |
92 } |
101 } |
96 int http_parser_parse_header(HttpParser *parser) { |
105 int http_parser_parse_header(HttpParser *parser) { |
97 netbuf *buf = parser->request->netbuf; |
106 netbuf *buf = parser->request->netbuf; |
98 |
107 |
99 parser->offset = buf->pos; // line offset |
108 parser->offset = buf->pos; // line offset |
100 parser->name.ptr = NULL; |
109 parser->name.ptr = NULL; |
|
110 parser->name.length = 0; |
101 parser->value.ptr = NULL; |
111 parser->value.ptr = NULL; |
|
112 parser->value.length = 0; |
102 while(1) { |
113 while(1) { |
103 if(buf->pos >= buf->cursize) { |
114 if(buf->pos >= buf->cursize) { |
104 return 1; |
115 return 1; |
105 } |
116 } |
106 char c = (char)buf->inbuf[buf->pos++]; |
117 char c = (char)buf->inbuf[buf->pos++]; |
107 |
118 |
108 if(c > 32) { |
119 if(c > 32) { |
109 parser->wl = 0; |
120 parser->wl = 0; |
110 if(c == ':' && parser->value.ptr == NULL) { |
121 if(c == ':' && parser->value.ptr == NULL) { |
111 parser->name.ptr = (char*)buf->inbuf + parser->offset; |
122 parser->name.ptr = (char*)buf->inbuf + parser->offset; |
112 buf->inbuf[buf->pos-1] = 0; |
123 parser->name.length = buf->pos - parser->offset - 1; |
113 } else if(parser->name.ptr != NULL && parser->value.ptr == NULL) { |
124 } else if(parser->name.ptr != NULL && parser->value.ptr == NULL) { |
114 parser->value.ptr = (char*)buf->inbuf + buf->pos - 1; |
125 parser->value.ptr = (char*)buf->inbuf + buf->pos - 1; |
115 } |
126 } |
116 } else if(c == '\n') { |
127 } else if(c == '\n') { |
117 if(parser->wl) { |
128 if(parser->wl) { |
119 parser->state++; |
130 parser->state++; |
120 return 0; |
131 return 0; |
121 } else { |
132 } else { |
122 parser->offset = buf->pos; |
133 parser->offset = buf->pos; |
123 if(parser->value.ptr != NULL) { |
134 if(parser->value.ptr != NULL) { |
124 buf->inbuf[buf->pos-1] = 0; |
135 parser->value.length = (buf->inbuf + buf->pos - 1) |
|
136 - (unsigned char*)parser->value.ptr; |
125 if(buf->inbuf[buf->pos-2] == '\r') { |
137 if(buf->inbuf[buf->pos-2] == '\r') { |
126 buf->inbuf[buf->pos-2] = 0; |
138 parser->value.length--; |
127 } |
139 } |
128 // add header |
140 // add header |
129 header_add( |
141 header_add( |
130 parser->request->headers, |
142 parser->request->headers, |
131 parser->name.ptr, |
143 parser->name, |
132 parser->value.ptr); |
144 parser->value); |
133 } else { |
145 } else { |
134 // error: no value |
146 // error: no value |
135 return 2; |
147 return 2; |
136 } |
148 } |
137 parser->name.ptr = NULL; |
149 parser->name.ptr = NULL; |
138 parser->value.ptr = NULL; |
150 parser->value.ptr = NULL; |
|
151 parser->name.length = 0; |
|
152 parser->value.length = 0; |
139 parser->wl = 1; |
153 parser->wl = 1; |
140 } |
154 } |
141 } |
155 } |
142 } |
156 } |
143 } |
157 } |