#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")) { // Grabbing HTTP Request Type r->requestType = malloc(strlen(token)); strcpy(r->requestType, token); // Grabbing HTTP Request Dir token = strtok(NULL, " "); r->requestDir = malloc(strlen(token)); strcpy(r->requestDir, token); // Grabbing HTTP Request Version token = strtok(NULL, ""); r->requestVersion = malloc(strlen(token)); strcpy(r->requestVersion, token); } else { return 1; } } 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 *message) { send(socket, message, strlen(message), 0); return 0; } int return200Request(int socket) { char *message = "HTTP/1.1 200 OK\nContent-Length: 6\nConnection: close\n\nhello\n"; return returnRequest(socket, message); } int return404Request(int socket) { char *message = "HTTP/1.1 404 Not Found\nContent-Length: 12\nConnection: close\n\n404 Request\n"; return returnRequest(socket, message); } int handleRequest(char buffer[], int socket) { struct HTTPRequest r; // Holds relevant HTTP request information int checkerr = 0; // Grabbing relevant information out of request checkerr = parseHTTPRequest(buffer, &r); if (checkerr != 0) { // Checking for HTTP parsing error perror("Badness!!!"); return return404Request(socket); } // Return response to socket return200Request(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); handleRequest(buffer, new_socket); } exit(EXIT_SUCCESS); }