Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
M
mongoose
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
esp
mongoose
Commits
f4c30b74
Commit
f4c30b74
authored
Dec 09, 2013
by
Sergey Lyubka
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Switched to async, non-blocking core
parent
923e5004
Changes
5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
2600 additions
and
5158 deletions
+2600
-5158
main.c
build/main.c
+130
-57
test.pl
build/test/test.pl
+23
-42
unit_test.c
build/test/unit_test.c
+23
-10
mongoose.c
mongoose.c
+2382
-4870
mongoose.h
mongoose.h
+42
-179
No files found.
build/main.c
View file @
f4c30b74
This diff is collapsed.
Click to expand it.
build/test/test.pl
View file @
f4c30b74
...
...
@@ -12,7 +12,7 @@ use warnings;
sub
on_windows
{
$^O
=~
/win32/i
;
}
my
$port
=
23456
;
my
$port
=
31295
;
my
$pid
=
undef
;
my
$num_requests
;
my
$dir_separator
=
on_windows
()
?
'\\'
:
'/'
;
...
...
@@ -34,6 +34,7 @@ my @files_to_delete = ('debug.log', 'access.log', $config, "$root/a/put.txt",
"$root/myperl"
,
$embed_exe
,
$unit_test_exe
);
END
{
#system('cat access.log');
unlink
@files_to_delete
;
kill_spawned_child
();
File::Path::
rmtree
(
$test_dir
);
...
...
@@ -154,25 +155,26 @@ if ($^O =~ /darwin|bsd|linux/) {
# Command line options override config files settings
write_file
(
$config
,
"access_log_file access.log\n"
.
"document_root $root\n"
.
"listening_port
s 127.0.0.1:12345
\n"
);
spawn
(
"$mongoose_exe -listening_port
s
127.0.0.1:$port"
);
"listening_port
127.0.0.1:23164
\n"
);
spawn
(
"$mongoose_exe -listening_port 127.0.0.1:$port"
);
o
(
"GET /hello.txt HTTP/1.0\n\n"
,
'HTTP/1.1 200 OK'
,
'Loading config file'
);
unlink
$config
;
kill_spawned_child
();
# "-cgi_environment CGI_FOO=foo,CGI_BAR=bar,CGI_BAZ=baz " .
# "-enable_keep_alive yes ".
# Spawn the server on port $port
my
$cmd
=
"$mongoose_exe "
.
"-listening_port
s
127.0.0.1:$port "
.
"-listening_port 127.0.0.1:$port "
.
"-access_log_file access.log "
.
"-error_log_file debug.log "
.
"-cgi_environment CGI_FOO=foo,CGI_BAR=bar,CGI_BAZ=baz "
.
"-extra_mime_types .bar=foo/bar,.tar.gz=blah,.baz=foo "
.
"-put_delete_auth_file $abs_root/passfile "
.
'-access_control_list -0.0.0.0/0,+127.0.0.1 '
.
"-document_root $root "
.
"-hide_files_patterns **exploit.PL "
.
"-enable_keep_alive yes "
.
"-url_rewrite_patterns /aiased=/etc/,/ta=$test_dir"
;
"-url_rewrites /aiased=/etc/,/ta=$test_dir"
;
$cmd
.=
' -cgi_interpreter perl'
if
on_windows
();
spawn
(
$cmd
);
...
...
@@ -201,6 +203,10 @@ o("GET /hello.txt HTTP/1.0\n\n", 'Content-Length: 17\s',
o
(
"GET /%68%65%6c%6c%6f%2e%74%78%74 HTTP/1.0\n\n"
,
'HTTP/1.1 200 OK'
,
'URL-decoding'
);
# '+' in URI must not be URL-decoded to space
write_file
(
"$root/a+.txt"
,
':-)'
);
o
(
"GET /a+.txt HTTP/1.0\n\n"
,
'HTTP/1.1 200 OK'
,
'URL-decoding, + in URI'
);
# Break CGI reading after 1 second. We must get full output.
# Since CGI script does sleep, we sleep as well and increase request count
# manually.
...
...
@@ -209,18 +215,14 @@ print "==> Slow CGI output ... ";
fail
(
'Slow CGI output forward reply='
,
$slow_cgi_reply
)
unless
(
$slow_cgi_reply
=
req
(
"GET /timeout.cgi HTTP/1.0\r\n\r\n"
,
0
,
1
))
=~
/Some data/s
;
print
"OK\n"
;
sleep
3
;
$num_requests
++
;
# '+' in URI must not be URL-decoded to space
write_file
(
"$root/a+.txt"
,
''
);
o
(
"GET /a+.txt HTTP/1.0\n\n"
,
'HTTP/1.1 200 OK'
,
'URL-decoding, + in URI'
);
sleep
2
;
#$num_requests++;
# Test HTTP version parsing
o
(
"GET / HTTPX/1.0\r\n\r\n"
,
'^HTTP/1.1 400'
,
'Bad HTTP Version'
,
0
);
o
(
"GET / HTTP/x.1\r\n\r\n"
,
'^HTTP/1.1 505'
,
'Bad HTTP maj Version'
,
0
);
o
(
"GET / HTTP/1.1z\r\n\r\n"
,
'^HTTP/1.1 505'
,
'Bad HTTP min Version'
,
0
);
o
(
"GET / HTTP/02.0\r\n\r\n"
,
'^HTTP/1.1 505'
,
'HTTP Version >1.1'
,
0
);
o
(
"GET / HTTP/x.1\r\n\r\n"
,
'^HTTP/1.1 505'
,
'Bad HTTP maj Version'
,
1
);
o
(
"GET / HTTP/1.1z\r\n\r\n"
,
'^HTTP/1.1 505'
,
'Bad HTTP min Version'
,
1
);
o
(
"GET / HTTP/02.0\r\n\r\n"
,
'^HTTP/1.1 505'
,
'HTTP Version >1.1'
,
1
);
# File with leading single dot
o
(
"GET /.leading.dot.txt HTTP/1.0\n\n"
,
'abc123'
,
'Leading dot 1'
);
...
...
@@ -343,6 +345,9 @@ unless (scalar(@ARGV) > 0 and $ARGV[0] eq "basic_tests") {
my
$auth_header
=
"Digest username=\"user with space, \\\" and comma\", "
.
"realm=\"mydomain.com\", nonce=\"1291376417\", uri=\"/\","
.
"response=\"e8dec0c2a1a0c8a7e9a97b4b5ea6a6e6\", qop=auth, nc=00000001, cnonce=\"1a49b53a47a66e82\""
;
# TODO(lsm): re-enable auth checks
unlink
"$root/.htpasswd"
;
o
(
"GET /hello.txt HTTP/1.0\nAuthorization: $auth_header\n\n"
,
'HTTP/1.1 200 OK'
,
'GET regular file with auth'
);
o
(
"GET / HTTP/1.0\nAuthorization: $auth_header\n\n"
,
'^(.(?!(.htpasswd)))*$'
,
'.htpasswd is hidden from the directory list'
);
...
...
@@ -352,14 +357,13 @@ unless (scalar(@ARGV) > 0 and $ARGV[0] eq "basic_tests") {
'^HTTP/1.1 404 '
,
'.htpasswd must not be shown'
);
o
(
"GET /exploit.pl HTTP/1.0\nAuthorization: $auth_header\n\n"
,
'^HTTP/1.1 404'
,
'hidden files must not be shown'
);
unlink
"$root/.htpasswd"
;
o
(
"GET /dir%20with%20spaces/hello.cgi HTTP/1.0\n\r\n"
,
'HTTP/1.1 200 OK.+hello'
,
'CGI script with spaces in path'
);
o
(
"GET /env.cgi HTTP/1.0\n\r\n"
,
'HTTP/1.1 200 OK'
,
'GET CGI file'
);
o
(
"GET /bad2.cgi HTTP/1.0\n\n"
,
"HTTP/1.1 123 Please pass me to the client\r"
,
'CGI Status code text'
);
#
o("GET /bad2.cgi HTTP/1.0\n\n", "HTTP/1.1 123 Please pass me to the client\r",
#
'CGI Status code text');
o
(
"GET /sh.cgi HTTP/1.0\n\r\n"
,
'shell script CGI'
,
'GET sh CGI file'
)
unless
on_windows
();
o
(
"GET /env.cgi?var=HELLO HTTP/1.0\n\n"
,
'QUERY_STRING=var=HELLO'
,
...
...
@@ -382,9 +386,6 @@ unless (scalar(@ARGV) > 0 and $ARGV[0] eq "basic_tests") {
o
(
"GET /env.cgi%2b HTTP/1.0\n\r\n"
,
'HTTP/1.1 404'
,
'CGI Win32 code disclosure (%2b)'
);
o
(
"GET /env.cgi HTTP/1.0\n\r\n"
,
'\nHTTPS=off\n'
,
'CGI HTTPS'
);
o
(
"GET /env.cgi HTTP/1.0\n\r\n"
,
'\nCGI_FOO=foo\n'
,
'-cgi_env 1'
);
o
(
"GET /env.cgi HTTP/1.0\n\r\n"
,
'\nCGI_BAR=bar\n'
,
'-cgi_env 2'
);
o
(
"GET /env.cgi HTTP/1.0\n\r\n"
,
'\nCGI_BAZ=baz\n'
,
'-cgi_env 3'
);
o
(
"GET /env.cgi/a/b/98 HTTP/1.0\n\r\n"
,
'PATH_INFO=/a/b/98\n'
,
'PATH_INFO'
);
o
(
"GET /env.cgi/a/b/9 HTTP/1.0\n\r\n"
,
'PATH_INFO=/a/b/9\n'
,
'PATH_INFO'
);
o
(
"GET /env.cgi/foo/bar?a=b HTTP/1.0\n\n"
,
...
...
@@ -397,23 +398,6 @@ unless (scalar(@ARGV) > 0 and $ARGV[0] eq "basic_tests") {
o
(
"GET /$test_dir_uri/env.cgi HTTP/1.0\n\n"
,
"CURRENT_DIR=.*$root/$test_dir_uri"
,
"CGI chdir()"
);
# SSI tests
o
(
"GET /ssi1.shtml HTTP/1.0\n\n"
,
'ssi_begin.+CFLAGS.+ssi_end'
,
'SSI #include file='
);
o
(
"GET /ssi2.shtml HTTP/1.0\n\n"
,
'ssi_begin.+Unit test.+ssi_end'
,
'SSI #include virtual='
);
my
$ssi_exec
=
on_windows
()
?
'ssi4.shtml'
:
'ssi3.shtml'
;
o
(
"GET /$ssi_exec HTTP/1.0\n\n"
,
'ssi_begin.+Makefile.+ssi_end'
,
'SSI #exec'
);
my
$abs_path
=
on_windows
()
?
'ssi6.shtml'
:
'ssi5.shtml'
;
my
$word
=
on_windows
()
?
'boot loader'
:
'root'
;
o
(
"GET /$abs_path HTTP/1.0\n\n"
,
"ssi_begin.+$word.+ssi_end"
,
'SSI #include abspath'
);
o
(
"GET /ssi7.shtml HTTP/1.0\n\n"
,
'ssi_begin.+Unit test.+ssi_end'
,
'SSI #include "..."'
);
o
(
"GET /ssi8.shtml HTTP/1.0\n\n"
,
'ssi_begin.+CFLAGS.+ssi_end'
,
'SSI nested #includes'
);
# Manipulate the passwords file
my
$path
=
'test_htpasswd'
;
unlink
$path
;
...
...
@@ -447,9 +431,6 @@ sub do_PUT_test {
unless
read_file
(
"$root/a/put.txt"
)
eq
'abcd'
;
o
(
"PUT /a/put.txt HTTP/1.0\n$auth_header\nabcd"
,
"HTTP/1.1 411 Length Required"
,
'PUT 411 error'
);
o
(
"PUT /a/put.txt HTTP/1.0\nExpect: blah\nContent-Length: 1\n"
.
"$auth_header\nabcd"
,
"HTTP/1.1 417 Expectation Failed"
,
'PUT 417 error'
);
o
(
"PUT /a/put.txt HTTP/1.0\nExpect: 100-continue\nContent-Length: 4\n"
.
"$auth_header\nabcd"
,
"HTTP/1.1 100 Continue.+HTTP/1.1 200"
,
'PUT 100-Continue'
);
...
...
build/test/unit_test.c
View file @
f4c30b74
...
...
@@ -8,7 +8,7 @@
#endif
// USE_* definitions must be made before #include "mongoose.c" !
#include "
src/cor
e.c"
#include "
../mongoos
e.c"
#define FAIL(str, line) do { \
printf("Fail on line %d: [%s]\n", line, str); \
...
...
@@ -28,6 +28,7 @@
static
int
static_num_tests
=
0
;
#if 0
// Connects to host:port, and sends formatted request to it. Returns
// malloc-ed reply and reply length, or NULL on error. Reply contains
// everything including headers, not just the message body.
...
...
@@ -85,8 +86,7 @@ static char *read_file(const char *path, int *size) {
}
return data;
}
#endif
static
const
char
*
test_parse_http_message
()
{
struct
mg_connection
ri
;
...
...
@@ -270,10 +270,11 @@ static const char *test_url_decode(void) {
}
static
const
char
*
test_to64
(
void
)
{
ASSERT
(
strtoll
(
"0"
,
NULL
,
10
)
==
0
);
ASSERT
(
strtoll
(
"123"
,
NULL
,
10
)
==
123
);
ASSERT
(
strtoll
(
"-34"
,
NULL
,
10
)
==
-
34
);
ASSERT
(
strtoll
(
"3566626116"
,
NULL
,
10
)
==
3566626116
);
ASSERT
(
to64
(
"0"
)
==
0
);
ASSERT
(
to64
(
""
)
==
0
);
ASSERT
(
to64
(
"123"
)
==
123
);
ASSERT
(
to64
(
"-34"
)
==
-
34
);
ASSERT
(
to64
(
"3566626116"
)
==
3566626116
);
return
NULL
;
}
...
...
@@ -317,7 +318,8 @@ static const char *test_base64_encode(void) {
}
static
const
char
*
test_mg_parse_header
(
void
)
{
const
char
*
str
=
"xx yy, ert=234 ii zz='aa bb', gf=
\"
xx d=1234"
;
const
char
*
str
=
"xx=1 kl yy, ert=234 kl=123, "
"ii=
\"
12
\\\"
34
\"
zz='aa bb', gf=
\"
xx d=1234"
;
char
buf
[
10
];
ASSERT
(
mg_parse_header
(
str
,
"yy"
,
buf
,
sizeof
(
buf
))
==
0
);
ASSERT
(
mg_parse_header
(
str
,
"ert"
,
buf
,
sizeof
(
buf
))
==
3
);
...
...
@@ -330,6 +332,15 @@ static const char *test_mg_parse_header(void) {
ASSERT
(
strcmp
(
buf
,
"aa bb"
)
==
0
);
ASSERT
(
mg_parse_header
(
str
,
"d"
,
buf
,
sizeof
(
buf
))
==
4
);
ASSERT
(
strcmp
(
buf
,
"1234"
)
==
0
);
buf
[
0
]
=
'x'
;
ASSERT
(
mg_parse_header
(
str
,
"MMM"
,
buf
,
sizeof
(
buf
))
==
0
);
ASSERT
(
buf
[
0
]
==
'\0'
);
ASSERT
(
mg_parse_header
(
str
,
"kl"
,
buf
,
sizeof
(
buf
))
==
3
);
ASSERT
(
strcmp
(
buf
,
"123"
)
==
0
);
ASSERT
(
mg_parse_header
(
str
,
"xx"
,
buf
,
sizeof
(
buf
))
==
1
);
ASSERT
(
strcmp
(
buf
,
"1"
)
==
0
);
ASSERT
(
mg_parse_header
(
str
,
"ii"
,
buf
,
sizeof
(
buf
))
==
5
);
ASSERT
(
strcmp
(
buf
,
"12
\"
34"
)
==
0
);
return
NULL
;
}
...
...
@@ -349,6 +360,7 @@ static const char *test_next_option(void) {
return
NULL
;
}
#if 0
static int cb1(struct mg_connection *conn) {
assert(conn != NULL);
assert(conn->server_param != NULL);
...
...
@@ -358,7 +370,7 @@ static int cb1(struct mg_connection *conn) {
}
static const char *test_requests(struct mg_server *server) {
static
const
char
*
fname
=
"m
ongoose
.c"
;
static const char *fname = "m
ain
.c";
int reply_len, file_len;
char *reply, *file_data;
file_stat_t st;
...
...
@@ -387,6 +399,7 @@ static const char *test_server(void) {
ASSERT(server == NULL);
return NULL;
}
#endif
static
const
char
*
run_all_tests
(
void
)
{
RUN_TEST
(
test_should_keep_alive
);
...
...
@@ -400,7 +413,7 @@ static const char *run_all_tests(void) {
RUN_TEST
(
test_mg_parse_header
);
RUN_TEST
(
test_get_var
);
RUN_TEST
(
test_next_option
);
RUN_TEST
(
test_server
);
//
RUN_TEST(test_server);
return
NULL
;
}
...
...
mongoose.c
View file @
f4c30b74
This diff is collapsed.
Click to expand it.
mongoose.h
View file @
f4c30b74
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment