src/server/daemon/sessionhandler.c

branch
aio
changeset 159
9ba9f8befa80
parent 152
8b85c5face66
child 188
0e6a05c779e0
equal deleted inserted replaced
157:a0c8e752490d 159:9ba9f8befa80
38 #include "log.h" 38 #include "log.h"
39 #include "error.h" 39 #include "error.h"
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; 45 int error;
46 } EventHttpIO; 46 } EventHttpIO;
47 47
48 48
49 int connection_read(Connection *conn, void *buf, int len) { 49 int connection_read(Connection *conn, void *buf, int len) {
50 return (int)read(conn->fd, buf, len); 50 return (int)read(conn->fd, buf, len);
151 } 151 }
152 buf->cursize += r; 152 buf->cursize += r;
153 } 153 }
154 154
155 // process request 155 // process request
156 r = handle_request(&request, NULL); // TODO: use correct thread pool 156 r = handle_request(&request, NULL, NULL); // TODO: use correct thread pool
157 157
158 // TODO: free, see evt_request_finish 158 // TODO: free, see evt_request_finish
159 159
160 return NULL; 160 return NULL;
161 } 161 }
219 * to start the request handling, we begin with a poll on the socket, 219 * to start the request handling, we begin with a poll on the socket,
220 * 220 *
221 * evt_enq_conn() --> event handler --> handle_request() 221 * evt_enq_conn() --> event handler --> handle_request()
222 */ 222 */
223 223
224 event_handler_t *ev = ((EventSessionHandler*)handler)->eventhandler; 224 Event *event = malloc(sizeof(Event));
225 225 ZERO(event, sizeof(Event));
226 event_t *event = malloc(sizeof(event_t));
227 ZERO(event, sizeof(event_t));
228 event->fn = evt_request_input; 226 event->fn = evt_request_input;
229 event->finish = evt_request_finish; 227 event->finish = evt_request_finish;
230 event->cookie = io; 228 event->cookie = io;
229
230 EventHandler *ev = ev_instance(((EventSessionHandler*)handler)->eventhandler);
231 231
232 if(ev_pollin(ev, conn->fd, event) != 0) { 232 if(ev_pollin(ev, conn->fd, event) != 0) {
233 // TODO: ev_pollin should log, intercept some errors here 233 // TODO: ev_pollin should log, intercept some errors here
234 log_ereport(LOG_FAILURE, "Cannot enqueue connection"); 234 log_ereport(LOG_FAILURE, "Cannot enqueue connection");
235 connection_destroy(conn); 235 connection_destroy(conn);
236 // TODO: free stuff 236 // TODO: free stuff
237 } 237 }
238 } 238 }
239 239
240 int evt_request_input(event_handler_t *handler, event_t *event) { 240 int evt_request_input(EventHandler *handler, Event *event) {
241 EventHttpIO *io = event->cookie; 241 EventHttpIO *io = event->cookie;
242 HttpParser *parser = io->parser; 242 HttpParser *parser = io->parser;
243 HTTPRequest *request = io->request; 243 HTTPRequest *request = io->request;
244 Connection *conn = io->request->connection; 244 Connection *conn = io->request->connection;
245 netbuf *buf = request->netbuf; 245 netbuf *buf = request->netbuf;
253 if(r <= 0) { 253 if(r <= 0) {
254 if(conn->ssl) { 254 if(conn->ssl) {
255 // SSL specific error handling 255 // SSL specific error handling
256 switch(conn->ssl_error) { 256 switch(conn->ssl_error) {
257 case SSL_ERROR_WANT_READ: { 257 case SSL_ERROR_WANT_READ: {
258 event->poll = EVENT_POLLIN; 258 event->events = EVENT_POLLIN;
259 return 1; 259 return 1;
260 } 260 }
261 case SSL_ERROR_WANT_WRITE: { 261 case SSL_ERROR_WANT_WRITE: {
262 event->poll = EVENT_POLLOUT; 262 event->events = EVENT_POLLOUT;
263 return 1; 263 return 1;
264 } 264 }
265 } 265 }
266 } 266 }
267 267
283 } else if(state == 1) { 283 } else if(state == 1) {
284 /* 284 /*
285 * we need more data -> return 1 to tell the event handler to 285 * we need more data -> return 1 to tell the event handler to
286 * continue polling 286 * continue polling
287 */ 287 */
288 event->poll = EVENT_POLLIN; 288 event->events = EVENT_POLLIN;
289 return 1; 289 return 1;
290 } 290 }
291 291
292 // we are done with reading 292 // we are done with reading
293 293
310 * polling and executes event->finish (evt_request_input_finish) 310 * polling and executes event->finish (evt_request_input_finish)
311 */ 311 */
312 return 0; 312 return 0;
313 } 313 }
314 314
315 int evt_request_finish(event_handler_t *h, event_t *event) { 315 int evt_request_finish(EventHandler *h, Event *event) {
316 EventHttpIO *io = event->cookie; 316 EventHttpIO *io = event->cookie;
317 HttpParser *parser = io->parser; 317 HttpParser *parser = io->parser;
318 HTTPRequest *request = io->request; 318 HTTPRequest *request = io->request;
319 319
320 int r = handle_request(request, NULL); 320 int r = handle_request(request, NULL, h);
321 if(r != 0) { 321 if(r != 0) {
322 // TODO: error message 322 // TODO: error message
323 close(request->connection->fd); 323 close(request->connection->fd);
324 } 324 }
325 325
336 free(event); 336 free(event);
337 337
338 return 0; 338 return 0;
339 } 339 }
340 340
341 int evt_request_error(event_handler_t *h, event_t *event) { 341 int evt_request_error(EventHandler *h, Event *event) {
342 EventHttpIO *io = event->cookie; 342 EventHttpIO *io = event->cookie;
343 HttpParser *parser = io->parser; 343 HttpParser *parser = io->parser;
344 HTTPRequest *request = io->request; 344 HTTPRequest *request = io->request;
345 345
346 if(event->error) { 346 if(event->error) {

mercurial