From 0b924ca966bfb9c3b2417d7bff16ab95c0cc3007 Mon Sep 17 00:00:00 2001 From: rasmus Date: Thu, 13 Mar 2025 13:11:35 +0100 Subject: [PATCH] Add read from file --- WebServer | Bin 18336 -> 17880 bytes include/arrayHelper.h | 6 ++ include/ipaddress.h | 16 ----- include/server.h | 25 ++++++-- src/arrayHelper.c | 15 +++++ src/ipaddress.c | 60 ------------------ src/main.c | 78 +++++++++++++++++++---- src/server.c | 143 +++++++++++++++--------------------------- 8 files changed, 155 insertions(+), 188 deletions(-) create mode 100644 include/arrayHelper.h delete mode 100644 include/ipaddress.h create mode 100644 src/arrayHelper.c delete mode 100644 src/ipaddress.c diff --git a/WebServer b/WebServer index 603b09ecb3a039095ec0edab42cc7e17191b6d6e..a95d9aa1e6ce063f8c2dbb01f41c56c669d353dc 100755 GIT binary patch delta 4396 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 ZVcYe(x;3)Jr=?A8t29s7(|v7K{|5_Qk`w>{ literal 18336 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 A@Bjb+ diff --git a/include/arrayHelper.h b/include/arrayHelper.h new file mode 100644 index 0000000..2ff0c1b --- /dev/null +++ b/include/arrayHelper.h @@ -0,0 +1,6 @@ +#ifndef ARRAYHELPER_H +#define ARRAYHELPER_H + +char *mergeArray(char *arr1, char *arr2); + +#endif \ No newline at end of file diff --git a/include/ipaddress.h b/include/ipaddress.h deleted file mode 100644 index 7f34cc0..0000000 --- a/include/ipaddress.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef IPADDRESS_H -#define IPADDRESS_H - -#include -#include -#include -#include - -#define MAX_LINE_LENGTH (1024) - -// This code has been borrowed from this github repo https://github.com/wasmerio/c-http-server and modified by me. - -int extract_ip_address_from_header(char *line, char *address); -char *get_ip_address(FILE *f); - -#endif \ No newline at end of file diff --git a/include/server.h b/include/server.h index 0483c3b..c5a1c3a 100644 --- a/include/server.h +++ b/include/server.h @@ -1,13 +1,26 @@ #ifndef SERVER_H #define SERVER_H -// This code has been borrowed from this github repo https://github.com/wasmerio/c-http-server and modified by me. - +#include +#include #include +#include +#include +#include -void send_response(FILE *f, char *html); -int open_connection(int port); -void accept_client(int sock, char *key); -void send_only(int port, char *key); +#define BUFFER_SIZE 1024 + +// This code has been borrowed from this github repo https://bruinsslot.jp/post/simple-http-webserver-in-c/ and modified by me. + +struct setup { + struct sockaddr_in host_addr; + struct sockaddr_in client_addr; + int sockfd; + int host_addrlen; + int client_addrlen; + char *response; +}; + +void serve(struct setup s); #endif \ No newline at end of file diff --git a/src/arrayHelper.c b/src/arrayHelper.c new file mode 100644 index 0000000..3da43e8 --- /dev/null +++ b/src/arrayHelper.c @@ -0,0 +1,15 @@ +#include +#include +#include "../include/arrayHelper.h" + +char *mergeArray(char *arr1, char *arr2){ + int arrSize1 = sizeof(arr1); + int arrSize2 = sizeof(arr2); + int totalSize = arrSize1 + arrSize2; + char *total = malloc(totalSize * sizeof(char)); + + memcpy(total, arr1, arrSize1 * sizeof(char)); + memcpy(total + arrSize2, arr2, arrSize2 * sizeof(char)); + + return total; +} \ No newline at end of file diff --git a/src/ipaddress.c b/src/ipaddress.c deleted file mode 100644 index e0cd140..0000000 --- a/src/ipaddress.c +++ /dev/null @@ -1,60 +0,0 @@ -#include -#include -#include -#include -#include "../include/ipaddress.h" - -// This code has been borrowed from this github repo https://github.com/wasmerio/c-http-server and modified by me. - -int extract_ip_address_from_header(char *line, char *address) { - int found = 0; - char *ptr; - char *name; - char *value; - - name = strndup(line, MAX_LINE_LENGTH); - ptr = index(name, (int)':'); - if (ptr == NULL) { - return 0; - } - // end the string at the colon - *ptr = '\0'; - - // get the value part of the header field - ptr = index(line, (int) ':'); - value = strndup(ptr + 2, MAX_LINE_LENGTH); - - // most ugly way to remove \r\n from the end of the string - value[strlen(value)-2] = '\0'; - - if (strncmp(name, "X-Forwarded-For", MAX_LINE_LENGTH) == 0) { - found = 1; - strncpy(address, value, MAX_LINE_LENGTH); - } - - free(name); - free(value); - - return found; -} - -char *get_ip_address(FILE *f) { - int address_found = 0; - char *res; - char *ip_address = malloc (sizeof (char) * MAX_LINE_LENGTH); - char header_line[MAX_LINE_LENGTH]; - - do { - res = fgets(header_line, MAX_LINE_LENGTH, f); - - if (res != NULL) { - printf("%s", res); - - if (!address_found) { - address_found = extract_ip_address_from_header(res, ip_address); - } - } - } while (res != NULL && strcmp(header_line, "\r\n") != 0); - - return ip_address; -} \ No newline at end of file diff --git a/src/main.c b/src/main.c index d36b5f1..aaff34a 100644 --- a/src/main.c +++ b/src/main.c @@ -1,27 +1,79 @@ #include #include #include +#include "../include/arrayHelper.h" #include "../include/fileReader.h" #include "../include/server.h" -#include "../include/ipaddress.h" + +#include +#include +#include +#include +#include + +#define PORT 3090 +#define BUFFER_SIZE 1024 int main(int argc, char *argv[]) { - - if(argc <= 1) { - printf("Please provide options. \n"); - - return 0; - } - char *file = NULL; + file = ReadHTML("/home/skingging/Documents/Projects/C/C-Webserver/HTML/index.html"); - if(strcasecmp(argv[0], "cache")) { - file = ReadHTML("/home/skingging/Documents/Projects/C/C-Webserver/HTML/index.html"); + char buffer[BUFFER_SIZE]; + char resp[] = "HTTP/1.0 200 OK\r\n" + "Server: webserver-c\r\n" + "Content-type: text/html\r\n\r\n" + "hello, world\r\n"; + + char *temp = mergeArray(resp, file); + + // Create a socket + int sockfd = socket(AF_INET, SOCK_STREAM, 0); + + if (sockfd == -1) { + perror("webserver (socket)"); + return 1; } - int port = 3090; - send_only(port, "address"); - exit(EXIT_SUCCESS); + printf("socket created successfully\n"); + + // Create the address to bind the socket to + struct sockaddr_in host_addr; + int host_addrlen = sizeof(host_addr); + + host_addr.sin_family = AF_INET; + host_addr.sin_port = htons(PORT); + host_addr.sin_addr.s_addr = htonl(INADDR_ANY); + + // Create client address + struct sockaddr_in client_addr; + int client_addrlen = sizeof(client_addr); + + // Bind the socket to the address + if (bind(sockfd, (struct sockaddr *)&host_addr, host_addrlen) != 0) { + perror("webserver (bind)"); + return 1; + } + + printf("socket successfully bound to address\n"); + + // Listen for incoming connections + if (listen(sockfd, SOMAXCONN) != 0) { + perror("webserver (listen)"); + return 1; + } + + printf("server listening for connections\n"); + + struct setup s; + + s.client_addr = client_addr; + s.client_addrlen = client_addrlen; + s.host_addr = host_addr; + s.host_addrlen = host_addrlen; + s.response = resp; + s.sockfd = sockfd; + + serve(s); return 0; } \ No newline at end of file diff --git a/src/server.c b/src/server.c index 17b9973..ea3111b 100644 --- a/src/server.c +++ b/src/server.c @@ -1,103 +1,60 @@ +#include #include -#include -#include -#include -#include -#include -#include #include -#include "../include/ipaddress.h" +#include +#include #include "../include/server.h" -// This code has been borrowed from this github repo https://github.com/wasmerio/c-http-server and modified by me. +// This code has been borrowed from this github repo https://bruinsslot.jp/post/simple-http-webserver-in-c/ and modified by me. -void send_response(FILE *f, char *html) -{ - fprintf(f, "HTTP/1.1 200 OK\r\n"); - fprintf(f, "Content-Type: application/html\r\n"); - fprintf(f, "\r\n"); - fprintf(f, "%s", html); -} +#define PORT 3090 +#define BUFFER_SIZE 1024 -int open_connection(int port) -{ - int sock; - struct sockaddr_in addr_in; +void serve(struct setup s) { + char buffer[BUFFER_SIZE]; - printf("simpleserver::Creating socket: (%d, %d, 0)\n", AF_INET, SOCK_STREAM); - sock = socket(AF_INET, SOCK_STREAM, 0); - printf("simpleserver::Socket created (%d)\n", sock); - - if (sock == -1) - { - printf("Failed to create socket (%d)\n", errno); - exit(EXIT_FAILURE); - } - - addr_in.sin_family = AF_INET; - addr_in.sin_port = htons(port); - addr_in.sin_addr.s_addr = INADDR_ANY; - - printf("simpleserver::bind (%d, (%d, %d, %d), %lu)\n", sock, addr_in.sin_family, addr_in.sin_port, addr_in.sin_addr.s_addr, sizeof(struct sockaddr_in)); - - int lol = bind(sock, (struct sockaddr *)&addr_in, sizeof(struct sockaddr_in)); - - printf("simpleserver::listen(%d, 8)\n", sock); - - if (listen(sock, 8) == -1) - { - printf("Failed to get socket to listen (%d)\n", errno); - exit(EXIT_FAILURE); - } - - return sock; -} + for (;;) { + // Accept incoming connections + int newsockfd = accept(s.sockfd, (struct sockaddr *)&s.host_addr, (socklen_t *)&s.host_addrlen); + + if (newsockfd < 0) { + perror("webserver (accept)"); + continue; + } + + printf("connection accepted\n"); -void accept_client(int sock, char *key) -{ - struct sockaddr_in client_addr; - socklen_t clientaddr_len; - FILE *f; - - printf("simpleserver::accept(%d)\n", sock); - - int client_sock = accept(sock, (struct sockaddr *)&client_addr, &clientaddr_len); - printf("simpleserver::accepted (%d)\n", client_sock); - - if (client_sock == -1) - { - printf("Failed to accept connection (%d)\n", errno); - exit(EXIT_FAILURE); - } - - printf("simpleserver::fdopen(%d)\n", client_sock); - - f = fdopen(client_sock, "w+"); - - if (f == NULL){ - printf("simpleserver::Error during fdopen\n"); - } - - printf("simpleserver::send_response(%s)\n", key); - send_response(f, "

Hello

"); - - printf("simpleserver::fclose()\n"); - fclose(f); - - printf("simpleserver::fflush\n"); - // stdout needs to be flushed in order for heroku to read the logs - fflush(stdout); - printf("simpleserver::endfflush\n"); -} + // Get client address + int sockn = getsockname(newsockfd, (struct sockaddr *)&s.client_addr, (socklen_t *)&s.client_addrlen); + + if (sockn < 0) { + perror("webserver (getsockname)"); + continue; + } -void send_only(int port, char *key) -{ - int sock = open_connection(port); - - while (1) - { - accept_client(sock, key); + // Read from the socket + int valread = read(newsockfd, buffer, BUFFER_SIZE); + + if (valread < 0) { + perror("webserver (read)"); + continue; + } + + // Read the request + char method[BUFFER_SIZE], uri[BUFFER_SIZE], version[BUFFER_SIZE]; + + sscanf(buffer, "%s %s %s", method, uri, version); + + printf("[%s:%u] %s %s %s\n", inet_ntoa(s.client_addr.sin_addr), ntohs(s.client_addr.sin_port), method, version, uri); + + // Write to the socket + int valwrite = write(newsockfd, s.response, strlen(s.response)); + + if (valwrite < 0) { + perror("webserver (write)"); + continue; + } + + close(newsockfd); } - - close(sock); -} +} \ No newline at end of file