moved functions around
This commit is contained in:
257
cmd/server.c
257
cmd/server.c
@@ -15,6 +15,7 @@
|
||||
#include "returnRequest.h"
|
||||
#include "server.h"
|
||||
#include "utils.h"
|
||||
#include "requestHandlers.h"
|
||||
|
||||
#define WEB_ROOT "/var/www/html/"
|
||||
//#define WEB_ROOT "content/"
|
||||
@@ -22,6 +23,7 @@
|
||||
|
||||
static int verbose_flag = 0;
|
||||
bool enableHTTPS = 0;
|
||||
char *WEB_ROOT_DIR = NULL;
|
||||
|
||||
static int timeout = 0;
|
||||
|
||||
@@ -32,91 +34,6 @@ int printDebug(char message[]) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *php_cgi(char *sPath, struct HTTPRequest *r) {
|
||||
int phpPipe[2];
|
||||
char *buf = NULL;
|
||||
size_t bufLen = 1024;
|
||||
|
||||
buf = malloc(bufLen);
|
||||
pipe(phpPipe);
|
||||
|
||||
pid_t pid;
|
||||
int status = 0;
|
||||
pid = fork();
|
||||
|
||||
if (pid == 0) { // Child fork
|
||||
char script[500];
|
||||
char *queryString = NULL;
|
||||
close(phpPipe[0]);
|
||||
dup2(phpPipe[1], STDOUT_FILENO);
|
||||
strcpy(script, "SCRIPT_FILENAME=");
|
||||
strcat(script, WEB_ROOT);
|
||||
strcat(script, sPath);
|
||||
putenv("GATEWAY_INTERFACE=CGI/1.1");
|
||||
putenv(script);
|
||||
putenv("REDIRECT_STATUS=true");
|
||||
putenv("SERVER_PROTOCOL=HTTP/1.1");
|
||||
putenv("REMOTE_HOST=127.0.0.1");
|
||||
if (!strcmp(r->requestType, "POST")) {
|
||||
putenv("REQUEST_METHOD=POST");
|
||||
char conLenString[256];
|
||||
sprintf(conLenString, "CONTENT_LENGTH=%zu", r->requestBodyLen);
|
||||
putenv(conLenString);
|
||||
putenv("CONTENT_TYPE=application/x-www-form-urlencoded");
|
||||
queryString = malloc(r->requestBodyLen + 24);
|
||||
sprintf(queryString, "QUERY_STRING=%s", r->requestBody);
|
||||
putenv(queryString);
|
||||
|
||||
// Starting fork to pipe stdin into php-cgi
|
||||
int phpPipe2[2];
|
||||
pipe(phpPipe2);
|
||||
pid_t pid2;
|
||||
pid2 = fork();
|
||||
|
||||
if (pid2 == 0) { // Child fork
|
||||
close(phpPipe2[0]);
|
||||
dup2(phpPipe2[1], STDOUT_FILENO);
|
||||
printf("%s", r->requestBody);
|
||||
close(phpPipe2[1]);
|
||||
exit(EXIT_SUCCESS);
|
||||
} else if (pid < 0) { // Error forking
|
||||
printDebug("Error in stdin php frok");
|
||||
} else { // Parent fork
|
||||
close(phpPipe[1]);
|
||||
dup2(phpPipe2[0], STDIN_FILENO);
|
||||
execlp("/usr/bin/php-cgi", "php-cgi", NULL);
|
||||
}
|
||||
} else {
|
||||
queryString = malloc(strlen(r->requestVars) + 24);
|
||||
sprintf(queryString, "QUERY_STRING=%s", r->requestVars);
|
||||
putenv(queryString);
|
||||
putenv("REQUEST_METHOD=GET");
|
||||
execl("/usr/bin/php-cgi", "php-cgi", NULL);
|
||||
}
|
||||
} else if (pid < 0) { // Error forking
|
||||
printDebug("Error forking php exec");
|
||||
} else { // Parent fork
|
||||
size_t buffCount;
|
||||
close(phpPipe[1]);
|
||||
do {
|
||||
buffCount = read(phpPipe[0], buf, BUFF_READ);
|
||||
if (strlen(buf) == bufLen) {
|
||||
bufLen *= 2;
|
||||
buf = realloc(buf, bufLen);
|
||||
}
|
||||
} while (buffCount == 0);
|
||||
do {
|
||||
waitpid(pid, &status, WUNTRACED);
|
||||
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
|
||||
}
|
||||
|
||||
close(phpPipe[0]);
|
||||
if (status != 0) {
|
||||
return NULL;
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
int parseHTTPRequest(unsigned char *buffer, struct HTTPRequest *r) {
|
||||
char temp[1]; // Used to check newlines
|
||||
char *token = calloc(8, sizeof(char));
|
||||
@@ -219,171 +136,6 @@ int parseHTTPRequest(unsigned char *buffer, struct HTTPRequest *r) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
char *phpReturn = NULL;
|
||||
char phpEnd[5] = ".php";
|
||||
bool endsWithPhp = false;
|
||||
if (strlen(phpEnd) <= strlen(r->requestDir)) {
|
||||
for (int i = 0; i < strlen(phpEnd); i++) {
|
||||
if (r->requestDir[i + strlen(r->requestDir) - strlen(phpEnd)] != phpEnd[i]) {
|
||||
endsWithPhp = false;
|
||||
break;
|
||||
}
|
||||
endsWithPhp = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (endsWithPhp) {
|
||||
phpReturn = php_cgi(r->requestDir, r);
|
||||
if (phpReturn != NULL) {
|
||||
return returnPHPRequest(socket, phpReturn, ssl);
|
||||
} else {
|
||||
return return500Request(socket, ssl);
|
||||
}
|
||||
}
|
||||
|
||||
// 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) + 1), 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 handlePUTRequest(int socket, struct HTTPRequest *r, SSL *ssl) {
|
||||
FILE *fp;
|
||||
char *reqDir;
|
||||
char * workingReqDir;
|
||||
char errResponse[256];
|
||||
|
||||
if (!strcmp(r->requestDir, "/")) {
|
||||
workingReqDir = "index.html";
|
||||
} else {
|
||||
workingReqDir = r->requestDir;
|
||||
}
|
||||
|
||||
reqDir = calloc(strlen(WEB_ROOT) + strlen(workingReqDir), sizeof(char));
|
||||
sprintf(reqDir, "%s%s", WEB_ROOT, workingReqDir);
|
||||
|
||||
fp = fopen(reqDir, "w");
|
||||
if (fp == NULL) {
|
||||
sprintf(errResponse, "Error opening file: %s", workingReqDir);
|
||||
printDebug(errResponse);
|
||||
return return404Request(socket, ssl);
|
||||
}
|
||||
|
||||
fprintf(fp, "%s", r->requestBody);
|
||||
|
||||
free(reqDir);
|
||||
fclose(fp);
|
||||
return return201Request(socket, r->requestBody, ssl);
|
||||
}
|
||||
|
||||
int handleDELETERequest(int socket, struct HTTPRequest *r, SSL *ssl) {
|
||||
char *reqDir;
|
||||
char * workingReqDir;
|
||||
char logLine[256];
|
||||
|
||||
if (!strcmp(r->requestDir, "/")) {
|
||||
workingReqDir = "index.html";
|
||||
} else {
|
||||
workingReqDir = r->requestDir;
|
||||
}
|
||||
|
||||
reqDir = calloc(strlen(WEB_ROOT) + strlen(workingReqDir), sizeof(char));
|
||||
sprintf(reqDir, "%s%s", WEB_ROOT, workingReqDir);
|
||||
|
||||
if (remove(reqDir) == 0) {
|
||||
sprintf(logLine, "Deleted file");
|
||||
free(reqDir);
|
||||
return return200Request(socket, NULL, ssl);
|
||||
} else {
|
||||
printDebug("Failed to delete file");
|
||||
free(reqDir);
|
||||
if (errno == 1) { // Permission denided
|
||||
return return403Request(socket, ssl);
|
||||
} else { // Catch all (likely file != exist)
|
||||
return return404Request(socket, ssl);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int handlePOSTRequest(int socket, struct HTTPRequest *r, SSL *ssl) {
|
||||
char *phpReturn = NULL;
|
||||
// Supported data types application/x-www-form-urlencoded application/json
|
||||
if (r->requestConLen == NULL) { // Return 411 if length var not specified
|
||||
printDebug("Content Length was not sent in POST request");
|
||||
return return411Request(socket, ssl);
|
||||
}
|
||||
|
||||
if (r->requestConType != NULL) {
|
||||
if (!strcmp(r->requestConType, "application/x-www-form-utlencoded") == 0) {
|
||||
printDebug("Application From Selected");
|
||||
} else {
|
||||
printDebug("Content will likely get parsed wrong");
|
||||
}
|
||||
}
|
||||
|
||||
char phpEnd[5] = ".php";
|
||||
bool endsWithPhp = false;
|
||||
if (strlen(phpEnd) <= strlen(r->requestDir)) {
|
||||
for (int i = 0; i < strlen(phpEnd); i++) {
|
||||
if (r->requestDir[i + strlen(r->requestDir) - strlen(phpEnd)] != phpEnd[i]) {
|
||||
endsWithPhp = false;
|
||||
break;
|
||||
}
|
||||
endsWithPhp = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (endsWithPhp) {
|
||||
phpReturn = php_cgi(r->requestDir, r);
|
||||
if (phpReturn != NULL) {
|
||||
return returnPHPRequest(socket, phpReturn, ssl);
|
||||
}
|
||||
} else {
|
||||
return return200Request(socket, NULL, ssl);
|
||||
}
|
||||
return return500Request(socket, ssl);
|
||||
}
|
||||
|
||||
int handleRequest(unsigned char buffer[], int socket, SSL *ssl) {
|
||||
struct HTTPRequest r; // Holds relevant HTTP request information
|
||||
r.requestConLen = malloc(sizeof(char));
|
||||
@@ -453,6 +205,10 @@ int main(int argc, char **argv) {
|
||||
size_t bufSize = BUFF_READ;
|
||||
unsigned char *buffer = calloc(bufSize, sizeof(unsigned char));
|
||||
|
||||
// Copy WEB_ROOT into extern value
|
||||
WEB_ROOT_DIR = malloc(strlen(WEB_ROOT));
|
||||
strcpy(WEB_ROOT_DIR, WEB_ROOT);
|
||||
|
||||
// Setting up options
|
||||
static const struct option long_options[] = {
|
||||
{"help", no_argument, NULL, 'h'},
|
||||
@@ -625,6 +381,7 @@ int main(int argc, char **argv) {
|
||||
free(certFile);
|
||||
free(listenAddr);
|
||||
free(buffer);
|
||||
free(WEB_ROOT_DIR);
|
||||
close(server_fd);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user