56 } |
56 } |
57 |
57 |
58 void* basic_run_session(void *data) { |
58 void* basic_run_session(void *data) { |
59 Connection *conn = (Connection*)data; |
59 Connection *conn = (Connection*)data; |
60 |
60 |
61 HTTPRequest *request = http_request_new(); |
61 HTTPRequest request; |
62 request->connection = conn; |
62 http_request_init(&request); |
|
63 request.connection = conn; |
63 |
64 |
64 // read request |
65 // read request |
65 netbuf *buf = malloc(sizeof(netbuf)); |
66 netbuf *buf = malloc(sizeof(netbuf)); |
66 buf->rdtimeout = 120; |
67 buf->rdtimeout = 120; |
67 buf->pos = 0; |
68 buf->pos = 0; |
69 buf->maxsize = 2048; |
70 buf->maxsize = 2048; |
70 buf->sd = &conn->fd; |
71 buf->sd = &conn->fd; |
71 buf->inbuf = malloc(2048); |
72 buf->inbuf = malloc(2048); |
72 buf->errmsg = NULL; |
73 buf->errmsg = NULL; |
73 |
74 |
74 request->netbuf = buf; |
75 request.netbuf = buf; |
75 |
76 |
76 HttpParser *parser = http_parser_new(request); |
77 HttpParser *parser = http_parser_new(&request); |
77 int state; |
78 int state; |
78 int r; |
79 int r; |
79 r = read(conn->fd, buf->inbuf + buf->pos, buf->maxsize - buf->pos); |
80 r = read(conn->fd, buf->inbuf + buf->pos, buf->maxsize - buf->pos); |
80 if(r == -1) { |
81 if(r == -1) { |
81 // TODO: error handling |
82 // TODO: error handling |
113 handler->sh.enqueue_connection = evt_enq_conn; |
115 handler->sh.enqueue_connection = evt_enq_conn; |
114 return (SessionHandler*)handler; |
116 return (SessionHandler*)handler; |
115 } |
117 } |
116 |
118 |
117 void evt_enq_conn(SessionHandler *handler, Connection *conn) { |
119 void evt_enq_conn(SessionHandler *handler, Connection *conn) { |
118 HTTPRequest *request = http_request_new(); |
120 HTTPRequest *request = malloc(sizeof(HTTPRequest)); |
|
121 http_request_init(request); |
119 request->connection = conn; |
122 request->connection = conn; |
|
123 conn->session_handler = handler; |
120 |
124 |
121 // set socket non blocking |
125 // set socket non blocking |
122 int flags; |
126 int flags; |
123 if (-1 == (flags = fcntl(conn->fd, F_GETFL, 0))) { |
127 if (-1 == (flags = fcntl(conn->fd, F_GETFL, 0))) { |
124 flags = 0; |
128 flags = 0; |
159 |
163 |
160 event_handler_t *ev = ((EventSessionHandler*)handler)->eventhandler; |
164 event_handler_t *ev = ((EventSessionHandler*)handler)->eventhandler; |
161 |
165 |
162 event_t *event = malloc(sizeof(event_t)); |
166 event_t *event = malloc(sizeof(event_t)); |
163 event->fn = evt_request_input; |
167 event->fn = evt_request_input; |
|
168 event->finish = evt_request_finish; |
164 event->cookie = io; |
169 event->cookie = io; |
165 |
170 |
166 if(ev_pollin(ev, conn->fd, event) != 0) { |
171 if(ev_pollin(ev, conn->fd, event) != 0) { |
167 perror("poll"); |
172 perror("poll"); |
168 } |
173 } |
209 } |
214 } |
210 if (fcntl(request->connection->fd, F_SETFL, flags & ~O_NONBLOCK) != 0) { |
215 if (fcntl(request->connection->fd, F_SETFL, flags & ~O_NONBLOCK) != 0) { |
211 perror("Error: evt_request_input: fcntl"); |
216 perror("Error: evt_request_input: fcntl"); |
212 // TODO: critical error |
217 // TODO: critical error |
213 } |
218 } |
214 |
219 |
215 // process request |
220 /* |
216 r = handle_request(request, NULL); |
221 * process request |
217 |
222 * |
218 return 0; // TODO: return before handle_request |
223 * We return 0 to finish request input. The event handler than stops |
219 } |
224 * polling and executes event->finish (evt_request_input_finish) |
|
225 */ |
|
226 return 0; |
|
227 } |
|
228 |
|
229 int evt_request_finish(event_handler_t *h, event_t *event) { |
|
230 EventHttpIO *io = event->cookie; |
|
231 HttpParser *parser = io->parser; |
|
232 HTTPRequest *request = io->request; |
|
233 |
|
234 int r = handle_request(request, NULL); |
|
235 // TODO: if r != REQ_PROCEED ... |
|
236 |
|
237 /* |
|
238 * handle_request can return before the request is finished, but it copies |
|
239 * all important data. We can free request, parser and event |
|
240 * |
|
241 * don't free request->netbuf and request->connection |
|
242 */ |
|
243 header_array_free(request->headers); |
|
244 free(request); |
|
245 |
|
246 http_parser_free(parser); |
|
247 |
|
248 free(io); |
|
249 free(event); |
|
250 |
|
251 return 0; |
|
252 } |