src/server/daemon/sessionhandler.c

changeset 46
636e05eb48f6
parent 44
3da1f7b6847f
child 47
ce9790523346
equal deleted inserted replaced
45:a24aa388f02f 46:636e05eb48f6
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
97 } 98 }
98 buf->cursize += r; 99 buf->cursize += r;
99 } 100 }
100 101
101 // process request 102 // process request
102 r = handle_request(request, NULL); // TODO: use correct thread pool 103 r = handle_request(&request, NULL); // TODO: use correct thread pool
103 104
105 // TODO: free, see evt_request_finish
104 106
105 return NULL; 107 return NULL;
106 } 108 }
107 109
108 /* ----- event session handler ----- */ 110 /* ----- event session handler ----- */
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 }

mercurial