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 HTTPLISTENER_H 30 #define HTTPLISTENER_H 31 32 #include "sessionhandler.h" 33 #include "threadpools.h" 34 #include "config.h" 35 #include "../util/systems.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 /* HttpListener typedef in nsapi.h */ 46 typedef struct _acceptor Acceptor; 47 typedef struct _listener_config ListenerConfig; 48 typedef struct _http_ssl HttpSSL; 49 50 51 52 53 union vs { 54 VirtualServer *vs; 55 char *vs_name; 56 }; 57 struct _listener_config { 58 ServerConfiguration *cfg; 59 sstr_t name; 60 sstr_t vs; 61 sstr_t threadpool; 62 char *address; 63 int port; 64 int nacceptors; 65 WSBool blockingio; 66 WSBool ssl; 67 sstr_t certfile; 68 sstr_t privkeyfile; 69 sstr_t chainfile; 70 sstr_t disable_proto; 71 }; 72 73 struct _acceptor { 74 pthread_t tid; 75 HttpListener *listener; 76 }; 77 78 struct _http_listener { 79 ServerConfiguration *cfg; 80 sstr_t name; 81 union vs default_vs; 82 int port; 83 int server_socket; 84 SessionHandler *session_handler; 85 threadpool_t *threadpool; 86 HttpListener *next; 87 Acceptor **acceptors; 88 int nacceptors; 89 int running; 90 HttpSSL *ssl; 91 uint32_t ref; // reference counter 92 }; 93 94 struct _http_ssl { 95 unsigned char *cert; 96 size_t certlen; 97 unsigned char *privkey; 98 size_t privkeylen; 99 unsigned char *chain; 100 size_t chainlen; 101 102 SSL_CTX *sslctx; 103 104 // TODO: ssl/tls cipher, ... config 105 }; 106 107 int start_all_listener(); 108 109 HttpListener* http_listener_create(ListenerConfig *conf); 110 111 // used by http_listener_create 112 HttpListener* http_listener_new(ListenerConfig *conf); 113 114 int http_listener_start(HttpListener *listener); 115 116 void http_listener_ref(HttpListener *listener); 117 void http_listener_unref(HttpListener *listener); 118 119 Acceptor* acceptor_new(HttpListener *listener); 120 121 void acceptor_start(Acceptor *a); 122 123 void* acceptor_thread(Acceptor *a); 124 125 126 #ifdef __cplusplus 127 } 128 #endif 129 130 #endif /* HTTPLISTENER_H */ 131 132