added get request return
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -12,3 +12,4 @@ compile_commands.json
|
|||||||
|
|
||||||
# Service
|
# Service
|
||||||
certs/
|
certs/
|
||||||
|
log/
|
||||||
|
|||||||
1
Makefile
1
Makefile
@@ -15,6 +15,7 @@ install:
|
|||||||
|
|
||||||
output_dir:
|
output_dir:
|
||||||
mkdir -p ${OUTPUT_DIR}
|
mkdir -p ${OUTPUT_DIR}
|
||||||
|
mkdir -p ./log
|
||||||
|
|
||||||
CERT_DIR = ./certs/
|
CERT_DIR = ./certs/
|
||||||
|
|
||||||
|
|||||||
89
cmd/server.c
89
cmd/server.c
@@ -13,6 +13,8 @@
|
|||||||
#include "returnRequest.h"
|
#include "returnRequest.h"
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
|
|
||||||
|
#define WEB_ROOT "content/"
|
||||||
|
|
||||||
static int verbose_flag = 0;
|
static int verbose_flag = 0;
|
||||||
bool enableHTTPS = 0;
|
bool enableHTTPS = 0;
|
||||||
|
|
||||||
@@ -23,13 +25,13 @@ int printDebug(char message[]) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int parseHTTPRequest(char buffer[], struct HTTPRequest *r) {
|
int parseHTTPRequest(unsigned char *buffer, struct HTTPRequest *r) {
|
||||||
char temp[1]; // Used to check newlines
|
char temp[1]; // Used to check newlines
|
||||||
char *token = calloc(8, sizeof(char));
|
char *token = calloc(8, sizeof(char));
|
||||||
int line = 0;
|
int line = 0;
|
||||||
char *checkLine = calloc(1000, sizeof(char));
|
char *checkLine = calloc(1000, sizeof(char));
|
||||||
|
|
||||||
for (int i = 0; i < strlen(buffer); i++) {
|
for (int i = 0; i < strlen((char *)buffer); i++) {
|
||||||
temp[0] = buffer[i];
|
temp[0] = buffer[i];
|
||||||
if ((!strcmp(temp, "\n")) && (i != 0)) {
|
if ((!strcmp(temp, "\n")) && (i != 0)) {
|
||||||
// Config Check
|
// Config Check
|
||||||
@@ -48,8 +50,11 @@ int parseHTTPRequest(char buffer[], struct HTTPRequest *r) {
|
|||||||
token = strtok(NULL, "");
|
token = strtok(NULL, "");
|
||||||
r->requestVersion = malloc(strlen(token));
|
r->requestVersion = malloc(strlen(token));
|
||||||
strcpy(r->requestVersion, token);
|
strcpy(r->requestVersion, token);
|
||||||
|
} else if (!strcmp(token, "POST")) {
|
||||||
|
printDebug("POST RECEIVED");
|
||||||
|
return 2;
|
||||||
} else {
|
} else {
|
||||||
return 1;
|
return 2;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
token = strtok(checkLine, ":");
|
token = strtok(checkLine, ":");
|
||||||
@@ -70,11 +75,60 @@ int parseHTTPRequest(char buffer[], struct HTTPRequest *r) {
|
|||||||
strcat(checkLine, temp);
|
strcat(checkLine, temp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strlen(r->requestType) == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
free(checkLine);
|
free(checkLine);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int handleRequest(char buffer[], int socket, SSL *ssl) {
|
int handleGetRequest(int socket, struct HTTPRequest *r, SSL *ssl) {
|
||||||
|
char errResponse[256];
|
||||||
|
char ch;
|
||||||
|
size_t size = 8;
|
||||||
|
int i = 0;
|
||||||
|
unsigned char *fileContent = calloc(size, sizeof(unsigned char));
|
||||||
|
FILE *fp;
|
||||||
|
char *workingReqDir;
|
||||||
|
// If requesting root directory change to index.html
|
||||||
|
if (!strcmp(r->requestDir, "/")) {
|
||||||
|
workingReqDir = "index.html";
|
||||||
|
} else {
|
||||||
|
workingReqDir = r->requestDir;
|
||||||
|
}
|
||||||
|
char *reqDir = calloc(strlen(WEB_ROOT) + strlen(workingReqDir), sizeof(char));
|
||||||
|
|
||||||
|
sprintf(reqDir, "%s%s", WEB_ROOT, workingReqDir);
|
||||||
|
|
||||||
|
fp = fopen(reqDir, "r");
|
||||||
|
|
||||||
|
if (fp == NULL) {
|
||||||
|
sprintf(errResponse, "Error opening file: %s", workingReqDir);
|
||||||
|
printDebug(errResponse);
|
||||||
|
return404Request(socket, ssl);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while((ch = fgetc(fp)) != EOF) {
|
||||||
|
if (i == size) {
|
||||||
|
size *= 2;
|
||||||
|
fileContent = realloc(fileContent, size);
|
||||||
|
}
|
||||||
|
fileContent[i] = ch;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return200Request(socket, fileContent, ssl);
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
free(reqDir);
|
||||||
|
free(fileContent);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int handleRequest(unsigned char buffer[], int socket, SSL *ssl) {
|
||||||
struct HTTPRequest r; // Holds relevant HTTP request information
|
struct HTTPRequest r; // Holds relevant HTTP request information
|
||||||
int checkerr = 0;
|
int checkerr = 0;
|
||||||
|
|
||||||
@@ -83,11 +137,21 @@ int handleRequest(char buffer[], int socket, SSL *ssl) {
|
|||||||
// Grabbing relevant information out of request
|
// Grabbing relevant information out of request
|
||||||
checkerr = parseHTTPRequest(buffer, &r);
|
checkerr = parseHTTPRequest(buffer, &r);
|
||||||
if (checkerr != 0) { // Checking for HTTP parsing error
|
if (checkerr != 0) { // Checking for HTTP parsing error
|
||||||
printf("Error parsing: exit code %d\n", checkerr);
|
if (checkerr == -1) {
|
||||||
return return404Request(socket, ssl);
|
printDebug("Error reading request, returning empty 404");
|
||||||
|
} else {
|
||||||
|
printDebug("Error parsing, returning 500");
|
||||||
|
// return return500Request(socket, ssl);
|
||||||
|
}
|
||||||
|
return return400Request(socket, ssl);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(r.requestType, "GET")) {
|
||||||
|
handleGetRequest(socket, &r, ssl);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
// Return response to socket
|
// Return response to socket
|
||||||
return200Request(socket, ssl);
|
return200Request(socket, NULL ,ssl);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,18 +162,18 @@ int main(int argc, char **argv) {
|
|||||||
int checkerr = 0; // Used for error checking
|
int checkerr = 0; // Used for error checking
|
||||||
int addrlen = sizeof(address);
|
int addrlen = sizeof(address);
|
||||||
|
|
||||||
char *certFile = malloc(1);
|
char *certFile = malloc(sizeof(char));
|
||||||
char *privKeyFile = malloc(1);
|
char *privKeyFile = malloc(sizeof(char));
|
||||||
certFile[0] = '\0';
|
certFile[0] = '\0';
|
||||||
privKeyFile[0] = '\0';
|
privKeyFile[0] = '\0';
|
||||||
|
|
||||||
uint32_t listenAddrNum = -1;
|
uint32_t listenAddrNum = -1;
|
||||||
char *listenAddr = malloc(1);
|
char *listenAddr = malloc(sizeof(char));
|
||||||
listenAddr[0] = '\0';
|
listenAddr[0] = '\0';
|
||||||
|
|
||||||
SSL_CTX *ctx = NULL;
|
SSL_CTX *ctx = NULL;
|
||||||
|
|
||||||
char buffer[1024] = {};
|
unsigned char *buffer = calloc(8096, sizeof(unsigned char));
|
||||||
|
|
||||||
// Setting up options
|
// Setting up options
|
||||||
static const struct option long_options[] = {
|
static const struct option long_options[] = {
|
||||||
@@ -215,7 +279,7 @@ int main(int argc, char **argv) {
|
|||||||
ssl = SSL_new(ctx);
|
ssl = SSL_new(ctx);
|
||||||
SSL_set_fd(ssl, new_socket);
|
SSL_set_fd(ssl, new_socket);
|
||||||
SSL_accept(ssl);
|
SSL_accept(ssl);
|
||||||
SSL_read(ssl, buffer, sizeof(buffer));
|
SSL_read(ssl, buffer, 8096);
|
||||||
handleRequest(buffer, new_socket, ssl);
|
handleRequest(buffer, new_socket, ssl);
|
||||||
} else {
|
} else {
|
||||||
read(new_socket, buffer, 1024);
|
read(new_socket, buffer, 1024);
|
||||||
@@ -228,6 +292,7 @@ int main(int argc, char **argv) {
|
|||||||
free(privKeyFile);
|
free(privKeyFile);
|
||||||
free(certFile);
|
free(certFile);
|
||||||
free(listenAddr);
|
free(listenAddr);
|
||||||
|
free(buffer);
|
||||||
close(server_fd);
|
close(server_fd);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|||||||
1
content/index.html
Normal file
1
content/index.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Hello World
|
||||||
9
content/testpage.html
Normal file
9
content/testpage.html
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>My First Heading</h1>
|
||||||
|
<p>My first paragraph.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,5 +1,16 @@
|
|||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
|
|
||||||
int returnRequest(int socket, char *message, int status);
|
int returnRequest(int socket, char *message, int status);
|
||||||
int return200Request(int socket, SSL *ssl);
|
|
||||||
|
int return200Request(int socket, unsigned char *content ,SSL *ssl);
|
||||||
|
int return201Request(int socket, unsigned char *content ,SSL *ssl);
|
||||||
|
|
||||||
|
int return400Request(int socket, SSL *ssl);
|
||||||
|
int return403Request(int socket, SSL *ssl);
|
||||||
int return404Request(int socket, SSL *ssl);
|
int return404Request(int socket, SSL *ssl);
|
||||||
|
int return411Request(int socket, SSL *ssl);
|
||||||
|
|
||||||
|
int return500Request(int socket, SSL *ssl);
|
||||||
|
int return501Request(int socket, SSL *ssl);
|
||||||
|
int return505Request(int socket, SSL *ssl);
|
||||||
|
|
||||||
|
|||||||
@@ -17,13 +17,21 @@ int returnRequest(int socket, char *message, int status, SSL *ssl) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int return200Request(int socket, SSL *ssl) {
|
int return200Request(int socket, unsigned char *content, SSL *ssl) {
|
||||||
char *message = "HTTP/1.1 200 OK\nContent-Length: 6\nConnection: close\n\nhello\n";
|
char *message = "";//= "HTTP/1.1 200 OK\nContent-Length: 6\nConnection: close\n\nhello\n";
|
||||||
|
message = calloc(strlen((char *)content) + 128, sizeof(unsigned char));
|
||||||
|
sprintf(message, "HTTP/1.1 200 OK\nContent-Length: %zu\nConnection: close\n\n%s\n",
|
||||||
|
strlen((char *)content), content);
|
||||||
return returnRequest(socket, message, 200, ssl);
|
return returnRequest(socket, message, 200, ssl);
|
||||||
}
|
}
|
||||||
|
|
||||||
int return404Request(int socket, SSL *ssl) {
|
int return404Request(int socket, SSL *ssl) {
|
||||||
char *message = "HTTP/1.1 404 Not Found\nContent-Length: 12\nConnection: close\n\n404 Request\n";
|
char *message = "HTTP/1.1 404 Not Found\nContent-Length: 12\nConnection: close\n\n404 Request\n";
|
||||||
|
return returnRequest(socket, message, 404, ssl);
|
||||||
|
}
|
||||||
|
|
||||||
|
int return400Request(int socket, SSL *ssl) {
|
||||||
|
char *message = "HTTP/1.1 400 HTTP Request Not Valid\n Content-Length: 0\nConnection: close\n\n";
|
||||||
return returnRequest(socket, message, 400, ssl);
|
return returnRequest(socket, message, 400, ssl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ void LoadCertificates(SSL_CTX* ctx, char* certFile, char* keyFile) {
|
|||||||
ERR_print_errors_fp(stderr);
|
ERR_print_errors_fp(stderr);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
/// Set local priv key from keyFile
|
// Set local priv key from keyFile
|
||||||
if ( SSL_CTX_use_PrivateKey_file(ctx, keyFile, SSL_FILETYPE_PEM) <=0 ) {
|
if ( SSL_CTX_use_PrivateKey_file(ctx, keyFile, SSL_FILETYPE_PEM) <=0 ) {
|
||||||
ERR_print_errors_fp(stderr);
|
ERR_print_errors_fp(stderr);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|||||||
Reference in New Issue
Block a user