/* __ _ * ____ / /_ ____ ___ __ ___________ _(_) * / __ \/ __ \/ __ `__ \/ / / / ___/ __ `/ / * / /_/ / / / / / / / / / /_/ / /__/ /_/ / / * \____/_/ /_/_/ /_/ /_/\__, /\___/\__, /_/ * /____/ /____/ * * SPDX-License-Identifier: BSD-2-Clause-FreeBSD * * Copyright (c) 2021, Max Christian Pohle * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * {{{ DISCLAIMER * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * }}} */ // {{{ INCLUDES #include #include #include #include #include #include #include // required for FreeBSD #include #include #include #include #include #include // #include // maybe later // }}} // {{{ MACROS #define EWOULDBLOCK_DELAY 100 #define READ_BUFFER_LENGTH 9000 // jumboframe? #define POST_DATA_MAX_LENGTH 18000 #define DEBUG_SLEEP_TIME 50000 #ifndef DEBUG #define DEBUG(X, ...) // (X, ...) #else #include static inline int verbose(const char * format, ...) { va_list va; va_start(va, format); usleep(DEBUG_SLEEP_TIME); return vprintf(format, va); } #undef DEBUG #define DEBUG verbose #endif // }}} typedef struct { int newline_length; // lenght of one newline in bytes (\n has 1, CR/LF has 2) char * method; // GET/POST or something like that char * protocol; // mostly HTTP/1.0 or HTTP/1.1 char * url; // request URL (e.g. /index.html) char * boundary; // usually looks similar to ------1234 size_t boundary_size; // size in bytes, calculated after first header complete; is an indicator for the first header char * content_type; // sometimes 'text/html', also sometimes 'text/html; boundary=------1234' char * content_disposition; // includes file names of uploaded files or field names with form-data (e.g. curl -F) } Http_Header; void next_part(Http_Header * http_header, const char * content, size_t content_size); void send_answer(Http_Header * http_header, FILE * socket); void parse_http(size_t new_socket, char * request, size_t request_length); // modeline for vim: shiftwidth=2 tabstop=2 number foldmethod=marker foldenable