src/server/daemon/sessionhandler.c

changeset 14
b8bf95b39952
parent 1
3c066d52342d
child 35
4417619a9bbd
equal deleted inserted replaced
13:1fdbf4170ef4 14:b8bf95b39952
1 /*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3 *
4 * Copyright 2011 Olaf Wintermann. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include <stdio.h>
30 #include <stdlib.h>
31
32 #include "../public/nsapi.h"
33
34 #include "sessionhandler.h"
35 #include "httprequest.h"
36 #include "httpparser.h"
37
38 SessionHandler* create_basic_session_handler() {
39 BasicSessionHandler *handler = malloc(sizeof(BasicSessionHandler));
40 handler->threadpool = threadpool_new(8);
41 handler->sh.enqueue_connection = basic_enq_conn;
42
43
44 return (SessionHandler*)handler;
45 }
46
47 void basic_enq_conn(SessionHandler *handler, Connection *conn) {
48 BasicSessionHandler *sh = (BasicSessionHandler*)handler;
49 conn->session_handler = handler;
50 threadpool_run(sh->threadpool, basic_run_session, conn);
51 }
52
53 void* basic_run_session(void *data) {
54 Connection *conn = (Connection*)data;
55
56 HTTPRequest *request = http_request_new();
57 request->connection = conn;
58
59 // read request
60 netbuf *buf = malloc(sizeof(netbuf));
61 buf->rdtimeout = 120;
62 buf->pos = 0;
63 buf->cursize = 0;
64 buf->maxsize = 2048;
65 buf->sd = &conn->fd;
66 buf->inbuf = malloc(2048);
67 buf->errmsg = NULL;
68
69 request->netbuf = buf;
70
71 HttpParser *parser = http_parser_new(request);
72 int state;
73 int r;
74 r = read(conn->fd, buf->inbuf + buf->pos, buf->maxsize - buf->pos);
75 if(r == -1) {
76 // TODO: error handling
77 fprintf(stderr, "%s\n", "Error: Cannot read from socket");
78 return NULL;
79 }
80 buf->cursize += r;
81 while((state = http_parser_process(parser)) != 0) {
82 if(state == 2) {
83 // TODO: error handling
84 fprintf(stderr, "%s\n", "Error: Cannot parse http request");
85 return NULL;
86 }
87 r = read(conn->fd, buf->inbuf + buf->pos, buf->maxsize - buf->pos);
88 if(r == -1) {
89 // TODO: error handling
90 fprintf(stderr, "%s\n", "Error: Cannot read from socket");
91 return NULL;
92 }
93 buf->cursize += r;
94 }
95
96 // process request
97 r = handle_request(request);
98
99
100 return NULL;
101 }
102
103

mercurial