source: benchmark/io/http/worker.cfa @ 9153e53

ADTarm-ehast-experimentalenumforall-pointer-decayjacob/cs343-translationnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since 9153e53 was 97748ee, checked in by Thierry Delisle <tdelisle@…>, 4 years ago

Worker now supports /ping uri which just answers empty reponse.

  • Property mode set to 100644
File size: 3.0 KB
RevLine 
[0aec496]1#include "worker.hfa"
2
3#include <errno.h>
4#include <stdio.h>
5#include <string.h>
[c82af9f]6#include <unistd.h>
[0aec496]7
8#include <iofwd.hfa>
9
10#include "options.hfa"
11#include "protocol.hfa"
12#include "filecache.hfa"
13
14//=============================================================================================
15// Worker Thread
16//=============================================================================================
17void ?{}( Worker & this ) {
[2ecbd7b]18        ((thread&)this){ "Server Worker Thread", *options.clopts.instance };
[d9c2284]19        this.pipe[0] = -1;
20        this.pipe[1] = -1;
[481ee28]21        this.done = false;
22}
23
24extern "C" {
25extern int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
[0aec496]26}
27
28void main( Worker & this ) {
[e235429]29        park();
[d9c2284]30        /* paranoid */ assert( this.pipe[0] != -1 );
31        /* paranoid */ assert( this.pipe[1] != -1 );
32
[0aec496]33        CONNECTION:
[e95a117]34        for() {
[481ee28]35                if( options.log ) printf("=== Accepting connection ===\n");
[ece0e80]36                int fd = cfa_accept4( this.[sockfd, addr, addrlen, flags], 0, -1`s, &this.cancel, 0p );
[481ee28]37                // int fd = accept4( this.[sockfd, addr, addrlen, flags] );
[8e3034d]38                if(fd < 0) {
39                        if( errno == ECONNABORTED ) break;
[481ee28]40                        if( errno == EINVAL && this.done ) break;
[8e3034d]41                        abort( "accept error: (%d) %s\n", (int)errno, strerror(errno) );
42                }
[e95a117]43
[481ee28]44                if( options.log ) printf("=== New connection %d, waiting for requests ===\n", fd);
[0aec496]45                REQUEST:
46                for() {
47                        bool closed;
48                        HttpCode code;
49                        const char * file;
50                        size_t name_size;
51
52                        // Read the http request
[03ed863]53                        size_t len = options.socket.buflen;
[0aec496]54                        char buffer[len];
[481ee28]55                        if( options.log ) printf("=== Reading request ===\n");
[ece0e80]56                        [code, closed, file, name_size] = http_read(fd, buffer, len, &this.cancel);
[0aec496]57
58                        // if we are done, break out of the loop
59                        if( closed ) {
[481ee28]60                                if( options.log ) printf("=== Connection closed ===\n");
[56911ce]61                                close(fd);
[0aec496]62                                continue CONNECTION;
63                        }
64
65                        // If this wasn't a request retrun 400
66                        if( code != OK200 ) {
[97748ee]67                                printf("=== Invalid Request : %d ===\n", code_val(code));
[0aec496]68                                answer_error(fd, code);
69                                continue REQUEST;
70                        }
71
[561dd26]72                        if(0 == strncmp(file, "plaintext", min(name_size, sizeof("plaintext") ))) {
[481ee28]73                                if( options.log ) printf("=== Request for /plaintext ===\n");
[0aec496]74
[561dd26]75                                char text[] = "Hello, World!\n";
[0aec496]76
[561dd26]77                                // Send the header
78                                answer_plain(fd, text, sizeof(text));
79
[97748ee]80                                if( options.log ) printf("=== Answer sent ===\n");
81                                continue REQUEST;
82                        }
[561dd26]83
[97748ee]84                        if(0 == strncmp(file, "ping", min(name_size, sizeof("ping") ))) {
85                                if( options.log ) printf("=== Request for /ping ===\n");
[561dd26]86
87                                // Send the header
[97748ee]88                                answer_empty(fd);
[561dd26]89
[97748ee]90                                if( options.log ) printf("=== Answer sent ===\n");
91                                continue REQUEST;
[0aec496]92                        }
93
[97748ee]94                        if( options.log ) printf("=== Request for file %.*s ===\n", (int)name_size, file);
95
96                        // Get the fd from the file cache
97                        int ans_fd;
98                        size_t count;
99                        [ans_fd, count] = get_file( file, name_size );
100
101                        // If we can't find the file, return 404
102                        if( ans_fd < 0 ) {
103                                printf("=== File Not Found ===\n");
104                                answer_error(fd, E404);
105                                continue REQUEST;
106                        }
107
108                        // Send the header
109                        answer_header(fd, count);
110
111                        // Send the desired file
112                        sendfile( this.pipe, fd, ans_fd, count);
113
[481ee28]114                        if( options.log ) printf("=== Answer sent ===\n");
[0aec496]115                }
116        }
117}
Note: See TracBrowser for help on using the repository browser.