src/server/daemon/sessionhandler.c

changeset 161
aadda87bad1b
parent 152
8b85c5face66
child 162
b169992137a8
equal deleted inserted replaced
160:389bd0e1ffa9 161:aadda87bad1b
40 #include "httplistener.h" 40 #include "httplistener.h"
41 41
42 typedef struct _event_http_io { 42 typedef struct _event_http_io {
43 HTTPRequest *request; 43 HTTPRequest *request;
44 HttpParser *parser; 44 HttpParser *parser;
45 int error;
46 } EventHttpIO; 45 } EventHttpIO;
47 46
48 47
49 int connection_read(Connection *conn, void *buf, int len) { 48 int connection_read(Connection *conn, void *buf, int len) {
50 return (int)read(conn->fd, buf, len); 49 return (int)read(conn->fd, buf, len);
211 if(io == NULL) { 210 if(io == NULL) {
212 // TODO: error handling 211 // TODO: error handling
213 } 212 }
214 io->request = request; 213 io->request = request;
215 io->parser = parser; 214 io->parser = parser;
216 io->error = 0;
217 215
218 /* 216 /*
219 * to start the request handling, we begin with a poll on the socket, 217 * to start the request handling, we begin with a poll on the socket,
220 * 218 *
221 * evt_enq_conn() --> event handler --> handle_request() 219 * evt_enq_conn() --> event handler --> handle_request()
222 */ 220 */
223 221
224 event_handler_t *ev = ((EventSessionHandler*)handler)->eventhandler; 222 event_handler_t *ev = ((EventSessionHandler*)handler)->eventhandler;
225 223
226 event_t *event = malloc(sizeof(event_t)); 224 event_t *event = malloc(sizeof(event_t));
227 ZERO(event, sizeof(event_t));
228 event->fn = evt_request_input; 225 event->fn = evt_request_input;
229 event->finish = evt_request_finish; 226 event->finish = evt_request_finish;
230 event->cookie = io; 227 event->cookie = io;
231 228
232 if(ev_pollin(ev, conn->fd, event) != 0) { 229 if(ev_pollin(ev, conn->fd, event) != 0) {
264 } 261 }
265 } 262 }
266 } 263 }
267 264
268 event->finish = evt_request_error; 265 event->finish = evt_request_error;
269 io->error = 1;
270 return 0; 266 return 0;
271 } 267 }
272 //fwrite(buf->inbuf + buf->pos, 1, r, stdout); 268 //fwrite(buf->inbuf + buf->pos, 1, r, stdout);
273 //printf("\n"); 269 //printf("\n");
274 270
276 state = http_parser_process(parser); 272 state = http_parser_process(parser);
277 if(state == 2) { 273 if(state == 2) {
278 // parse error 274 // parse error
279 fatal_error(request, 400); 275 fatal_error(request, 400);
280 event->finish = evt_request_error; 276 event->finish = evt_request_error;
281 io->error = 2;
282 return 0; 277 return 0;
283 } else if(state == 1) { 278 } else if(state == 1) {
284 /* 279 /*
285 * we need more data -> return 1 to tell the event handler to 280 * we need more data -> return 1 to tell the event handler to
286 * continue polling 281 * continue polling
297 flags = 0; 292 flags = 0;
298 } 293 }
299 if (fcntl(request->connection->fd, F_SETFL, flags & ~O_NONBLOCK) != 0) { 294 if (fcntl(request->connection->fd, F_SETFL, flags & ~O_NONBLOCK) != 0) {
300 // just close the connection if fcntl fails 295 // just close the connection if fcntl fails
301 event->finish = evt_request_error; 296 event->finish = evt_request_error;
302 io->error = 3;
303 return 0; 297 return 0;
304 } 298 }
305 299
306 /* 300 /*
307 * process request 301 * process request
336 free(event); 330 free(event);
337 331
338 return 0; 332 return 0;
339 } 333 }
340 334
341 int evt_request_error(event_handler_t *h, event_t *event) { 335 int evt_request_error(event_handler_t *h, event_t *event) {
342 EventHttpIO *io = event->cookie; 336 EventHttpIO *io = event->cookie;
343 HttpParser *parser = io->parser; 337 HttpParser *parser = io->parser;
344 HTTPRequest *request = io->request; 338 HTTPRequest *request = io->request;
345
346 if(event->error) {
347 log_ereport(LOG_VERBOSE, "sessionhandler http io error: %d", io->error);
348 }
349 339
350 free(request->netbuf->inbuf); 340 free(request->netbuf->inbuf);
351 free(request->netbuf); 341 free(request->netbuf);
352 342
353 cfg_unref(request->connection->listener->cfg); 343 cfg_unref(request->connection->listener->cfg);

mercurial