117 lines
2.4 KiB
C
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"
|