#include #include #include #include #include #include #include #include "include/tcp.h" #include "include/http.h" void setup_socket(server_conn_t* conn) { int err; size_t sockaddr_len; conn->socket = socket(AF_INET, SOCK_STREAM, 0); if (conn->socket == -1) { perror("socket"); exit(EXIT_FAILURE); } conn->server_info.sin_family = AF_INET; conn->server_info.sin_addr.s_addr = INADDR_ANY; conn->server_info.sin_port = htons(DEFAULT_PORT); conn->server_info_len = sizeof(conn->server_info); err = bind(conn->socket, (const struct sockaddr*) &(conn->server_info), (socklen_t) conn->server_info_len); if (err == -1) { perror("bind"); close(conn->socket); exit(EXIT_FAILURE); } err = listen(conn->socket, 1); if (err == -1) { perror("listen"); close(conn->socket); exit(EXIT_FAILURE); } } void recv_message(char** buffer, int socket) { ulong current_size, bytes_recv; int status; current_size = bytes_recv = 0; status = 0; do { // if we received more data, lets realloc if (bytes_recv >= current_size) { // temporary buffer so if we fail a realloc we don't lose data char* tmp; current_size += BUFFER_INC_LEN; tmp = realloc(*buffer, current_size); if (tmp == NULL) { perror("realloc"); break; } // we succeeded so lets assign the new buffer *buffer = tmp; } // lets recv BUFFER_INC_LEN amount of bytes status = recv(socket, *buffer + bytes_recv, BUFFER_INC_LEN, MSG_DONTWAIT); if (status < 0) { if (errno != EAGAIN && errno != EWOULDBLOCK) // these signify that that were just no data to read, dw about this perror("recv"); break; // don't want to crash on a recv failure, lets just break } bytes_recv += status; } while (status == BUFFER_INC_LEN); // break when we stop receiving, status < BUFFER_INC_LEN means no more data after this last call (*buffer)[bytes_recv] = '\0'; } void* connection_handler(void* arg) { int client_socket = *(int*) arg; http_request request; char* buffer = NULL; recv_message(&buffer, client_socket); puts(buffer); parse_http_request(&buffer, &request); printf("%s %s %1.1f\n", http_method_to_str(request.method), request.request_uri, request.version); /** * Handle HTTP request here :) */ // recv message // parse // // create payload // // send payload free(buffer); close(client_socket); return NULL; } #include "include/tcp.h"