forked from jeremycw/httpserver.h
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapi.c
More file actions
132 lines (103 loc) · 3.87 KB
/
Copy pathapi.c
File metadata and controls
132 lines (103 loc) · 3.87 KB
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <stdlib.h>
#ifndef HTTPSERVER_IMPL
#include "api.h"
#include "buffer_util.h"
#include "common.h"
#include "io_events.h"
#include "request_util.h"
#include "respond.h"
#include "server.h"
#endif
int http_request_has_flag(http_request_t *request, int flag) {
return HTTP_FLAG_CHECK(request->flags, flag);
}
int http_server_loop(http_server_t *server) { return server->loop; }
http_server_t *http_server_init(int port, void (*handler)(http_request_t *)) {
#ifdef KQUEUE
return hs_server_init(port, handler, hs_on_kqueue_server_event, NULL);
#else
return hs_server_init(port, handler, hs_on_epoll_server_connection_event,
hs_on_epoll_server_timer_event);
#endif
}
void http_request_free_buffer(http_request_t *request) {
_hs_buffer_free(&request->buffer, &request->server->memused);
}
void *http_request_userdata(http_request_t *request) { return request->data; }
void http_request_set_userdata(http_request_t *request, void *data) {
request->data = data;
}
void http_server_set_userdata(struct http_server_s *serv, void *data) {
serv->data = data;
}
void *http_request_server_userdata(struct http_request_s *request) {
return request->server->data;
}
int http_request_iterate_headers(http_request_t *request, http_string_t *key,
http_string_t *val, int *iter) {
return hs_request_iterate_headers(request, key, val, iter);
}
http_string_t http_request_header(http_request_t *request, char const *key) {
return hs_request_header(request, key);
}
void http_request_connection(http_request_t *request, int directive) {
hs_request_set_keep_alive_flag(request, directive);
}
http_string_t http_request_chunk(struct http_request_s *request) {
return hs_request_chunk(request);
}
http_response_t *http_response_init() { return hs_response_init(); }
void http_response_header(http_response_t *response, char const *key,
char const *value) {
return hs_response_set_header(response, key, value);
}
void http_response_status(http_response_t *response, int status) {
hs_response_set_status(response, status);
}
void http_response_body(http_response_t *response, char const *body,
int length) {
hs_response_set_body(response, body, length);
}
void http_respond(http_request_t *request, http_response_t *response) {
hs_request_respond(request, response, hs_request_begin_write);
}
void http_respond_chunk(http_request_t *request, http_response_t *response,
void (*cb)(http_request_t *)) {
hs_request_respond_chunk(request, response, cb, hs_request_begin_write);
}
void http_respond_chunk_end(http_request_t *request,
http_response_t *response) {
hs_request_respond_chunk_end(request, response, hs_request_begin_write);
}
http_string_t http_request_method(http_request_t *request) {
return hs_get_token_string(request, HSH_TOK_METHOD);
}
http_string_t http_request_target(http_request_t *request) {
return hs_get_token_string(request, HSH_TOK_TARGET);
}
http_string_t http_request_body(http_request_t *request) {
return hs_get_token_string(request, HSH_TOK_BODY);
}
int http_server_listen(http_server_t *serv) {
return hs_server_run_event_loop(serv, NULL);
}
int http_server_listen_addr(http_server_t *serv, const char *ipaddr) {
return hs_server_run_event_loop(serv, ipaddr);
}
int http_server_poll(http_server_t *serv) {
return hs_server_poll_events(serv);
}
int http_server_listen_poll(http_server_t *serv) {
hs_server_listen_on_addr(serv, NULL);
return 0;
}
int http_server_listen_addr_poll(http_server_t *serv, const char *ipaddr) {
hs_server_listen_on_addr(serv, ipaddr);
return 0;
}
void http_request_read_chunk(struct http_request_s *request,
void (*chunk_cb)(struct http_request_s *)) {
request->state = HTTP_SESSION_READ;
request->chunk_cb = chunk_cb;
hs_request_begin_read(request);
}