commit 7ddfb06557cbbfcc4d686836d3cd71372e647df3 Author: Pin Date: Sat Jan 29 18:12:15 2022 -0500 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..beb459e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.out +*.gch +vgcore.* +bin/ +.cache/ +compile_commands.json diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..90df5b7 --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +LIBRARIES = -Iinclude +SOURCES = ./src/* ./cmd/server.c +OUTPUT_DIR = ./bin +OUTPUT = -o ${OUTPUT_DIR}/PROG +INSTALL_OUTPUT = ${OUTPUT_DIR}/PROG + +build: output_dir + gcc -Wall -pthread ${LIBRARIES} ${SOURCES} ${OUTPUT:PROG=server} + +debug: output_dir + gcc -Wall -g -pthread ${LIBRARIES} ${SOURCES} ${OUTPUT:PROG=server} + +install: + mv ${INSTALL_OUTPUT:PROG=server} /usr/bin/ + +output_dir: + mkdir -p ${OUTPUT_DIR} + +clean: + rm -rf $(OUTPUT_DIR) **.h.gch + diff --git a/cmd/server.c b/cmd/server.c new file mode 100644 index 0000000..86d0b20 --- /dev/null +++ b/cmd/server.c @@ -0,0 +1,98 @@ +#include +#include +#include +#include +#include +#include + +// Local Includes +#include "httpStruct.h" +#include "socketHelp.h" + +#define PORT 8080 + +int parseHTTPRequest(char buffer[], struct HTTPRequest *r) { + char temp[1]; + char *token; + int line = 0; + char * checkLine; + checkLine = malloc(1000); + + for (int i = 0; i < strlen(buffer); i++) { + temp[0] = buffer[i]; + if ((!strcmp(temp, "\n")) && (i != 0)) { + // Config Check + if (line == 0) { + token = strtok(checkLine, " "); + // HTTP Request Type + if (!strcmp(token, "GET")) { + r->requestType = malloc(strlen(token)); + strcpy(r->requestType, token); + } + } else { + token = strtok(checkLine, ":"); + // Host Check + if (!strcmp(token, "Host")) { + token = strtok(NULL, ""); + r->requestHost = malloc(strlen(token)); + strcpy(r->requestHost, token); + } + // Reset checkline + } + if (strlen(checkLine) > 0) { + // Clear checkLine + memset(checkLine,0,strlen(checkLine)); + } + line++; + } else { + strcat(checkLine, temp); + } + } + free(checkLine); + return 0; +} + +int returnRequest(int socket) { + char *hello = "HTTP/1.1 200 OK\nContent-Length: 5\nConnection: close\n\nhello\n\n"; + printf("Returning\n%s", hello); + send(socket, hello, strlen(hello), 0); + return 0; +} + +int handleRequest(char buffer[], int socket) { + struct HTTPRequest r; + // Grabbing relevant information out of request + parseHTTPRequest(buffer, &r); + returnRequest(socket); + return 0; +} + +int main(int argc, char const *argv[]) { + struct sockaddr_in address; + int server_fd, new_socket; + int checkerr = 0; + int addrlen = sizeof(address); + + char buffer[1024] = {}; + + checkerr = createSocket(PORT, &server_fd, &address, &addrlen); + + if (checkerr != 0) { + perror("Error creating socket"); + exit(EXIT_FAILURE); + } + + // Handle incoming requests + while(1) { + if ((new_socket = accept(server_fd, (struct sockaddr *)&address, + (socklen_t *)&addrlen))<0) { + perror("Accept connection error"); + exit(EXIT_FAILURE); + } + read(new_socket, buffer, 1024); + printf("Conn received:\n%s\n", buffer); + handleRequest(buffer, new_socket); + } + + exit(EXIT_SUCCESS); +} diff --git a/include/httpStruct.h b/include/httpStruct.h new file mode 100644 index 0000000..85f2764 --- /dev/null +++ b/include/httpStruct.h @@ -0,0 +1,9 @@ +#include +#include + +// HTTP Request Struct +struct HTTPRequest { + char *requestType; + char *requestVersion; + char *requestHost; +}; diff --git a/include/socketHelp.h b/include/socketHelp.h new file mode 100644 index 0000000..6355b8e --- /dev/null +++ b/include/socketHelp.h @@ -0,0 +1,5 @@ +#include +#include + +int createSocket(int port, int *server_fd, struct sockaddr_in *address, int *addrlen); + diff --git a/src/socketHelp.c b/src/socketHelp.c new file mode 100644 index 0000000..3519ba3 --- /dev/null +++ b/src/socketHelp.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include + +int createSocket(int port, int *server_fd, struct sockaddr_in *address, int *addrlen) { + int opt = 1; + + // Create socket fd + if ((*server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { + perror("socket failed"); + exit(EXIT_FAILURE); + } + + // Attach socket to PORT + if (setsockopt(*server_fd, SOL_SOCKET, SO_REUSEADDR |SO_REUSEPORT, + &opt, sizeof(opt))) { + perror("Set socket opt failure"); + exit(EXIT_FAILURE); + } + address->sin_family = AF_INET; + address->sin_addr.s_addr = INADDR_ANY; + address->sin_port = htons (port); + + // Attach to PORT + if (bind(*server_fd, (struct sockaddr *)address, + sizeof(*address))<0) { + perror("Failed to bind"); + exit(EXIT_FAILURE); + } + + if (listen(*server_fd, 3) < 0) { + perror("Failed to listen"); + exit(EXIT_FAILURE); + } + + return 0; +}