26 * POSSIBILITY OF SUCH DAMAGE. |
26 * POSSIBILITY OF SUCH DAMAGE. |
27 */ |
27 */ |
28 |
28 |
29 #include <stdio.h> |
29 #include <stdio.h> |
30 #include <stdlib.h> |
30 #include <stdlib.h> |
|
31 #include <errno.h> |
31 |
32 |
32 #include "../public/nsapi.h" |
33 #include "../public/nsapi.h" |
33 |
34 |
34 #include "sessionhandler.h" |
35 #include "sessionhandler.h" |
35 #include "httprequest.h" |
36 #include "httprequest.h" |
36 #include "httpparser.h" |
37 #include "httpparser.h" |
|
38 #include "log.h" |
|
39 #include "error.h" |
37 |
40 |
38 typedef struct _event_http_io { |
41 typedef struct _event_http_io { |
39 HTTPRequest *request; |
42 HTTPRequest *request; |
40 HttpParser *parser; |
43 HttpParser *parser; |
41 } EventHttpIO; |
44 } EventHttpIO; |
167 event->fn = evt_request_input; |
170 event->fn = evt_request_input; |
168 event->finish = evt_request_finish; |
171 event->finish = evt_request_finish; |
169 event->cookie = io; |
172 event->cookie = io; |
170 |
173 |
171 if(ev_pollin(ev, conn->fd, event) != 0) { |
174 if(ev_pollin(ev, conn->fd, event) != 0) { |
172 perror("poll"); |
175 // TODO: ev_pollin should log, intercept some errors here |
|
176 log_ereport(LOG_LEVEL_ERROR, "ev_pollin failed: %s", strerror(errno)); |
|
177 close(conn->fd); |
|
178 // TODO: free stuff |
173 } |
179 } |
174 } |
180 } |
175 |
181 |
176 int evt_request_input(event_handler_t *handler, event_t *event) { |
182 int evt_request_input(event_handler_t *handler, event_t *event) { |
177 EventHttpIO *io = event->cookie; |
183 EventHttpIO *io = event->cookie; |
184 r = read( |
190 r = read( |
185 request->connection->fd, |
191 request->connection->fd, |
186 buf->inbuf + buf->pos, |
192 buf->inbuf + buf->pos, |
187 buf->maxsize - buf->pos); |
193 buf->maxsize - buf->pos); |
188 if(r == -1) { |
194 if(r == -1) { |
189 // TODO: error handling |
195 event->finish = evt_request_error; |
190 fprintf(stderr, "%s\n", "Error: Cannot read from socket"); |
|
191 return 0; |
196 return 0; |
192 } |
197 } |
193 |
198 |
194 buf->cursize += r; |
199 buf->cursize += r; |
195 state = http_parser_process(parser); |
200 state = http_parser_process(parser); |
196 if(state == 2) { |
201 if(state == 2) { |
197 // TODO: error handling |
202 // parse error |
198 fprintf(stderr, "%s\n", "Error: Cannot parse http request"); |
203 fatal_error(request, 400); |
|
204 event->finish = evt_request_error; |
199 return 0; |
205 return 0; |
200 } else if(state == 1) { |
206 } else if(state == 1) { |
201 /* |
207 /* |
202 * we need more data -> return 1 to tell the event handler to |
208 * we need more data -> return 1 to tell the event handler to |
203 * continue polling |
209 * continue polling |
211 int flags; |
217 int flags; |
212 if (-1 == (flags = fcntl(request->connection->fd, F_GETFL, 0))) { |
218 if (-1 == (flags = fcntl(request->connection->fd, F_GETFL, 0))) { |
213 flags = 0; |
219 flags = 0; |
214 } |
220 } |
215 if (fcntl(request->connection->fd, F_SETFL, flags & ~O_NONBLOCK) != 0) { |
221 if (fcntl(request->connection->fd, F_SETFL, flags & ~O_NONBLOCK) != 0) { |
216 perror("Error: evt_request_input: fcntl"); |
222 // just close the connection if fcntl fails |
217 // TODO: critical error |
223 event->finish = evt_request_error; |
|
224 return 0; |
218 } |
225 } |
219 |
226 |
220 /* |
227 /* |
221 * process request |
228 * process request |
222 * |
229 * |
230 EventHttpIO *io = event->cookie; |
237 EventHttpIO *io = event->cookie; |
231 HttpParser *parser = io->parser; |
238 HttpParser *parser = io->parser; |
232 HTTPRequest *request = io->request; |
239 HTTPRequest *request = io->request; |
233 |
240 |
234 int r = handle_request(request, NULL); |
241 int r = handle_request(request, NULL); |
235 // TODO: if r != REQ_PROCEED ... |
242 if(r != 0) { |
|
243 // TODO: error message |
|
244 close(request->connection->fd); |
|
245 } |
236 |
246 |
237 /* |
247 /* |
238 * handle_request can return before the request is finished, but it copies |
248 * handle_request can return before the request is finished, but it copies |
239 * all important data. We can free request, parser and event |
249 * all important data. We can free request, parser and event |
240 * |
250 * |