diff --git a/README.md b/README.md index b61d67e..d4db6ca 100644 --- a/README.md +++ b/README.md @@ -60,8 +60,8 @@ srvoptions_t options = { .loglevel = LOG_DEBUG // the log level for the logfile }; -// webserver_t ws_create(const char* name, const char* host (can be NULL for default), const char* port, FILE* logfile, srvoptions_t options); -webserver_t server = ws_create("server_name", NULL, "8080", stderr, options); +// webserver_t ws_create(const char* name, const char* host (can be ANY for any), const char* port, FILE* logfile, srvoptions_t options); +webserver_t server = ws_create("server_name", ANY, "8080", stderr, options); ``` Now you can add you handlers. diff --git a/example.c b/example.c index f8b7bcf..4b1c2b6 100644 --- a/example.c +++ b/example.c @@ -42,10 +42,10 @@ int main(int argc, char** argv) { .mode = LINEAR, .timeout = 30, .maxconnections = 5, - .loglevel = LOG_DEBUG + .loglevel = LOG_WARN }; - webserver_t server = ws_create("test_server", NULL , "8080", stderr, options); + webserver_t server = ws_create("test_server", ANY , "8080", stderr, options); ws_handle_add(&server, hello_handle); ws_handle_add(&server, test_handle); diff --git a/serwer.c b/serwer.c index 4584193..af46c1d 100644 --- a/serwer.c +++ b/serwer.c @@ -84,6 +84,7 @@ int ws_listen(webserver_t* server) { int s; memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_flags = AI_PASSIVE; // host = NULL => IP wildcard; see getaddrinfo(2) hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; @@ -164,7 +165,7 @@ void ws_log(webserver_t* server, loglevel_t loglevel, const char* format, ...) { fprintf(server->logfile, "\n"); } -void ws_send(int connfd, int code, headers_t headers, int pipefd) { +size_t ws_send(int connfd, int code, headers_t headers, int pipefd) { stream_t connection = (stream_t) fdopen(connfd, "a+"); setbuf(connection, NULL); @@ -188,19 +189,25 @@ void ws_send(int connfd, int code, headers_t headers, int pipefd) { if (pipefd == -1) { fclose(connection); - return; + return 0; } char buffer[BUFFER_SIZE]; int bs = 0; - while ((bs = read(pipefd, buffer, BUFFER_SIZE)) > 0) + size_t size = 0; + + while ((bs = read(pipefd, buffer, BUFFER_SIZE)) > 0) { + size += bs; write(connfd, buffer, bs); + } fclose(connection); + + return size; } void ws_simple_status(int connfd, int code) { - ws_send(connfd, code, (headers_t) { + (void) ws_send(connfd, code, (headers_t) { .fields = NULL, .nrfields = 0 }, -1); @@ -208,8 +215,12 @@ void ws_simple_status(int connfd, int code) { int ws_run(webserver_t* server) { + ws_log(server, LOG_MESSAGE, "server \"%s\" started on %s:%s", server->name, + server->host == NULL ? "0.0.0.0" : server->host, server->port); + switch(server->options.mode) { case LINEAR: + ws_log(server, LOG_DEBUG, "starting linear handler"); return ws_run_linear(server); default: errno = EBADRQC; diff --git a/serwer.h b/serwer.h index da64f31..65e5333 100644 --- a/serwer.h +++ b/serwer.h @@ -13,6 +13,13 @@ #define WS_VERSION "0.1" #define WS_NAME "Serwer" +#define LOG_TESTING 11 +#define LOG_DEBUG 10 +#define LOG_VERBOSE 5 +#define LOG_WARN 2 +#define LOG_MESSAGE 1 +#define LOG_ERROR 0 + headers_t ws_headers_create(void); void ws_headers_add(headers_t*, const char*, const char*); void ws_headers_convert(headers_t*, char*); @@ -21,7 +28,7 @@ void ws_headers_free(headers_t*); void ws_handle_add(webserver_t*, handle_t); handler_t ws_handler_find(webserver_t*, const char*, const char*); -void ws_send(int, int, headers_t, int); +size_t ws_send(int, int, headers_t, int); void ws_simple_status(int, int); webserver_t ws_create(const char*, const char*, const char*, FILE*, srvoptions_t); diff --git a/ws_linear.c b/ws_linear.c index c0e5669..6f892b1 100644 --- a/ws_linear.c +++ b/ws_linear.c @@ -138,7 +138,7 @@ int ws_run_linear(webserver_t* server) { // send ws_log(server, LOG_TESTING, "sending response"); - ws_send(connfd, code, responseHeaders, pipefd[0]); + size_t response_size = ws_send(connfd, code, responseHeaders, pipefd[0]); // cleanup ws_log(server, LOG_DEBUG, "cleanup"); @@ -148,6 +148,11 @@ int ws_run_linear(webserver_t* server) { ws_log(server, LOG_TESTING, "done"); + if (s == 0) + ws_log(server, LOG_MESSAGE, "%s:%s - %s %s @ %s, %i, %i bytes", phost, service, ws_method_string(method), path, host, code, response_size); + else + ws_log(server, LOG_MESSAGE, "-:- - %s %s @ %s, %i, %i bytes", ws_method_string(method), path, host, code, response_size); + break; } diff --git a/ws_types.h b/ws_types.h index d496777..45398ec 100644 --- a/ws_types.h +++ b/ws_types.h @@ -17,12 +17,6 @@ typedef FILE* stream_t; typedef int loglevel_t; -#define LOG_TESTING 11 -#define LOG_DEBUG 10 -#define LOG_VERBOSE 5 -#define LOG_WARN 2 -#define LOG_ERROR 0 - #define ANY NULL typedef enum method {