* Some history about this plugin * ------------------------------ * 2008 - Rewrite module, suport dynamic themes by Eduardo Silva * 2008 - Felipe Astroza (max) provided the mk_dirhtml_human_readable_size_func() * 2007 - Add struct client_request support by Eduardo * 2002 - Original version written by Daniel R. Ome */ #include <monkey/mk_api.h> #include "dirlisting.h" #include <time.h> #include <dirent.h> #include <sys/stat.h> const mk_ptr_t mk_dirhtml_default_mime = mk_ptr_init(MK_DIRHTML_DEFAULT_MIME); const mk_ptr_t mk_dir_iov_dash = mk_ptr_init("-"); const mk_ptr_t mk_dir_iov_none = mk_ptr_init(""); const mk_ptr_t mk_dir_iov_slash = mk_ptr_init("/"); /* Function wrote by Max (Felipe Astroza), thanks! */ static char *mk_dirhtml_human_readable_size(char *buf, size_t size, int len) { unsigned long u = 1024, i; static const char *__units[] = { "b", "K", "M", "G", "T", "P", "E", "Z", "Y", NULL }; for (i = 0; __units[i] != NULL; i++) { if ((size / u) == 0) {
#define MK_HEADER_SHORT_DATE "Date: " #define MK_HEADER_SHORT_LOCATION "Location: " #define MK_HEADER_SHORT_CT "Content-Type: " #define MK_HEADER_ACCEPT_RANGES "Accept-Ranges: bytes" MK_CRLF #define MK_HEADER_ALLOWED_METHODS "Allow: " #define MK_HEADER_CONN_KA "Connection: Keep-Alive" MK_CRLF #define MK_HEADER_CONN_CLOSE "Connection: Close" MK_CRLF #define MK_HEADER_CONN_UPGRADE "Connection: Upgrade" MK_CRLF #define MK_HEADER_CONTENT_LENGTH "Content-Length: " #define MK_HEADER_CONTENT_ENCODING "Content-Encoding: " #define MK_HEADER_TE_CHUNKED "Transfer-Encoding: chunked" MK_CRLF #define MK_HEADER_LAST_MODIFIED "Last-Modified: " #define MK_HEADER_UPGRADE_H2C "Upgrade: h2c" MK_CRLF const mk_ptr_t mk_header_short_date = mk_ptr_init(MK_HEADER_SHORT_DATE); const mk_ptr_t mk_header_short_location = mk_ptr_init(MK_HEADER_SHORT_LOCATION); const mk_ptr_t mk_header_short_ct = mk_ptr_init(MK_HEADER_SHORT_CT); const mk_ptr_t mk_header_allow = mk_ptr_init(MK_HEADER_ALLOWED_METHODS); const mk_ptr_t mk_header_conn_ka = mk_ptr_init(MK_HEADER_CONN_KA); const mk_ptr_t mk_header_conn_close = mk_ptr_init(MK_HEADER_CONN_CLOSE); const mk_ptr_t mk_header_conn_upgrade = mk_ptr_init(MK_HEADER_CONN_UPGRADE); const mk_ptr_t mk_header_content_length = mk_ptr_init(MK_HEADER_CONTENT_LENGTH); const mk_ptr_t mk_header_content_encoding = mk_ptr_init(MK_HEADER_CONTENT_ENCODING); const mk_ptr_t mk_header_accept_ranges = mk_ptr_init(MK_HEADER_ACCEPT_RANGES); const mk_ptr_t mk_header_te_chunked = mk_ptr_init(MK_HEADER_TE_CHUNKED); const mk_ptr_t mk_header_last_modified = mk_ptr_init(MK_HEADER_LAST_MODIFIED); const mk_ptr_t mk_header_upgrade_h2c = mk_ptr_init(MK_HEADER_UPGRADE_H2C); #define status_entry(num, str) {num, sizeof(str) - 1, str}
*/ #define _GNU_SOURCE #include <fcntl.h> #include <sys/uio.h> #include <sys/mman.h> #include <errno.h> #include <stdio.h> #include <string.h> #include <mk_core/mk_macros.h> #include <mk_core/mk_memory.h> #include <mk_core/mk_iov.h> const mk_ptr_t mk_iov_crlf = mk_ptr_init(MK_IOV_CRLF); const mk_ptr_t mk_iov_lf = mk_ptr_init(MK_IOV_LF); const mk_ptr_t mk_iov_space = mk_ptr_init(MK_IOV_SPACE); const mk_ptr_t mk_iov_slash = mk_ptr_init(MK_IOV_SLASH); const mk_ptr_t mk_iov_none = mk_ptr_init(MK_IOV_NONE); const mk_ptr_t mk_iov_equal = mk_ptr_init(MK_IOV_EQUAL); struct mk_iov *mk_iov_create(int n, int offset) { int s_all; int s_iovec; int s_free_buf; void *p; struct mk_iov *iov; s_all = sizeof(struct mk_iov); /* main mk_iov structure */
#include <monkey/mk_user.h> #include <monkey/mk_core.h> #include <monkey/mk_http.h> #include <monkey/mk_http_status.h> #include <monkey/mk_clock.h> #include <monkey/mk_utils.h> #include <monkey/mk_config.h> #include <monkey/mk_socket.h> #include <monkey/mk_mimetype.h> #include <monkey/mk_header.h> #include <monkey/mk_plugin.h> #include <monkey/mk_vhost.h> #include <monkey/mk_server.h> #include <monkey/mk_plugin_stage.h> const mk_ptr_t mk_http_method_get_p = mk_ptr_init(MK_METHOD_GET_STR); const mk_ptr_t mk_http_method_post_p = mk_ptr_init(MK_METHOD_POST_STR); const mk_ptr_t mk_http_method_head_p = mk_ptr_init(MK_METHOD_HEAD_STR); const mk_ptr_t mk_http_method_put_p = mk_ptr_init(MK_METHOD_PUT_STR); const mk_ptr_t mk_http_method_delete_p = mk_ptr_init(MK_METHOD_DELETE_STR); const mk_ptr_t mk_http_method_options_p = mk_ptr_init(MK_METHOD_OPTIONS_STR); const mk_ptr_t mk_http_method_null_p = { NULL, 0 }; const mk_ptr_t mk_http_protocol_09_p = mk_ptr_init(MK_HTTP_PROTOCOL_09_STR); const mk_ptr_t mk_http_protocol_10_p = mk_ptr_init(MK_HTTP_PROTOCOL_10_STR); const mk_ptr_t mk_http_protocol_11_p = mk_ptr_init(MK_HTTP_PROTOCOL_11_STR); const mk_ptr_t mk_http_protocol_null_p = { NULL, 0 }; /* Create a memory allocation in order to handle the request data */ void mk_http_request_init(struct mk_http_session *session, struct mk_http_request *request)
#include <monkey/mk_scheduler.h> #include <monkey/mk_epoll.h> #include <monkey/mk_utils.h> #include <monkey/mk_header.h> #include <monkey/mk_user.h> #include <monkey/mk_method.h> #include <monkey/mk_memory.h> #include <monkey/mk_socket.h> #include <monkey/mk_cache.h> #include <monkey/mk_clock.h> #include <monkey/mk_plugin.h> #include <monkey/mk_macros.h> #include <monkey/mk_vhost.h> #include <monkey/mk_server.h> const mk_ptr_t mk_crlf = mk_ptr_init(MK_CRLF); const mk_ptr_t mk_endblock = mk_ptr_init(MK_ENDBLOCK); const mk_ptr_t mk_rh_accept = mk_ptr_init(RH_ACCEPT); const mk_ptr_t mk_rh_accept_charset = mk_ptr_init(RH_ACCEPT_CHARSET); const mk_ptr_t mk_rh_accept_encoding = mk_ptr_init(RH_ACCEPT_ENCODING); const mk_ptr_t mk_rh_accept_language = mk_ptr_init(RH_ACCEPT_LANGUAGE); const mk_ptr_t mk_rh_connection = mk_ptr_init(RH_CONNECTION); const mk_ptr_t mk_rh_cookie = mk_ptr_init(RH_COOKIE); const mk_ptr_t mk_rh_content_length = mk_ptr_init(RH_CONTENT_LENGTH); const mk_ptr_t mk_rh_content_range = mk_ptr_init(RH_CONTENT_RANGE); const mk_ptr_t mk_rh_content_type = mk_ptr_init(RH_CONTENT_TYPE); const mk_ptr_t mk_rh_if_modified_since = mk_ptr_init(RH_IF_MODIFIED_SINCE); const mk_ptr_t mk_rh_host = mk_ptr_init(RH_HOST); const mk_ptr_t mk_rh_last_modified = mk_ptr_init(RH_LAST_MODIFIED); const mk_ptr_t mk_rh_last_modified_since = mk_ptr_init(RH_LAST_MODIFIED_SINCE);
#include <monkey/mk_macros.h> #include <monkey/mk_env.h> #include <monkey/mk_utils.h> #include <monkey/mk_config.h> #include <monkey/mk_scheduler.h> #include <monkey/mk_tls.h> #include <getopt.h> #if defined(__DATE__) && defined(__TIME__) static const char MONKEY_BUILT[] = __DATE__ " " __TIME__; #else static const char MONKEY_BUILT[] = "Unknown"; #endif const mk_ptr_t mk_monkey_protocol = mk_ptr_init(MK_HTTP_PROTOCOL_11_STR); void mk_thread_keys_init(void) { /* Create thread keys */ pthread_key_create(&mk_utils_error_key, NULL); } static void mk_version(void) { printf("Monkey HTTP Server v%s\n", MK_VERSION_STR); printf("Built : %s (%s %i.%i.%i)\n", MONKEY_BUILT, CC, __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__); printf("Home : http://monkey-project.com\n"); fflush(stdout); }
* * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <monkey/mk_plugin.h> #include "logger.h" #include "pointers.h" const mk_ptr_t mk_logger_iov_none = mk_ptr_init(""); /* Writter helpers */ const mk_ptr_t mk_logger_iov_dash = mk_ptr_init(MK_LOGGER_IOV_DASH); const mk_ptr_t mk_logger_iov_space = mk_ptr_init(MK_IOV_SPACE); const mk_ptr_t mk_logger_iov_lf = mk_ptr_init(MK_IOV_LF); const mk_ptr_t mk_logger_iov_empty = mk_ptr_init(MK_LOGGER_IOV_EMPTY); /* Error messages */ const mk_ptr_t error_msg_400 = mk_ptr_init(ERROR_MSG_400); const mk_ptr_t error_msg_403 = mk_ptr_init(ERROR_MSG_403); const mk_ptr_t error_msg_404 = mk_ptr_init(ERROR_MSG_404); const mk_ptr_t error_msg_405 = mk_ptr_init(ERROR_MSG_405); const mk_ptr_t error_msg_408 = mk_ptr_init(ERROR_MSG_408); const mk_ptr_t error_msg_411 = mk_ptr_init(ERROR_MSG_411); const mk_ptr_t error_msg_413 = mk_ptr_init(ERROR_MSG_413);