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
133
134
135
136
137
138
139
140
|
#ifndef UVH_H
#define UVH_H
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <uv.h>
#define UVH_MAX_HEADERS 50
#define HTTP_STATUS_CODE_MAP(XX) \
XX(100, CONTINUE, "Continue") \
XX(101, SWITCHING_PROTOCOLS, "Switching Protocols") \
XX(200, OK, "OK") \
XX(201, CREATED, "Created") \
XX(202, ACCEPTED, "Accepted") \
XX(203, NON_AUTHORITATIVE_INFORMATION, "Non-Authoritative Information") \
XX(204, NO_CONTENT, "No Content") \
XX(205, RESET_CONTENT, "Reset Content") \
XX(206, PARTIAL_CONTENT, "Partial Content") \
XX(300, MULTIPLE_CHOICES, "Multiple Choices") \
XX(301, MOVED_PERMANENTLY, "Moved Permanently") \
XX(302, FOUND, "Found") \
XX(303, SEE_OTHER, "See Other") \
XX(304, NOT_MODIFIED, "Not Modified") \
XX(305, USE_PROXY, "Use Proxy") \
XX(307, TEMPORARY_REDIRECT, "Temporary Redirect") \
XX(400, BAD_REQUEST, "Bad Request") \
XX(401, UNAUTHORIZED, "Unauthorized") \
XX(402, PAYMENT_REQUIRED, "Payment Required") \
XX(403, FORBIDDEN, "Forbidden") \
XX(404, NOT_FOUND, "Not Found") \
XX(405, METHOD_NOT_ALLOWED, "Method Not Allowed") \
XX(406, NOT_ACCEPTABLE, "Not Acceptable") \
XX(407, PROXY_AUTHENTICATION_REQUIRED, "Proxy Authentication Required") \
XX(408, REQUEST_TIMEOUT, "Request Timeout") \
XX(409, CONFLICT, "Conflict") \
XX(410, GONE, "Gone") \
XX(411, LENGTH_REQUIRED, "Length Required") \
XX(412, PRECONDITION_FAILED, "Precondition Failed") \
XX(413, REQUEST_ENTITY_TOO_LARGE, "Request Entity Too Large") \
XX(414, REQUEST_URI_TOO_LONG, "Request-URI Too Long") \
XX(415, UNSUPPORTED_MEDIA_TYPE, "Unsupported Media Type") \
XX(416, REQUESTED_RANGE_NOT_SATISFIABLE, "Requested Range Not Satisfiable") \
XX(417, EXPECTATION_FAILED, "Expectation Failed") \
XX(418, IM_A_TEAPOT, "I'm a teapot") /* ;-) */ \
XX(500, INTERNAL_SERVER_ERROR, "Internal Server Error") \
XX(501, NOT_IMPLEMENTED, "Not Implemented") \
XX(502, BAD_GATEWAY, "Bad Gateway") \
XX(503, SERVICE_UNAVAILABLE, "Service Unavailable") \
XX(504, GATEWAY_TIMEOUT, "Gateway Timeout") \
XX(505, HTTP_VERSION_NOT_SUPPORTED, "HTTP Version Not Supported")
enum
{
#define XX(CODE, NAME, STR) HTTP_##NAME = CODE,
HTTP_STATUS_CODE_MAP(XX)
#undef XX
};
struct uvh_request;
typedef int (*uvh_request_handler_cb)(struct uvh_request *);
struct uvh_server
{
void *data;
uvh_request_handler_cb request_handler;
};
struct uvh_request
{
struct uvh_server *server;
struct
{
const char *name;
const char *value;
} headers[UVH_MAX_HEADERS];
int header_count;
const char *method;
const char *version;
struct
{
const char *full;
const char *schema;
const char *host;
const char *port;
const char *path;
const char *query;
const char *fragment;
const char *userinfo;
} url;
const char *content;
int content_length;
};
struct uvh_server *uvh_server_init(uv_loop_t *loop, void *data,
uvh_request_handler_cb request_handler);
void uvh_server_free(struct uvh_server *server);
int uvh_server_listen(struct uvh_server *server, const char *address,
short port);
void uvh_server_stop(struct uvh_server *server);
void uvh_request_write(struct uvh_request *req, const char *data,
size_t len);
#ifdef __GNUC__
void uvh_request_writef(struct uvh_request *req, const char *fmt, ...)
__attribute__((format(printf, 2, 3)));
#else
void uvh_request_writef(struct uvh_request *req, const char *fmt, ...);
#endif
void uvh_request_write_status(struct uvh_request *req, int status);
void uvh_request_write_header(struct uvh_request *req,
const char *name, const char *value);
const char *http_status_code_str(int code);
const char *uvh_request_get_header(struct uvh_request *req,
const char *name);
void uvh_request_end(struct uvh_request *req);
typedef int (*uvh_stream_cb)(char **buffer, void *data);
void uvh_request_stream(struct uvh_request *req, uvh_stream_cb callback,
void *data);
#endif /* UVH_H */
|