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
|
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <Server.c>
#include <iceys-utils.h>
void server_close(struct Server *server){
server->running=false;
sleep(1);
int shuterr=shutdown(server->socket,SHUT_RDWR);
int closeerr=close(server->socket);
printf("\nshutdown with %d : %d\n",shuterr,closeerr);
//free(server);
}
void *server_loop(void *threadarg){
struct Server *server;
server=(struct Server *) threadarg;
char buffer[30000]={0};
int addrlen= sizeof(server->address);
int new_socket;
char *meta_type="\r\ncontent-type: text/html\r\n\r\n";
printf("running on port: %d",server->port);
while (server->running){
char metadata[100]="";
printf("\n=== WAITING FOR CONNECTION ===\n\n");
new_socket = accept(server->socket, (struct sockaddr *)&server->address, (socklen_t *)&addrlen);
if(new_socket<0){ break; }
if(read(new_socket,buffer,29999)<0){ printf("\nREAD FAILED\n\n"); close(new_socket); break; }
buffer[29999]='\0';
printf("%s\n",buffer);
char response[30000] = {0};
char file_req_buf[1000]={0};
strcpy(file_req_buf,server->html_folder);
char file_req[1000]={0};
str_before_nth(buffer+5, file_req, ' ', 0);
strcat(file_req_buf,file_req);
printf("file req: %s====\n",file_req_buf);
if(strncmp(file_req, "", 1) == 0){
strcat(file_req_buf,"index.html");
}
char file_req_buf2[1000]={0};
strcpy(file_req_buf2,str_remove_all(file_req_buf,".."));
printf("file ret: %s====\n",file_req_buf);
if (access(file_req_buf, F_OK) == 0) {
char *status="HTTP/1.0 200 OK";
memcpy(metadata,status,strlen(status));
memcpy(metadata+strlen(metadata),meta_type,strlen(meta_type));
memcpy(response, metadata, strlen(metadata));
FILE* file=fopen(file_req_buf, "r");
fread(response + strlen(metadata), 30000 - strlen(metadata) - 1, 1, file);
fclose(file);
} else {
char *status="HTTP/1.0 404 Not Found";
memcpy(metadata,status,strlen(status));
memcpy(metadata+strlen(metadata),meta_type,strlen(meta_type));
memcpy(response, metadata, strlen(metadata));
char* error = "error 404 file not found";
memcpy(response + strlen(metadata), error, strlen(error));
}
printf("\n\n==response==\n%s\n",response);
write(new_socket, response, strlen(response));
close(new_socket);
}
pthread_exit(NULL);
}
pthread_t launch(struct Server *server){
//HTTP/1.0 200 OK
pthread_t id;
int thread_err=pthread_create(&id, NULL, server_loop, (void *) server);
return id;
}
|