Commit 90476e07d827a3bf6d5361a91a9958930fbddf9a
1 parent
382fd0be
add StreamReader interface, modify HttpRequestParser and Server to use it
Showing
12 changed files
with
233 additions
and
88 deletions
1 | +2012-02-06 11:20:00 +0100 Georg Hopp | ||
2 | + | ||
3 | + * add StreamReader interface, modify HttpRequestParser and Server to use it (HEAD, master) | ||
4 | + | ||
5 | +2012-02-06 11:15:00 +0100 Georg Hopp | ||
6 | + | ||
7 | + * add missing include to stdarg.h | ||
8 | + | ||
9 | +2012-02-06 10:45:33 +0100 Georg Hopp | ||
10 | + | ||
11 | + * implement clone selector | ||
12 | + | ||
13 | +2012-02-06 10:43:59 +0100 Georg Hopp | ||
14 | + | ||
15 | + * add ability to call interface methods with return value | ||
16 | + | ||
17 | +2012-02-06 02:37:55 +0100 Georg Hopp | ||
18 | + | ||
19 | + * make build system work again | ||
20 | + | ||
21 | +2012-02-06 02:37:24 +0100 Georg Hopp | ||
22 | + | ||
23 | + * remove inline stuff for now ... add carefully again later perhaps | ||
24 | + | ||
25 | +2012-02-06 00:57:26 +0100 Georg Hopp | ||
26 | + | ||
27 | + * and also mod conigure.ac | ||
28 | + | ||
29 | +2012-02-06 00:55:44 +0100 Georg Hopp | ||
30 | + | ||
31 | + * makefile modification for new class stuff | ||
32 | + | ||
33 | +2012-02-05 22:55:16 +0100 Georg Hopp | ||
34 | + | ||
35 | + * changed class tool. Now multiple interface per class are supported as well as simple inheritence. | ||
36 | + | ||
37 | +2012-02-05 22:47:10 +0100 Georg Hopp | ||
38 | + | ||
39 | + * some latest work | ||
40 | + | ||
41 | +2012-02-05 22:44:59 +0100 Georg Hopp | ||
42 | + | ||
43 | + * added some documentation | ||
44 | + | ||
45 | +2012-02-05 22:42:37 +0100 Georg Hopp | ||
46 | + | ||
47 | + * changes related to server code | ||
48 | + | ||
49 | +2012-01-19 16:41:41 +0100 Georg Hopp | ||
50 | + | ||
51 | + * added some valueable thought about cclass and how this structure might evolve to a real class | ||
52 | + | ||
1 | 2012-01-18 07:52:07 +0100 Georg Hopp | 53 | 2012-01-18 07:52:07 +0100 Georg Hopp |
2 | 54 | ||
3 | - * add testserver and did some fixes not shown by my incomplete tests (HEAD, master) | 55 | + * add testserver and did some fixes not shown by my incomplete tests |
4 | 56 | ||
5 | 2012-01-17 15:40:07 +0100 Georg Hopp | 57 | 2012-01-17 15:40:07 +0100 Georg Hopp |
6 | 58 |
1 | #ifndef __HTTP_REQUEST_H__ | 1 | #ifndef __HTTP_REQUEST_H__ |
2 | #define __HTTP_REQUEST_H__ | 2 | #define __HTTP_REQUEST_H__ |
3 | 3 | ||
4 | -#include "cclass.h" | 4 | +#include "class.h" |
5 | 5 | ||
6 | -CLASS(HTTP_REQUEST) { | ||
7 | - char * http_version; | ||
8 | - char * uri; | ||
9 | - char * method; | 6 | +CLASS(HttpRequest) { |
7 | + char * http_version; | ||
8 | + char * uri; | ||
9 | + char * method; | ||
10 | 10 | ||
11 | struct { | 11 | struct { |
12 | char * name; | 12 | char * name; |
13 | char * value; | 13 | char * value; |
14 | - } header[128]; | 14 | + } header[128]; |
15 | 15 | ||
16 | - char * body; | ||
17 | - | ||
18 | - unsigned char done; | 16 | + char * body; |
17 | + char done; | ||
19 | }; | 18 | }; |
20 | 19 | ||
21 | #endif /* __HTTP_REQUEST_H__ */ | 20 | #endif /* __HTTP_REQUEST_H__ */ |
1 | #ifndef __HTTP_REQUEST_PARSER_H__ | 1 | #ifndef __HTTP_REQUEST_PARSER_H__ |
2 | #define __HTTP_REQUEST_PARSER_H__ | 2 | #define __HTTP_REQUEST_PARSER_H__ |
3 | 3 | ||
4 | -#include "cclass.h" | ||
5 | -#include "server.h" | ||
6 | -#include "http/request.h" | ||
7 | -#include "http/request_queue.h" | 4 | +#include "class.h" |
5 | +//#include "http/request.h" | ||
6 | +//#include "http/request_queue.h" | ||
8 | 7 | ||
9 | #define HTTP_REQUEST_PARSER_READ_CHUNK 1024 | 8 | #define HTTP_REQUEST_PARSER_READ_CHUNK 1024 |
10 | 9 | ||
11 | -#define HTTP_REQUEST_PARSER_START 0 | ||
12 | -#define HTTP_REQUEST_PARSER_REQUEST_LINE_DONE 1 | ||
13 | -#define HTTP_REQUEST_PARSER_HEADERS_DONE 2 | ||
14 | -#define HTTP_REQUEST_PARSER_DONE 3 | 10 | +typedef enum e_HttpRequestState { |
11 | + HTTP_REQUEST_START=0, | ||
12 | + HTTP_REQUEST_REQEUST_LINE_DONE, | ||
13 | + HTTP_REQUEST_HEADERS_DONE, | ||
14 | + HTTP_REQUEST_DONE | ||
15 | +} HttpRequestState; | ||
15 | 16 | ||
16 | 17 | ||
17 | -CLASS(HTTP_REQUEST_PARSER) { | ||
18 | - server_read_hook get_data; | 18 | +CLASS(HttpRequestParser) { |
19 | + char * buffer; | ||
20 | + size_t buffer_used; | ||
19 | 21 | ||
20 | - char * buffer; | ||
21 | - size_t buffer_used; | ||
22 | - | ||
23 | - HTTP_REQUEST_QUEUE request_queue; | ||
24 | - | ||
25 | - unsigned char state; | 22 | + //HttpRequestQueue request_queue; |
23 | + HttpRequestState state; | ||
26 | }; | 24 | }; |
27 | 25 | ||
28 | -void http_request_parser_parse(const char * buffer, size_t size); | ||
29 | - | ||
30 | #endif /* __HTTP_REQUEST_PARSER_H__ */ | 26 | #endif /* __HTTP_REQUEST_PARSER_H__ */ |
31 | 27 | ||
32 | // vim: set ts=4 sw=4: | 28 | // vim: set ts=4 sw=4: |
1 | #ifndef __HTTP_REQUEST_QUEUE_H__ | 1 | #ifndef __HTTP_REQUEST_QUEUE_H__ |
2 | #define __HTTP_REQUEST_QUEUE_H__ | 2 | #define __HTTP_REQUEST_QUEUE_H__ |
3 | 3 | ||
4 | -#include "cclass.h" | 4 | +#include "class.h" |
5 | #include "http/request.h" | 5 | #include "http/request.h" |
6 | 6 | ||
7 | #define HTTP_REQUEST_QUEUE_MAX 1024 | 7 | #define HTTP_REQUEST_QUEUE_MAX 1024 |
8 | 8 | ||
9 | 9 | ||
10 | -CLASS(HTTP_REQUEST_QUEUE) { | ||
11 | - REQUEST requests[HTTP_REQUEST_QUEUE_MAX]; | 10 | +CLASS(HttpRequestQueue) { |
11 | + HttpRequest requests[HTTP_REQUEST_QUEUE_MAX]; | ||
12 | size_t nrequests; | 12 | size_t nrequests; |
13 | } | 13 | } |
14 | 14 |
include/interface/stream_reader.h
0 → 100644
1 | +#ifndef __STREAM_READER_H__ | ||
2 | +#define __STREAM_READER_H__ | ||
3 | + | ||
4 | +#include <sys/types.h> | ||
5 | + | ||
6 | +typedef size_t (* fptr_streamReaderRead)(void *, int fd); | ||
7 | + | ||
8 | +extern const struct interface i_StreamReader; | ||
9 | + | ||
10 | +struct i_StreamReader { | ||
11 | + const struct interface * const _; | ||
12 | + fptr_streamReaderRead read; | ||
13 | +}; | ||
14 | + | ||
15 | +extern size_t streamReaderRead(void *, int fd); | ||
16 | + | ||
17 | +#endif // __STREAM_READER_H__ | ||
18 | + | ||
19 | +// vim: set ts=4 sw=4: |
@@ -26,18 +26,20 @@ typedef void (*server_read_hook)(const char *, size_t); | @@ -26,18 +26,20 @@ typedef void (*server_read_hook)(const char *, size_t); | ||
26 | CLASS(Server) { | 26 | CLASS(Server) { |
27 | Logger logger; | 27 | Logger logger; |
28 | Sock sock; | 28 | Sock sock; |
29 | + void * reader; | ||
30 | + | ||
29 | nfds_t nfds; | 31 | nfds_t nfds; |
30 | struct pollfd fds[POLL_FD_NSIZE]; | 32 | struct pollfd fds[POLL_FD_NSIZE]; |
31 | 33 | ||
32 | struct { | 34 | struct { |
33 | Sock sock; | 35 | Sock sock; |
36 | + void * reader; | ||
37 | + | ||
34 | char * wbuf; | 38 | char * wbuf; |
35 | char * rbuf; | 39 | char * rbuf; |
36 | unsigned int rpos; | 40 | unsigned int rpos; |
37 | unsigned int wpos; | 41 | unsigned int wpos; |
38 | } conns[POLL_FD_NSIZE]; | 42 | } conns[POLL_FD_NSIZE]; |
39 | - | ||
40 | - server_read_hook read_hook; | ||
41 | }; | 43 | }; |
42 | 44 | ||
43 | void serverRun(Server this); | 45 | void serverRun(Server this); |
@@ -5,10 +5,13 @@ CLASS = class.c interface.c interface/class.c | @@ -5,10 +5,13 @@ CLASS = class.c interface.c interface/class.c | ||
5 | SOCKET = socket.c socket/accept.c socket/connect.c socket/listen.c | 5 | SOCKET = socket.c socket/accept.c socket/connect.c socket/listen.c |
6 | SERVER = server.c server/run.c server/close_conn.c | 6 | SERVER = server.c server/run.c server/close_conn.c |
7 | LOGGER = logger.c logger/stderr.c logger/syslog.c interface/logger.c | 7 | LOGGER = logger.c logger/stderr.c logger/syslog.c interface/logger.c |
8 | +HTTP = interface/stream_reader.c http/request_parser.c | ||
8 | 9 | ||
9 | AM_CFLAGS = -Wall -I ../include/ | 10 | AM_CFLAGS = -Wall -I ../include/ |
10 | 11 | ||
11 | bin_PROGRAMS = testserver | 12 | bin_PROGRAMS = testserver |
12 | 13 | ||
13 | -testserver_SOURCES = testserver.c $(CLASS) $(SOCKET) $(SERVER) $(LOGGER) signalHandling.c daemonize.c | 14 | +testserver_SOURCES = testserver.c \ |
15 | + $(CLASS) $(SOCKET) $(SERVER) $(LOGGER) $(HTTP) \ | ||
16 | + signalHandling.c daemonize.c | ||
14 | testserver_CFLAGS = -Wall -I ../include/ | 17 | testserver_CFLAGS = -Wall -I ../include/ |
1 | #include <stdlib.h> | 1 | #include <stdlib.h> |
2 | +#include <string.h> | ||
3 | +#include <stdlib.h> | ||
4 | +#include <stdio.h> | ||
5 | +#include <unistd.h> | ||
6 | +#include <sys/types.h> | ||
2 | 7 | ||
3 | -#include "cclass.h" | ||
4 | -#include "http/request.h" | 8 | +#include "class.h" |
5 | #include "http/request_parser.h" | 9 | #include "http/request_parser.h" |
6 | - | ||
7 | - | ||
8 | -INIT_CLASS(HTTP_REQUEST_PARSER); | ||
9 | - | ||
10 | - | ||
11 | -__construct(LOGGER) | 10 | +#include "interface/class.h" |
11 | +#include "interface/stream_reader.h" | ||
12 | +//#include "http/request.h" | ||
13 | +//#include "http/request_queue.h" | ||
14 | + | ||
15 | +static | ||
16 | +void | ||
17 | +httpRequestParserParse(char * data, size_t * size); | ||
18 | + | ||
19 | +static | ||
20 | +void | ||
21 | +ctor(void * _this, va_list * params) | ||
12 | { | 22 | { |
13 | - this->request_queue = va_arg(*params, HTTP_REQUEST_QUEUE); | 23 | + HttpRequestParser this = _this; |
24 | + | ||
25 | + //this->request_queue = va_arg(*params, HttpRequestQueue); | ||
14 | 26 | ||
15 | this->buffer = malloc(HTTP_REQUEST_PARSER_READ_CHUNK); | 27 | this->buffer = malloc(HTTP_REQUEST_PARSER_READ_CHUNK); |
16 | } | 28 | } |
17 | 29 | ||
18 | -__destruct(LOGGER) | 30 | +static |
31 | +void | ||
32 | +dtor(void * _this) | ||
19 | { | 33 | { |
34 | + HttpRequestParser this = _this; | ||
35 | + | ||
20 | free(this->buffer); | 36 | free(this->buffer); |
21 | } | 37 | } |
22 | 38 | ||
23 | -__jsonConst(LOGGER) {} | ||
24 | -__toJson(LOGGER) {} | ||
25 | -__clear(LOGGER) {} | ||
26 | - | ||
27 | - | ||
28 | -static void | ||
29 | -get_data(HTTP_REQUEST_PARSER this, const char * data, size_t size) | 39 | +static |
40 | +void | ||
41 | +_clone(void * _this, void * _base) | ||
30 | { | 42 | { |
31 | - size_t remaining, chunks; | 43 | + HttpRequestParser this = _this; |
44 | + HttpRequestParser base = _base; | ||
45 | + size_t chunks; | ||
46 | + | ||
47 | + //this->request_queue = base->request_queue; | ||
48 | + this->buffer_used = base->buffer_used; | ||
32 | 49 | ||
33 | - remaining = this->buffer_used % HTTP_REQUEST_PARSER_READ_CHUNK; | ||
34 | - chunks = this->buffer_used / HTTP_REQUEST_PARSER_READ_CHUNK; | 50 | + chunks = this->buffer_used / HTTP_REQUEST_PARSER_READ_CHUNK; |
51 | + chunks++; | ||
35 | 52 | ||
36 | - chunks = (0 == remaining) ? chunks++ : chunks; | 53 | + this->buffer = malloc(chunks * HTTP_REQUEST_PARSER_READ_CHUNK); |
54 | + memcpy(this->buffer, base->buffer, this->buffer_used); | ||
55 | +} | ||
37 | 56 | ||
38 | - if (size > remaining) { | ||
39 | - this->buffer = | ||
40 | - realloc(this->buffer, chunks * HTTP_REQUEST_PARSER_READ_CHUNK); | 57 | +static |
58 | +size_t | ||
59 | +get_data(void * _this, int fd) | ||
60 | +{ | ||
61 | + HttpRequestParser this = _this; | ||
62 | + size_t remaining, chunks; | ||
63 | + char buffer[1024]; | ||
64 | + | ||
65 | + size_t size = read(fd, buffer, 1024); | ||
66 | + | ||
67 | + if (0 < size) { | ||
68 | + remaining = this->buffer_used % HTTP_REQUEST_PARSER_READ_CHUNK; | ||
69 | + chunks = this->buffer_used / HTTP_REQUEST_PARSER_READ_CHUNK; | ||
70 | + | ||
71 | + /** | ||
72 | + * because a division always rounds down | ||
73 | + * chunks holds exactly the currently allocated chunks if | ||
74 | + * remaining equals 0 but there is no space left. | ||
75 | + * Else chunks holds the actually allocated amount of chunks | ||
76 | + * minus 1. | ||
77 | + * For this reason chunks always has to be increased by 1. | ||
78 | + */ | ||
79 | + chunks++; | ||
80 | + | ||
81 | + if (size > remaining) { | ||
82 | + this->buffer = | ||
83 | + realloc(this->buffer, chunks * HTTP_REQUEST_PARSER_READ_CHUNK); | ||
84 | + } | ||
85 | + | ||
86 | + memcpy(this->buffer + this->buffer_used, buffer, size); | ||
87 | + this->buffer_used += size; | ||
88 | + | ||
89 | + httpRequestParserParse(this->buffer, &this->buffer_used); | ||
41 | } | 90 | } |
42 | 91 | ||
43 | - memcpy(this->buffer + this->buffer_used, data, size); | ||
44 | - this->buffer_used += size; | 92 | + return size; |
45 | } | 93 | } |
46 | 94 | ||
47 | -void http_request_parser_parse(const char * data, size_t size) | 95 | +INIT_IFACE(Class, ctor, dtor, _clone); |
96 | +INIT_IFACE(StreamReader, get_data); | ||
97 | +CREATE_CLASS(HttpRequestParser, NULL, IFACE(Class), IFACE(StreamReader)); | ||
98 | + | ||
99 | +static | ||
100 | +void | ||
101 | +httpRequestParserParse(char * data, size_t * size) | ||
48 | { | 102 | { |
103 | + data[*size] = 0; | ||
104 | + printf("%s", data); | ||
105 | + *size = 0; | ||
49 | } | 106 | } |
50 | 107 | ||
51 | // vim: set ts=4 sw=4: | 108 | // vim: set ts=4 sw=4: |
src/interface/stream_reader.c
0 → 100644
1 | +#include "class.h" | ||
2 | +#include "interface/stream_reader.h" | ||
3 | + | ||
4 | +const struct interface i_StreamReader = { | ||
5 | + "streamReader", | ||
6 | + 1 | ||
7 | +}; | ||
8 | + | ||
9 | +size_t | ||
10 | +streamReaderRead(void * object, int fd) | ||
11 | +{ | ||
12 | + size_t ret; | ||
13 | + | ||
14 | + RETCALL(object, StreamReader, read, ret, fd); | ||
15 | + | ||
16 | + return ret; | ||
17 | +} | ||
18 | + | ||
19 | +// vim: set ts=4 sw=4: |
@@ -17,6 +17,7 @@ ctor(void * _this, va_list * params) | @@ -17,6 +17,7 @@ ctor(void * _this, va_list * params) | ||
17 | unsigned int backlog; | 17 | unsigned int backlog; |
18 | 18 | ||
19 | this->logger = va_arg(* params, Logger); | 19 | this->logger = va_arg(* params, Logger); |
20 | + this->reader = va_arg(* params, void*); | ||
20 | port = va_arg(* params, int); | 21 | port = va_arg(* params, int); |
21 | backlog = va_arg(* params, unsigned int); | 22 | backlog = va_arg(* params, unsigned int); |
22 | 23 | ||
@@ -40,6 +41,7 @@ dtor(void * _this) | @@ -40,6 +41,7 @@ dtor(void * _this) | ||
40 | * @TODO do some finalization...buffer handling...etc. | 41 | * @TODO do some finalization...buffer handling...etc. |
41 | */ | 42 | */ |
42 | delete(&(this->conns[i]).sock); | 43 | delete(&(this->conns[i]).sock); |
44 | + delete(&(this->conns[i]).reader); | ||
43 | } | 45 | } |
44 | 46 | ||
45 | delete(&this->sock); | 47 | delete(&this->sock); |
@@ -9,6 +9,7 @@ | @@ -9,6 +9,7 @@ | ||
9 | #include "logger.h" | 9 | #include "logger.h" |
10 | #include "signalHandling.h" | 10 | #include "signalHandling.h" |
11 | #include "interface/class.h" | 11 | #include "interface/class.h" |
12 | +#include "interface/stream_reader.h" | ||
12 | 13 | ||
13 | #undef MAX | 14 | #undef MAX |
14 | #define MAX(x,y) ((x) > (y) ? (x) : (y)) | 15 | #define MAX(x,y) ((x) > (y) ? (x) : (y)) |
@@ -52,9 +53,10 @@ serverHandleAccept(Server this) | @@ -52,9 +53,10 @@ serverHandleAccept(Server this) | ||
52 | acc = socketAccept(this->sock, remoteAddr); | 53 | acc = socketAccept(this->sock, remoteAddr); |
53 | 54 | ||
54 | if (-1 != acc->handle) { | 55 | if (-1 != acc->handle) { |
55 | - (this->conns)[this->nfds].sock = acc; // save the socket handle | ||
56 | - (this->fds)[this->nfds].fd = acc->handle; | ||
57 | - (this->fds)[this->nfds].events = POLLIN; | 56 | + (this->conns)[this->nfds].sock = acc; // save the socket handle |
57 | + (this->conns)[this->nfds].reader = clone(this->reader); // clone reader | ||
58 | + (this->fds)[this->nfds].fd = acc->handle; | ||
59 | + (this->fds)[this->nfds].events = POLLIN; | ||
58 | this->nfds++; | 60 | this->nfds++; |
59 | } else { | 61 | } else { |
60 | delete(&acc); | 62 | delete(&acc); |
@@ -69,32 +71,34 @@ int | @@ -69,32 +71,34 @@ int | ||
69 | serverRead(Server this) | 71 | serverRead(Server this) |
70 | { | 72 | { |
71 | unsigned int i; | 73 | unsigned int i; |
72 | - size_t _read; | ||
73 | - char buffer[1024]; | ||
74 | 74 | ||
75 | for (i=1; i<this->nfds; i++) { | 75 | for (i=1; i<this->nfds; i++) { |
76 | if (0 != ((this->fds)[i].revents & POLLIN)) { | 76 | if (0 != ((this->fds)[i].revents & POLLIN)) { |
77 | - switch (_read = read((this->fds)[i].fd, buffer, 1024)) { | 77 | + if (NULL == (this->conns)[i].reader) { |
78 | + loggerLog( | ||
79 | + this->logger, | ||
80 | + LOGGER_INFO, | ||
81 | + "initialization error: NULL reader"); | ||
82 | + serverCloseConn(this, i); | ||
83 | + } | ||
84 | + | ||
85 | + switch (streamReaderRead((this->conns)[i].reader, (this->fds)[i].fd)) { | ||
78 | case 0: | 86 | case 0: |
79 | /* | 87 | /* |
80 | * normal close: write remaining data | 88 | * normal close: write remaining data |
89 | + * @TODO: actually we have no remaining data here.... | ||
81 | */ | 90 | */ |
82 | - /* FALLTHROUGH */ | 91 | + /* DROP-THROUGH */ |
83 | 92 | ||
84 | case -1: | 93 | case -1: |
85 | /* | 94 | /* |
86 | * read failure / close connection | 95 | * read failure / close connection |
87 | - * FALLTHROUGH | ||
88 | */ | 96 | */ |
89 | loggerLog(this->logger, LOGGER_INFO, "connection closed..."); | 97 | loggerLog(this->logger, LOGGER_INFO, "connection closed..."); |
90 | serverCloseConn(this, i); | 98 | serverCloseConn(this, i); |
91 | break; | 99 | break; |
92 | 100 | ||
93 | default: | 101 | default: |
94 | - (this->fds)[i].revents |= POLLIN; | ||
95 | - if (NULL != this->read_hook) { | ||
96 | - this->read_hook(buffer, _read); | ||
97 | - } | ||
98 | break; | 102 | break; |
99 | } | 103 | } |
100 | } | 104 | } |
@@ -4,33 +4,25 @@ | @@ -4,33 +4,25 @@ | ||
4 | 4 | ||
5 | #include "server.h" | 5 | #include "server.h" |
6 | #include "logger.h" | 6 | #include "logger.h" |
7 | -#include "signalHandling.h" | ||
8 | -#include "interface/class.h" | ||
9 | - | ||
10 | -static void | ||
11 | -read_hook(const char * _buffer, size_t size) | ||
12 | -{ | ||
13 | - char buffer[1025]; | 7 | +#include "http/request_parser.h" |
14 | 8 | ||
15 | - memset(buffer, 0, 1025); | ||
16 | - snprintf(buffer, 1025>size? size : 1024, "%s", _buffer); | 9 | +#include "signalHandling.h" |
17 | 10 | ||
18 | - printf("%s\n", buffer); | ||
19 | -} | 11 | +#include "interface/class.h" |
20 | 12 | ||
21 | int | 13 | int |
22 | main() | 14 | main() |
23 | { | 15 | { |
24 | - Logger logger = new(LoggerStderr, LOGGER_INFO); | ||
25 | - Server server = new(Server, logger, 11212, SOMAXCONN); | ||
26 | - | ||
27 | - server->read_hook = read_hook; | 16 | + Logger logger = new(LoggerStderr, LOGGER_INFO); |
17 | + HttpRequestParser parser = new(HttpRequestParser); | ||
18 | + Server server = new(Server, logger, parser, 11212, SOMAXCONN); | ||
28 | 19 | ||
29 | init_signals(); | 20 | init_signals(); |
30 | serverRun(server); | 21 | serverRun(server); |
31 | 22 | ||
32 | delete(&server); | 23 | delete(&server); |
33 | delete(&logger); | 24 | delete(&logger); |
25 | + delete(&parser); | ||
34 | 26 | ||
35 | return 0; | 27 | return 0; |
36 | } | 28 | } |
Please
register
or
login
to post a comment