Files
SeaWeb/cmd/server.c
2022-01-30 15:32:35 -05:00

109 lines
2.6 KiB
C

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
// Local Includes
#include "httpStruct.h"
#include "socketHelp.h"
#include "returnRequest.h"
#define PORT 8080
int parseHTTPRequest(char buffer[], struct HTTPRequest *r) {
char temp[1];
char *token = calloc(8, sizeof(char));
int line = 0;
char *checkLine = calloc(1000, sizeof(char));;
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 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
printf("Error parsing: exit code %d\n", checkerr);
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);
close(new_socket);
}
exit(EXIT_SUCCESS);
}