9 #define MONGOOSE_POST_SIZE_LIMIT 999 12 #include "../mongoose.c" 14 #define FAIL(str, line) do { \ 15 printf("Fail on line %d: [%s]\n", line, str); \ 19 #define ASSERT(expr) do { \ 21 if (!(expr)) FAIL(#expr, __LINE__); \ 24 #define RUN_TEST(test) do { const char *msg = test(); \ 25 if (msg) return msg; } while (0) 27 #define HTTP_PORT "45772" 28 #define LISTENING_ADDR "127.0.0.1:" HTTP_PORT 36 static char *wget(
const char *host,
int port,
int *
len,
const char *fmt, ...) {
37 char buf[2000], *reply = NULL;
38 int request_len, reply_size = 0, n, sock = -1;
39 struct sockaddr_in sin;
40 struct hostent *he = NULL;
44 (he = gethostbyname(host)) != NULL &&
45 (sock = socket(PF_INET, SOCK_STREAM, 0)) != -1) {
46 sin.sin_family = AF_INET;
47 sin.sin_port = htons((uint16_t) port);
48 sin.sin_addr = * (
struct in_addr *) he->h_addr_list[0];
49 if (
connect(sock, (
struct sockaddr *) &sin,
sizeof(sin)) == 0) {
53 request_len =
vsnprintf(buf,
sizeof(buf), fmt, ap);
55 while (request_len > 0 && (n = send(sock, buf, request_len, 0)) > 0) {
58 if (request_len == 0) {
60 while ((n = recv(sock, buf,
sizeof(buf), 0)) > 0) {
61 if (*len + n > reply_size) {
63 reply = (
char *)
realloc(reply, reply_size +
sizeof(buf));
64 reply_size +=
sizeof(
buf);
67 memcpy(reply + *len, buf, n);
84 if ((fp = fopen(path,
"rb")) != NULL && !fstat(
fileno(fp), &st)) {
85 *size = (int) st.st_size;
86 data = (
char *)
malloc(*size);
87 fread(data, 1, *size, fp);
95 char req1[] =
"GET / HTTP/1.1\r\n\r\n";
96 char req2[] =
"BLAH / HTTP/1.1\r\n\r\n";
97 char req3[] =
"GET / HTTP/1.1\r\nBah\r\n";
98 char req4[] =
"GET / HTTP/1.1\r\nA: foo bar\r\nB: bar\r\nbaz\r\n\r\n";
99 char req5[] =
"GET / HTTP/1.1\r\n\r\n";
101 char req7[] =
" blah ";
102 char req8[] =
" HTTP/1.1 200 OK \n\n";
103 char req9[] =
"HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n";
147 char req1[] =
"GET / HTTP/1.1\r\n\r\n";
148 char req2[] =
"GET / HTTP/1.0\r\n\r\n";
149 char req3[] =
"GET / HTTP/1.1\r\nConnection: close\r\n\r\n";
150 char req4[] =
"GET / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n";
152 memset(&conn, 0,
sizeof(conn));
201 struct {
char before[30], after[30]; }
data[] = {
203 {
"/.....",
"/....."},
204 {
"/......",
"/......"},
206 {
"/...///",
"/.../"},
207 {
"/a...///",
"/a.../"},
211 {
"/a\\\\...",
"/a\\..."},
212 {
"foo/x..y/././y/../../..",
"foo/x..y/y/"},
213 {
"foo/..x",
"foo/..x"},
226 static const char *
post[] = {
227 "a=1&&b=2&d&=&c=3%20&e=",
228 "q=&st=2012%2F11%2F13+17%3A05&et=&team_id=",
233 ASSERT(
get_var(post[0], strlen(post[0]),
"a", buf,
sizeof(buf)) == 1);
234 ASSERT(buf[0] ==
'1' && buf[1] ==
'\0');
235 ASSERT(
get_var(post[0], strlen(post[0]),
"b", buf,
sizeof(buf)) == 1);
236 ASSERT(buf[0] ==
'2' && buf[1] ==
'\0');
237 ASSERT(
get_var(post[0], strlen(post[0]),
"c", buf,
sizeof(buf)) == 2);
238 ASSERT(buf[0] ==
'3' && buf[1] ==
' ' && buf[2] ==
'\0');
239 ASSERT(
get_var(post[0], strlen(post[0]),
"e", buf,
sizeof(buf)) == 0);
242 ASSERT(
get_var(post[0], strlen(post[0]),
"d", buf,
sizeof(buf)) == -1);
243 ASSERT(
get_var(post[0], strlen(post[0]),
"c", buf, 2) == -2);
245 ASSERT(
get_var(post[0], strlen(post[0]),
"x", NULL, 10) == -2);
246 ASSERT(
get_var(post[0], strlen(post[0]),
"x", buf, 0) == -2);
247 ASSERT(
get_var(post[1], strlen(post[1]),
"st", buf, 16) == -2);
248 ASSERT(
get_var(post[1], strlen(post[1]),
"st", buf, 17) == 16);
257 ASSERT(strcmp(buf,
"foo") == 0);
260 ASSERT(strcmp(buf,
"a+") == 0);
263 ASSERT(strcmp(buf,
"a ") == 0);
267 ASSERT(strcmp(buf,
"%") == 0);
270 ASSERT(strcmp(buf,
"%6") == 0);
273 ASSERT(strcmp(buf,
"a") == 0);
282 ASSERT(strcmp(buf,
"foo") == 0);
284 ASSERT(strcmp(buf,
"f%20o") == 0);
298 const char *in[] = {
"a",
"ab",
"abc",
"abcd", NULL};
299 const char *out[] = {
"YQ==",
"YWI=",
"YWJj",
"YWJjZA=="};
303 for (i = 0; in[
i] != NULL; i++) {
305 ASSERT(!strcmp(buf, out[i]));
312 const char *
str =
"xx=1 kl yy, ert=234 kl=123, uri=\"/?name=x,y\", " 313 "ii=\"12\\\"34\" zz='aa bb',tt=2,gf=\"xx d=1234";
317 ASSERT(strcmp(buf,
"234") == 0);
323 ASSERT(strcmp(buf,
"aa bb") == 0);
325 ASSERT(strcmp(buf,
"1234") == 0);
330 ASSERT(strcmp(buf,
"123") == 0);
332 ASSERT(strcmp(buf,
"1") == 0);
334 ASSERT(strcmp(buf,
"12\"34") == 0);
336 ASSERT(strcmp(buf,
"2") == 0);
342 const char *
p, *list =
"x/8,/y**=1;2k,z";
347 for (i = 0, p = list; (p =
next_option(p, &a, &b)) != NULL; i++) {
349 ASSERT(i != 1 || (a.
ptr == list + 4 && a.
len == 4 && b.
ptr == list + 9 &&
363 mg_printf(conn,
"GET %s HTTP/1.0\r\n\r\n",
364 buf[0] ==
'1' ?
"/cb1" :
"/non_exist");
372 if (!strcmp(conn->
uri,
"/cb1")) {
373 mg_printf(conn,
"HTTP/1.0 200 OK\r\n\r\n%s %s %s",
375 buf == NULL ?
"?" :
"!", conn->
remote_ip);
395 char buf1[100] =
"1", buf2[100] =
"2";
409 ASSERT(strcmp(buf1,
"1foo ? 127.0.0.1") == 0);
410 ASSERT(strcmp(buf2,
"2ERR: 404") == 0);
418 #define DISP "Content-Disposition: form/data; " 420 #define BOUNDARY "--xyz" 429 int n, n2,
len, f1_len =
sizeof(
f1) - 1;
434 b,
sizeof(b), &p, &len)) > 0);
436 ASSERT(memcmp(p,
"some_content", len) == 0);
437 ASSERT(strcmp(a,
"f1") == 0);
441 b,
sizeof(b), &p, &len)) > 0);
443 ASSERT(memcmp(p,
"another_content", len) == 0);
444 ASSERT(strcmp(a,
"f2") == 0);
445 ASSERT(strcmp(b,
"foo bar.txt") == 0);
448 b,
sizeof(b), &p, &len)) == 0);
462 mg_printf(conn,
"GET /%s HTTP/1.0\r\n\r\n", cp);
468 file_data =
read_file(
"unit_test.c", &file_size);
470 memcmp(file_data, conn->
content, file_size) == 0 ? 1 : 0,
490 char buf1[100] =
"xx", addr[50];
499 snprintf(addr,
sizeof(addr),
"127.0.0.1:%s", port);
505 ASSERT(strcmp(buf1,
"1 ?") == 0);
532 return fail_msg == NULL ? EXIT_SUCCESS : EXIT_FAILURE;
static const char * test_get_var(void)
static const char * test_next_option(void)
struct mg_connection::mg_header http_headers[30]
struct curl_httppost * post
static const char * test_to64(void)
static const char * run_all_tests(void)
static const char * test_base64_encode(void)
static void remove_double_dots_and_double_slashes(char *s)
static const char * test_remove_double_dots()
int stat(const char *path, struct stat *buffer)
static const char * test_mg_parse_header(void)
static const char * test_url_decode(void)
static const char * test_server(void)
static int static_num_tests
static char * read_file(const char *path, int *size)
struct mg_server * mg_create_server(void *server_data, mg_handler_t handler)
const char * mg_get_option(const struct mg_server *server, const char *name)
#define realloc(ptr, size)
if(strcmp(arg,"1305")!=0)
UNITTEST_START int result
static const char * test_parse_multipart(void)
static int get_request_len(const char *s, size_t buf_len)
static int evh2(struct mg_connection *conn, enum mg_event ev)
static int should_keep_alive(const struct mg_connection *conn)
static const char * test_parse_http_message()
time_t mg_poll_server(struct mg_server *server, int milliseconds)
int mg_parse_header(const char *s, const char *var_name, char *buf, size_t buf_size)
size_t mg_url_encode(const char *src, size_t s_len, char *dst, size_t dst_len)
memcpy(filename, filename1, strlen(filename1))
static const char * test_rewrites(void)
static const char * next_option(const char *list, struct vec *val, struct vec *eq_val)
const char * query_string
UNITTEST_START struct Curl_easy data
static struct mg_server * server
static unsigned short port
static const char * test_should_keep_alive(void)
struct mg_connection * mg_connect(struct mg_server *server, const char *addr)
static int evh1(struct mg_connection *conn, enum mg_event ev)
static const char * test_mg_set_option(void)
static size_t parse_http_message(char *buf, size_t len, struct mg_connection *ri)
static CURLcode base64_encode(const char *table64, struct Curl_easy *data, const char *inputbuff, size_t insize, char **outptr, size_t *outlen)
const char * mg_set_option(struct mg_server *server, const char *name, const char *value)
static const char * test_match_prefix(void)
size_t mg_printf(struct mg_connection *conn, const char *fmt,...)
const char * http_version
int mg_match_prefix(const char *pattern, ssize_t pattern_len, const char *str)
static const char * test_url_encode(void)
static int get_var(const char *data, size_t data_len, const char *name, char *dst, size_t dst_len)
const char * request_method
int mg_parse_multipart(const char *buf, int buf_len, char *var_name, int var_name_len, char *file_name, int file_name_len, const char **data, int *data_len)
#define ARRAY_SIZE(array)
void mg_destroy_server(struct mg_server **server)
int mg_url_decode(const char *src, size_t src_len, char *dst, size_t dst_len, int is_form_url_encoded)
static const char * static_config_options[]