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 |