mirror of
https://github.com/opus-tango/http-server-in-c.git
synced 2026-03-20 03:55:25 +00:00
add request handler for http request and response generation
This commit is contained in:
9
Makefile
9
Makefile
@@ -1,11 +1,14 @@
|
|||||||
all: webserver.o client_handler.o
|
all: webserver.o client_handler.o request_handler.o
|
||||||
gcc -o webserver.out webserver.o client_handler.o -lpthread
|
gcc -o webserver.out *.o -lpthread
|
||||||
|
|
||||||
webserver: webserver.c
|
webserver: webserver.c
|
||||||
gcc -c webserver webserver.c
|
gcc -c webserver webserver.c
|
||||||
|
|
||||||
client_handler: client_handler.c
|
client_handler: client_handler.c client_handler.h request_handler.h
|
||||||
gcc -c client_handler client_handler.c
|
gcc -c client_handler client_handler.c
|
||||||
|
|
||||||
|
request_handler: request_handler.c request_handler.h
|
||||||
|
gcc -c request_handler request_handler.c
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o *.out
|
rm -f *.o *.out
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
#include "client_handler.h"
|
#include "client_handler.h"
|
||||||
|
|
||||||
|
#include "request_handler.h"
|
||||||
|
|
||||||
#define BUFFER_SIZE 1024
|
#define BUFFER_SIZE 1024
|
||||||
|
|
||||||
void* client_handler(void* args) {
|
void* client_handler(void* args) {
|
||||||
@@ -11,60 +13,15 @@ void* client_handler(void* args) {
|
|||||||
// Null terminate buffer
|
// Null terminate buffer
|
||||||
buffer[bytes_read] = '\0';
|
buffer[bytes_read] = '\0';
|
||||||
|
|
||||||
// Check if request is GET
|
char* response = (char*)malloc(BUFFER_SIZE);
|
||||||
char* ptr = buffer; // Modifiable pointer to buffer
|
size_t response_length = BUFFER_SIZE;
|
||||||
char* buf_temp =
|
|
||||||
(char*)malloc(10); // Temporary buffer to store request code
|
|
||||||
char* ptr_temp = buf_temp; // Modifiable pointer to temporary buffer
|
|
||||||
// Copy request code to temporary buffer
|
|
||||||
while (*ptr != ' ') {
|
|
||||||
*ptr_temp = *ptr;
|
|
||||||
ptr++;
|
|
||||||
ptr_temp++;
|
|
||||||
}
|
|
||||||
// Null terminate temporary buffer
|
|
||||||
*ptr_temp = '\0';
|
|
||||||
ptr++; // Skip over space
|
|
||||||
if (strcmp(buf_temp, "GET") == 0) {
|
|
||||||
printf("Received a GET request!!\n");
|
|
||||||
} else {
|
|
||||||
printf("Received a non-GET request!!\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get filename
|
handle_request(buffer, bytes_read, response, &response_length);
|
||||||
char* filename = (char*)malloc(100); // Buffer to store filename
|
|
||||||
ptr_temp = filename; // Modifiable pointer to filename
|
|
||||||
*ptr_temp = '.'; // Prepend . to filename
|
|
||||||
ptr_temp++;
|
|
||||||
// Copy filename to temporary buffer
|
|
||||||
while (*ptr != ' ') {
|
|
||||||
// Convert %20 to space
|
|
||||||
if (*ptr == '%' && *(ptr + 1) == '2' && *(ptr + 2) == '0') {
|
|
||||||
ptr += 3;
|
|
||||||
*ptr_temp = ' ';
|
|
||||||
ptr_temp++;
|
|
||||||
} else {
|
|
||||||
// Copy character
|
|
||||||
*ptr_temp = *ptr;
|
|
||||||
ptr++;
|
|
||||||
ptr_temp++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*ptr_temp = '\0'; // Null terminate filename
|
|
||||||
|
|
||||||
// Print filename
|
|
||||||
printf("Filename: %s\n", filename);
|
|
||||||
|
|
||||||
// Send response
|
// Send response
|
||||||
char* response = "HTTP/1.1 200 OK\n\n";
|
send(client, response, response_length, 0);
|
||||||
send(client, response, strlen(response), 0);
|
|
||||||
|
|
||||||
printf("Request:\n");
|
free(response);
|
||||||
printf("%s\n", buffer);
|
|
||||||
|
|
||||||
free(buf_temp);
|
|
||||||
free(filename);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
free(buffer);
|
free(buffer);
|
||||||
|
|||||||
78
request_handler.c
Normal file
78
request_handler.c
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
|
||||||
|
#include "request_handler.h"
|
||||||
|
|
||||||
|
void handle_request(char* request, int length, char* response,
|
||||||
|
size_t* response_length) {
|
||||||
|
request[length] = '\0'; // Null terminate request for printing
|
||||||
|
|
||||||
|
printf("Request ---------\n");
|
||||||
|
printf("%s\n---------\n", request);
|
||||||
|
|
||||||
|
// Check if request is GET
|
||||||
|
char* ptr = request; // Modifiable pointer to request
|
||||||
|
char buf_temp[10]; // Temporary buffer to store request code
|
||||||
|
char* ptr_temp =
|
||||||
|
(char*)&buf_temp; // Modifiable pointer to temporary buffer
|
||||||
|
// Copy request code to temporary buffer
|
||||||
|
while (*ptr != ' ') {
|
||||||
|
*ptr_temp = *ptr;
|
||||||
|
ptr++;
|
||||||
|
ptr_temp++;
|
||||||
|
}
|
||||||
|
// Null terminate temporary buffer
|
||||||
|
*ptr_temp = '\0';
|
||||||
|
ptr++; // Skip over space
|
||||||
|
if (strcmp(buf_temp, "GET") == 0) {
|
||||||
|
printf("Received a GET request!!\n");
|
||||||
|
} else {
|
||||||
|
printf("Received a non-GET request!!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get filename from request url
|
||||||
|
char filename[100]; // Buffer to store filename
|
||||||
|
ptr_temp = (char*)&filename; // Modifiable pointer to filename
|
||||||
|
*ptr_temp = '.'; // Prepend . to filename
|
||||||
|
ptr_temp++;
|
||||||
|
// While loop to copy filename to temporary buffer
|
||||||
|
while (*ptr != ' ') {
|
||||||
|
// Convert %20 to space
|
||||||
|
if (*ptr == '%' && *(ptr + 1) == '2' && *(ptr + 2) == '0') {
|
||||||
|
ptr += 3;
|
||||||
|
*ptr_temp = ' ';
|
||||||
|
ptr_temp++;
|
||||||
|
} else {
|
||||||
|
// Copy character
|
||||||
|
*ptr_temp = *ptr;
|
||||||
|
ptr++;
|
||||||
|
ptr_temp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*ptr_temp = '\0'; // Null terminate filename
|
||||||
|
|
||||||
|
// Print filename
|
||||||
|
printf("Filename: %s\n", filename);
|
||||||
|
|
||||||
|
// Create reponse string
|
||||||
|
ptr_temp = response;
|
||||||
|
char* temp = "HTTP/1.1 200 OK\nContent-Type: text/html\n\n";
|
||||||
|
while (*temp != '\0') {
|
||||||
|
*ptr_temp = *temp;
|
||||||
|
ptr_temp++;
|
||||||
|
temp++;
|
||||||
|
}
|
||||||
|
// Put the filename in the html response
|
||||||
|
temp = filename;
|
||||||
|
while (*temp != '\0') {
|
||||||
|
*ptr_temp = *temp;
|
||||||
|
ptr_temp++;
|
||||||
|
temp++;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ptr_temp = '\0'; // Null terminate response
|
||||||
|
|
||||||
|
printf("Response --------\n");
|
||||||
|
printf("%s\n--------\n", response);
|
||||||
|
|
||||||
|
*response_length = strlen(response);
|
||||||
|
}
|
||||||
11
request_handler.h
Normal file
11
request_handler.h
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#ifndef HTTP_RESPONSE_BUILDER_H
|
||||||
|
#define HTTP_RESPONSE_BUILDER_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
void handle_request(char* request, int length, char* response,
|
||||||
|
size_t* response_length);
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user