src/server/daemon/sessionhandler.c

changeset 114
c3a0f1275d71
parent 106
b122f34ddc80
child 128
288fd9b9a739
equal deleted inserted replaced
113:57e706fed20a 114:c3a0f1275d71
68 void connection_ssl_close(Connection *conn) { 68 void connection_ssl_close(Connection *conn) {
69 SSL_shutdown(conn->ssl); 69 SSL_shutdown(conn->ssl);
70 close(conn->fd); 70 close(conn->fd);
71 } 71 }
72 72
73 void connection_destroy(Connection *conn) {
74 if(conn->ssl) {
75 SSL_free(conn->ssl);
76 }
77 conn->close(conn);
78
79 free(conn);
80 }
81
73 SessionHandler* create_basic_session_handler() { 82 SessionHandler* create_basic_session_handler() {
74 BasicSessionHandler *handler = malloc(sizeof(BasicSessionHandler)); 83 BasicSessionHandler *handler = malloc(sizeof(BasicSessionHandler));
75 handler->threadpool = threadpool_new(4, 8); 84 handler->threadpool = threadpool_new(4, 8);
76 handler->sh.enqueue_connection = basic_enq_conn; 85 handler->sh.enqueue_connection = basic_enq_conn;
77 handler->sh.keep_alive = basic_keep_alive; 86 handler->sh.keep_alive = basic_keep_alive;
106 115
107 HttpParser *parser = http_parser_new(&request); 116 HttpParser *parser = http_parser_new(&request);
108 int state; 117 int state;
109 int r; 118 int r;
110 r = conn->read(conn, buf->inbuf + buf->pos, buf->maxsize - buf->pos); 119 r = conn->read(conn, buf->inbuf + buf->pos, buf->maxsize - buf->pos);
111 if(r == -1) { 120 if(r <= 0) {
112 // TODO: error handling 121 // TODO: error handling
113 fprintf(stderr, "%s\n", "Error: Cannot read from socket"); 122 fprintf(stderr, "%s\n", "Error: Cannot read from socket");
114 return NULL; 123 return NULL;
115 } 124 }
116 buf->cursize += r; 125 buf->cursize += r;
223 int r; 232 int r;
224 r = conn->read( 233 r = conn->read(
225 conn, 234 conn,
226 buf->inbuf + buf->pos, 235 buf->inbuf + buf->pos,
227 buf->maxsize - buf->pos); 236 buf->maxsize - buf->pos);
228 if(r == -1) { 237 if(r <= 0) {
229 event->finish = evt_request_error; 238 event->finish = evt_request_error;
230 return 0; 239 return 0;
231 } 240 }
232 //fwrite(buf->inbuf + buf->pos, 1, r, stdout); 241 //fwrite(buf->inbuf + buf->pos, 1, r, stdout);
233 //printf("\n"); 242 //printf("\n");
284 * handle_request can return before the request is finished, but it copies 293 * handle_request can return before the request is finished, but it copies
285 * all important data. We can free request, parser and event 294 * all important data. We can free request, parser and event
286 * 295 *
287 * don't free request->netbuf and request->connection 296 * don't free request->netbuf and request->connection
288 */ 297 */
289 header_array_free(request->headers); 298 http_request_cleanup(request);
290 free(request);
291
292 http_parser_free(parser); 299 http_parser_free(parser);
293 300
294 free(io); 301 free(io);
295 free(event); 302 free(event);
296 303
300 int evt_request_error(event_handler_t *h, event_t *event) { 307 int evt_request_error(event_handler_t *h, event_t *event) {
301 EventHttpIO *io = event->cookie; 308 EventHttpIO *io = event->cookie;
302 HttpParser *parser = io->parser; 309 HttpParser *parser = io->parser;
303 HTTPRequest *request = io->request; 310 HTTPRequest *request = io->request;
304 311
305 close(request->connection->fd); 312 free(request->netbuf->inbuf);
313 free(request->netbuf);
314
306 cfg_unref(request->connection->listener->cfg); 315 cfg_unref(request->connection->listener->cfg);
307 316 connection_destroy(request->connection);
308 header_array_free(request->headers); 317
309 free(request); 318 http_request_cleanup(request);
310
311 http_parser_free(parser); 319 http_parser_free(parser);
312 320
313 free(io); 321 free(io);
314 free(event); 322 free(event);
315 323

mercurial