aboutsummaryrefslogtreecommitdiff
path: root/launch-web.c
blob: ff2970bd2f5e20a45f2db743906158ae30440e2e (plain)
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 <iceys-utils.h>
#include <Server.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;
}