UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2013 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 #ifndef SESSIONHANDLER_H 30 #define SESSIONHANDLER_H 31 32 #include "../util/thrpool.h" 33 #include "../public/nsapi.h" 34 #include "../util/io.h" 35 #include "event.h" 36 37 #include <openssl/bio.h> 38 #include <openssl/ssl.h> 39 #include <openssl/err.h> 40 41 #ifdef __cplusplus 42 extern "C" { 43 #endif 44 45 typedef struct _session_handler SessionHandler; 46 typedef struct _connection Connection; 47 48 struct _connection { 49 int fd; 50 struct sockaddr_in address; 51 HttpListener *listener; 52 SessionHandler *session_handler; 53 SSL *ssl; 54 WSBool ssl_accepted; 55 int ssl_error; 56 int (*read)(Connection *conn, void *buf, int len); 57 int (*write)(Connection *conn, const void *buf, int len); 58 void (*close)(Connection *conn); 59 }; 60 61 typedef void(*enqueue_connection_f)(SessionHandler*, Connection*); 62 typedef void(*keep_alive_f)(SessionHandler*, Connection*); 63 struct _session_handler { 64 /* 65 * Adds a connection. The session handler starts reading and parsing the 66 * http request. After that its pass the request to the request handler 67 * (handle_request). 68 */ 69 void(*enqueue_connection)(SessionHandler *sh, Connection *conn); 70 71 /* 72 * Adds a connection to the keep-alive handler. The session handler 73 * waits for new data and re-enqueues the connection, if new data is 74 * available 75 */ 76 void(*keep_alive)(SessionHandler*, Connection *conn); 77 78 /* 79 * Creates an IOStream object for the connection 80 */ 81 IOStream*(*create_iostream)(SessionHandler *sh, Connection *conn, pool_handle_t *pool, WSBool *ssl); 82 }; 83 84 /* 85 * BasicSessionHandler 86 * 87 * The BasicSessionHandler enqueues the connections to a threadpool. IO is 88 * handled by the threadpool. 89 */ 90 typedef struct _basic_session_handler { 91 SessionHandler sh; 92 threadpool_t *threadpool; 93 94 } BasicSessionHandler; 95 96 /* 97 * EventSessionHandler 98 * 99 * The EventSessionHandler uses a event handler to handle request inputs. 100 */ 101 typedef struct _event_session_handler { 102 SessionHandler sh; 103 EVHandler *eventhandler; 104 } EventSessionHandler; 105 106 /* 107 * EventHttpIO 108 * 109 * defined in sesionhandler.c 110 */ 111 112 int connection_read(Connection *conn, void *buf, int len); 113 int connection_write(Connection *conn, const void *buf, int len); 114 void connection_close(Connection *conn); 115 int connection_ssl_read(Connection *conn, void *buf, int len); 116 int connection_ssl_write(Connection *conn, const void *buf, int len); 117 void connection_ssl_close(Connection *conn); 118 119 void connection_destroy(Connection *conn); 120 121 /* 122 * generic create_iostream function for BasicSessionHandler 123 * and EventSessionHandler 124 */ 125 IOStream* create_connection_iostream( 126 SessionHandler *sh, 127 Connection *conn, 128 pool_handle_t *pool, 129 WSBool *ssl); 130 131 132 SessionHandler* create_basic_session_handler(); 133 134 void basic_enq_conn(SessionHandler *handler, Connection *conn); 135 136 void* basic_run_session(void *data); 137 138 void basic_keep_alive(SessionHandler *handler, Connection *conn); 139 140 141 SessionHandler* create_event_session_handler(); 142 143 void evt_enq_conn(SessionHandler *handler, Connection *conn); 144 145 int evt_request_ssl_accept(EventHandler *handler, Event *event); 146 int evt_request_input(EventHandler *h, Event *event); 147 int evt_request_finish(EventHandler *h, Event *event); 148 int evt_request_error(EventHandler *h, Event *event); 149 150 void evt_keep_alive(SessionHandler *handler, Connection *conn); 151 152 153 #ifdef __cplusplus 154 } 155 #endif 156 157 #endif /* SESSIONHANDLER_H */ 158 159