http/src/tcp.c
2025-01-29 09:32:12 -05:00

117 lines
2.4 KiB
C

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <poll.h>
#include <errno.h>
#include "include/tcp.h"
#include "include/http.h"
void setup_socket(server_conn_t* conn)
{
int err;
size_t sockaddr_len;
conn->socket = socket(AF_INET, SOCK_STREAM, 0);
if (conn->socket == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
conn->server_info.sin_family = AF_INET;
conn->server_info.sin_addr.s_addr = INADDR_ANY;
conn->server_info.sin_port = htons(DEFAULT_PORT);
conn->server_info_len = sizeof(conn->server_info);
err = bind(conn->socket, (const struct sockaddr*) &(conn->server_info),
(socklen_t) conn->server_info_len);
if (err == -1) {
perror("bind");
close(conn->socket);
exit(EXIT_FAILURE);
}
err = listen(conn->socket, 1);
if (err == -1) {
perror("listen");
close(conn->socket);
exit(EXIT_FAILURE);
}
}
void recv_message(char** buffer, int socket)
{
ulong current_size, bytes_recv;
int status;
current_size = bytes_recv = 0;
status = 0;
do {
// if we received more data, lets realloc
if (bytes_recv >= current_size) {
// temporary buffer so if we fail a realloc we don't lose data
char* tmp;
current_size += BUFFER_INC_LEN;
tmp = realloc(*buffer, current_size);
if (tmp == NULL) {
perror("realloc");
break;
}
// we succeeded so lets assign the new buffer
*buffer = tmp;
}
// lets recv BUFFER_INC_LEN amount of bytes
status = recv(socket, *buffer + bytes_recv, BUFFER_INC_LEN, MSG_DONTWAIT);
if (status < 0) {
if (errno != EAGAIN && errno != EWOULDBLOCK) // these signify that that were just no data to read, dw about this
perror("recv");
break; // don't want to crash on a recv failure, lets just break
}
bytes_recv += status;
} while (status == BUFFER_INC_LEN); // break when we stop receiving, status < BUFFER_INC_LEN means no more data after this last call
(*buffer)[bytes_recv] = '\0';
}
void* connection_handler(void* arg)
{
int client_socket = *(int*) arg;
http_request request;
char* buffer = NULL;
recv_message(&buffer, client_socket);
puts(buffer);
parse_http_request(&buffer, &request);
printf("%s %s %1.1f\n", http_method_to_str(request.method), request.request_uri, request.version);
/**
* Handle HTTP request here :)
*/
// recv message
// parse
//
// create payload
//
// send payload
free(buffer);
close(client_socket);
return NULL;
}
#include "include/tcp.h"