diff --git a/http.c b/http.c new file mode 100644 index 0000000..3582bdd --- /dev/null +++ b/http.c @@ -0,0 +1,54 @@ +#include "http.h" +#include +#include +#include + +/* 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); +} + diff --git a/http.h b/http.h new file mode 100644 index 0000000..12ef136 --- /dev/null +++ b/http.h @@ -0,0 +1,26 @@ +#ifndef HTTP_H +#define HTTP_H + +#include +#include + +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 */ diff --git a/main.c b/main.c deleted file mode 100644 index 4ecc194..0000000 --- a/main.c +++ /dev/null @@ -1,62 +0,0 @@ -#include -#include -#include -#include - -#include -#include -#include - -#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; -} diff --git a/server.c b/server.c new file mode 100644 index 0000000..6f10808 --- /dev/null +++ b/server.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include + +#include "http.h" +#include + +#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; +}