src/server/daemon/sessionhandler.c

changeset 47
ce9790523346
parent 46
636e05eb48f6
child 48
37a512d7b8f6
equal deleted inserted replaced
46:636e05eb48f6 47:ce9790523346
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29 #include <stdio.h> 29 #include <stdio.h>
30 #include <stdlib.h> 30 #include <stdlib.h>
31 #include <errno.h>
31 32
32 #include "../public/nsapi.h" 33 #include "../public/nsapi.h"
33 34
34 #include "sessionhandler.h" 35 #include "sessionhandler.h"
35 #include "httprequest.h" 36 #include "httprequest.h"
36 #include "httpparser.h" 37 #include "httpparser.h"
38 #include "log.h"
39 #include "error.h"
37 40
38 typedef struct _event_http_io { 41 typedef struct _event_http_io {
39 HTTPRequest *request; 42 HTTPRequest *request;
40 HttpParser *parser; 43 HttpParser *parser;
41 } EventHttpIO; 44 } EventHttpIO;
167 event->fn = evt_request_input; 170 event->fn = evt_request_input;
168 event->finish = evt_request_finish; 171 event->finish = evt_request_finish;
169 event->cookie = io; 172 event->cookie = io;
170 173
171 if(ev_pollin(ev, conn->fd, event) != 0) { 174 if(ev_pollin(ev, conn->fd, event) != 0) {
172 perror("poll"); 175 // TODO: ev_pollin should log, intercept some errors here
176 log_ereport(LOG_LEVEL_ERROR, "ev_pollin failed: %s", strerror(errno));
177 close(conn->fd);
178 // TODO: free stuff
173 } 179 }
174 } 180 }
175 181
176 int evt_request_input(event_handler_t *handler, event_t *event) { 182 int evt_request_input(event_handler_t *handler, event_t *event) {
177 EventHttpIO *io = event->cookie; 183 EventHttpIO *io = event->cookie;
184 r = read( 190 r = read(
185 request->connection->fd, 191 request->connection->fd,
186 buf->inbuf + buf->pos, 192 buf->inbuf + buf->pos,
187 buf->maxsize - buf->pos); 193 buf->maxsize - buf->pos);
188 if(r == -1) { 194 if(r == -1) {
189 // TODO: error handling 195 event->finish = evt_request_error;
190 fprintf(stderr, "%s\n", "Error: Cannot read from socket");
191 return 0; 196 return 0;
192 } 197 }
193 198
194 buf->cursize += r; 199 buf->cursize += r;
195 state = http_parser_process(parser); 200 state = http_parser_process(parser);
196 if(state == 2) { 201 if(state == 2) {
197 // TODO: error handling 202 // parse error
198 fprintf(stderr, "%s\n", "Error: Cannot parse http request"); 203 fatal_error(request, 400);
204 event->finish = evt_request_error;
199 return 0; 205 return 0;
200 } else if(state == 1) { 206 } else if(state == 1) {
201 /* 207 /*
202 * we need more data -> return 1 to tell the event handler to 208 * we need more data -> return 1 to tell the event handler to
203 * continue polling 209 * continue polling
211 int flags; 217 int flags;
212 if (-1 == (flags = fcntl(request->connection->fd, F_GETFL, 0))) { 218 if (-1 == (flags = fcntl(request->connection->fd, F_GETFL, 0))) {
213 flags = 0; 219 flags = 0;
214 } 220 }
215 if (fcntl(request->connection->fd, F_SETFL, flags & ~O_NONBLOCK) != 0) { 221 if (fcntl(request->connection->fd, F_SETFL, flags & ~O_NONBLOCK) != 0) {
216 perror("Error: evt_request_input: fcntl"); 222 // just close the connection if fcntl fails
217 // TODO: critical error 223 event->finish = evt_request_error;
224 return 0;
218 } 225 }
219 226
220 /* 227 /*
221 * process request 228 * process request
222 * 229 *
230 EventHttpIO *io = event->cookie; 237 EventHttpIO *io = event->cookie;
231 HttpParser *parser = io->parser; 238 HttpParser *parser = io->parser;
232 HTTPRequest *request = io->request; 239 HTTPRequest *request = io->request;
233 240
234 int r = handle_request(request, NULL); 241 int r = handle_request(request, NULL);
235 // TODO: if r != REQ_PROCEED ... 242 if(r != 0) {
243 // TODO: error message
244 close(request->connection->fd);
245 }
236 246
237 /* 247 /*
238 * handle_request can return before the request is finished, but it copies 248 * handle_request can return before the request is finished, but it copies
239 * all important data. We can free request, parser and event 249 * all important data. We can free request, parser and event
240 * 250 *
248 free(io); 258 free(io);
249 free(event); 259 free(event);
250 260
251 return 0; 261 return 0;
252 } 262 }
263
264 int evt_request_error(event_handler_t *h, event_t *event) {
265 EventHttpIO *io = event->cookie;
266 HttpParser *parser = io->parser;
267 HTTPRequest *request = io->request;
268
269 close(request->connection->fd);
270
271 header_array_free(request->headers);
272 free(request);
273
274 http_parser_free(parser);
275
276 free(io);
277 free(event);
278
279 return 0;
280 }

mercurial