turn server into library + driver code

This commit is contained in:
2025-06-02 00:57:43 +02:00
parent feee7b53cc
commit 2e22186952
4 changed files with 125 additions and 62 deletions

54
http.c Normal file
View File

@ -0,0 +1,54 @@
#include "http.h"
#include <strops.h>
#include <stdio.h>
#include <stdlib.h>
/* TODO: https://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable */
int http_init(int port, int connection_amount) {
int ret;
int server_sock = socket(AF_INET, SOCK_STREAM, 0);
if (server_sock == -1) {
perror("Couldn't create socket");
return -1;
}
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(port);
if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof server_addr) == -1) {
perror("Couldn't bind socket");
return -1;
}
if (listen(server_sock, connection_amount) == -1) {
perror("Cannot listen on socket");
return -1;
}
return server_sock;
}
HTTP_Request* http_accept(int server) {
int client_sock = accept(server, NULL, NULL);
if (client_sock == -1) {
perror("Couldn't connect to client");
return NULL;
}
HTTP_Request *request = malloc(sizeof(HTTP_Request));
request->client_sock = client_sock;
/* TODO: Read entire message and parse into request struct */
ssize_t bytes_read;
size_t bufsize = 1024;
char buf[bufsize];
bytes_read = read(request->client_sock, buf, bufsize - 1);
if (bytes_read == -1) {
perror("Failed to read data");
}
printf("%s", buf);
}

26
http.h Normal file
View File

@ -0,0 +1,26 @@
#ifndef HTTP_H
#define HTTP_H
#include <netinet/in.h>
#include <sys/socket.h>
typedef struct {
int client_sock;
char *method;
char *target;
char *version;
/* Field_Lines (Header) */
char *body;
} HTTP_Request;
typedef struct {
char *version;
unsigned int status;
/* Field_Lines (Header) */
char *body;
} HTTP_Response;
int http_init(int port, int connection_amount);
HTTP_Request* http_accept(int server);
#endif /* HTTP_H */

62
main.c
View File

@ -1,62 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#define PORT 8080
void handle_client(int client) {
ssize_t bytes_read;
size_t bufsize = 1024;
char buf[bufsize];
bytes_read = read(client, buf, bufsize - 1);
if (bytes_read == -1) {
fprintf(stderr, "Failed to read data. Error = %s\n", strerror(errno));
}
printf("%s\n", buf);
}
int main() {
int ret;
int server = socket(AF_INET, SOCK_STREAM, 0);
if (server == -1) {
fprintf(stderr, "Couldn't create socket. Error = %s\n", strerror(errno));
return 1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(PORT);
ret = bind(server, (struct sockaddr*)&addr, sizeof(addr));
if (ret == -1) {
fprintf(stderr, "Couldn't bind socket. Error = %s\n", strerror(errno));
return 1;
}
ret = listen(server, 3);
if (ret == -1) {
fprintf(stderr, "Cannot listen on socket. Error = %s", strerror(errno));
return 1;
}
int client;
while(1) {
client = accept(server, (struct sockaddr*)&addr, sizeof(addr));
if (client == -1) {
fprintf(stderr, "Couldn't connect to client. Error = %s\n", strerror(errno));
}
handle_client(client);
close(client);
}
/* Unreacheable Code */
close(server);
return 0;
}

45
server.c Normal file
View File

@ -0,0 +1,45 @@
#include <strops.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include "http.h"
#include <unistd.h>
#define PORT 8080
HTTP_Response* handle_client(HTTP_Request *request) {
ssize_t bytes_written;
char *response = "HTTP/1.1 200 \r\n\r\n";
bytes_written = write(request->client_sock, response, strops_length(response));
if (bytes_written != strops_length(response)) {
fprintf(stderr, "Incomplete write\n");
}
return NULL;
}
int main() {
int ret;
int server;
server = http_init(PORT, 3);
if (server == -1) {
return 1;
}
HTTP_Request *request;
while(1) {
request = http_accept(server);
if (request == NULL) {
break;
}
handle_client(request);
close(request->client_sock);
free(request);
break;
}
close(server);
return 0;
}