-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
110 lines (83 loc) · 2.58 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include "lib/Http_server.h"
#include "lib/routing.h"
#include "lib/http_content_resolver.h"
#include "lib/urls.h"
typedef struct _ResponseBuffer {
char *buffer_content;
int buffer_size;
} ResponseBuffer;
char *get_resource_info(HashTable *table, char *route);
ResponseBuffer *http_response_buffer(char *resource);
char *get_resource_info(HashTable *table, char *route)
{
int i = hash_function(route);
Item *resource_content = table->items[i];
if (resource_content == NULL)
return NULL;
while (strcmp(resource_content->route, route) != 0) {
if ((resource_content = resource_content->next_link) == NULL)
return NULL;
}
return resource_content->resource;
}
ResponseBuffer *http_response_buffer(char *resource)
{
FILE *resource_ptr = get_resource_ptr(resource);
if (resource_ptr == NULL) {
perror("The resource was not found");
return NULL;
}
size_t file_size = get_file_size(resource_ptr);
char *file_content = get_file_content(resource_ptr, file_size);
ResponseHeader *header = get_response_header(strchr(resource, '.'), resource);
char *full_response = (char*)malloc(file_size + header->header_size + 1);
sprintf(full_response, "%s%s", header->header_content, file_content);
fclose(resource_ptr);
free(file_content);
free(header);
ResponseBuffer *buffer = (ResponseBuffer*)malloc(sizeof(ResponseBuffer));
buffer->buffer_content = full_response;
buffer->buffer_size = strlen(full_response);
return buffer;
}
int main(void)
{
HttpServer *server = create_server();
server->routes = defining_routes();
if (server == NULL)
exit(EXIT_FAILURE);
for (;;) {
int client_socket;
if ((client_socket = handle_client(server->socket)) < 0)
continue;
Request *client_request = accept_request(client_socket);
char *uri = request_uri(client_request->line);
ResponseBuffer *response;
bool is_file_route = strchr(uri, '.') ? true : false;
if (is_file_route) {
response = http_response_buffer(uri);
}
else {
char *resource_linked_to_route = get_resource_info(server->routes, uri);
response = http_response_buffer(resource_linked_to_route);
}
if (response == NULL) {
char *notfound = "HTTP/1.1 404 Not Found\nContent-Length: 0\n\n";
send_response(client_socket, notfound, strlen(notfound));
free_client(client_request);
free(uri);
continue;
}
send_response(client_socket, response->buffer_content, response->buffer_size);
free_client(client_request);
free(response->buffer_content);
free(response);
free(uri);
}
return EXIT_SUCCESS;
}