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
988b40f7
Commit
988b40f7
authored
Nov 24, 2013
by
Sergey Lyubka
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Moved webdav functions into webdav.c
parent
b5fdd48d
Changes
6
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
439 additions
and
129 deletions
+439
-129
Makefile
build/Makefile
+1
-1
mongoose.c
build/src/mongoose.c
+0
-64
util.c
build/src/util.c
+4
-0
webdav.c
build/src/webdav.c
+61
-0
websocket.c
build/src/websocket.c
+309
-0
mongoose.c
mongoose.c
+64
-64
No files found.
build/Makefile
View file @
988b40f7
...
@@ -30,7 +30,7 @@ SOURCES = src/internal.h src/util.c src/string.c src/parse_date.c \
...
@@ -30,7 +30,7 @@ SOURCES = src/internal.h src/util.c src/string.c src/parse_date.c \
src/options.c src/crypto.c src/auth.c src/win32.c src/unix.c
\
src/options.c src/crypto.c src/auth.c src/win32.c src/unix.c
\
src/mg_printf.c src/ssl.c src/http_client.c src/mime.c
\
src/mg_printf.c src/ssl.c src/http_client.c src/mime.c
\
src/directory.c src/log.c src/parse_http.c src/io.c src/cgi.c
\
src/directory.c src/log.c src/parse_http.c src/io.c src/cgi.c
\
src/upload.c src/websocket.c src/mongoose.c src/lua.c
src/upload.c src/websocket.c src/
webdav.c src/
mongoose.c src/lua.c
TINY_SOURCES
=
../mongoose.c main.c
TINY_SOURCES
=
../mongoose.c main.c
LUA_SOURCES
=
$(TINY_SOURCES)
lua_5.2.1.c
LUA_SOURCES
=
$(TINY_SOURCES)
lua_5.2.1.c
...
...
build/src/mongoose.c
View file @
988b40f7
...
@@ -190,10 +190,6 @@ static int convert_uri_to_file_name(struct mg_connection *conn, char *buf,
...
@@ -190,10 +190,6 @@ static int convert_uri_to_file_name(struct mg_connection *conn, char *buf,
return
0
;
return
0
;
}
}
static
void
gmt_time_string
(
char
*
buf
,
size_t
buf_len
,
time_t
*
t
)
{
strftime
(
buf
,
buf_len
,
"%a, %d %b %Y %H:%M:%S GMT"
,
gmtime
(
t
));
}
static
void
construct_etag
(
char
*
buf
,
size_t
buf_len
,
static
void
construct_etag
(
char
*
buf
,
size_t
buf_len
,
const
struct
file
*
filep
)
{
const
struct
file
*
filep
)
{
snprintf
(
buf
,
buf_len
,
"
\"
%lx.%"
INT64_FMT
"
\"
"
,
snprintf
(
buf
,
buf_len
,
"
\"
%lx.%"
INT64_FMT
"
\"
"
,
...
@@ -587,66 +583,6 @@ static void handle_options_request(struct mg_connection *conn) {
...
@@ -587,66 +583,6 @@ static void handle_options_request(struct mg_connection *conn) {
mg_write
(
conn
,
reply
,
sizeof
(
reply
)
-
1
);
mg_write
(
conn
,
reply
,
sizeof
(
reply
)
-
1
);
}
}
// Writes PROPFIND properties for a collection element
static
void
print_props
(
struct
mg_connection
*
conn
,
const
char
*
uri
,
struct
file
*
filep
)
{
char
mtime
[
64
];
gmt_time_string
(
mtime
,
sizeof
(
mtime
),
&
filep
->
modification_time
);
conn
->
num_bytes_sent
+=
mg_printf
(
conn
,
"<d:response>"
"<d:href>%s</d:href>"
"<d:propstat>"
"<d:prop>"
"<d:resourcetype>%s</d:resourcetype>"
"<d:getcontentlength>%"
INT64_FMT
"</d:getcontentlength>"
"<d:getlastmodified>%s</d:getlastmodified>"
"</d:prop>"
"<d:status>HTTP/1.1 200 OK</d:status>"
"</d:propstat>"
"</d:response>
\n
"
,
uri
,
filep
->
is_directory
?
"<d:collection/>"
:
""
,
filep
->
size
,
mtime
);
}
static
void
print_dav_dir_entry
(
struct
de
*
de
,
void
*
data
)
{
char
href
[
PATH_MAX
];
char
href_encoded
[
PATH_MAX
];
struct
mg_connection
*
conn
=
(
struct
mg_connection
*
)
data
;
mg_snprintf
(
href
,
sizeof
(
href
),
"%s%s"
,
conn
->
request_info
.
uri
,
de
->
file_name
);
mg_url_encode
(
href
,
href_encoded
,
PATH_MAX
-
1
);
print_props
(
conn
,
href_encoded
,
&
de
->
file
);
}
static
void
handle_propfind
(
struct
mg_connection
*
conn
,
const
char
*
path
,
struct
file
*
filep
)
{
const
char
*
depth
=
mg_get_header
(
conn
,
"Depth"
);
conn
->
must_close
=
1
;
conn
->
status_code
=
207
;
mg_printf
(
conn
,
"HTTP/1.1 207 Multi-Status
\r\n
"
"Connection: close
\r\n
"
"Content-Type: text/xml; charset=utf-8
\r\n\r\n
"
);
conn
->
num_bytes_sent
+=
mg_printf
(
conn
,
"<?xml version=
\"
1.0
\"
encoding=
\"
utf-8
\"
?>"
"<d:multistatus xmlns:d='DAV:'>
\n
"
);
// Print properties for the requested resource itself
print_props
(
conn
,
conn
->
request_info
.
uri
,
filep
);
// If it is a directory, print directory entries too if Depth is not 0
if
(
filep
->
is_directory
&&
!
mg_strcasecmp
(
conn
->
ctx
->
config
[
ENABLE_DIRECTORY_LISTING
],
"yes"
)
&&
(
depth
==
NULL
||
strcmp
(
depth
,
"0"
)
!=
0
))
{
scan_directory
(
conn
,
path
,
conn
,
&
print_dav_dir_entry
);
}
conn
->
num_bytes_sent
+=
mg_printf
(
conn
,
"%s
\n
"
,
"</d:multistatus>"
);
}
static
int
isbyte
(
int
n
)
{
static
int
isbyte
(
int
n
)
{
return
n
>=
0
&&
n
<=
255
;
return
n
>=
0
&&
n
<=
255
;
}
}
...
...
build/src/util.c
View file @
988b40f7
...
@@ -24,3 +24,7 @@ static void sockaddr_to_string(char *buf, size_t len,
...
@@ -24,3 +24,7 @@ static void sockaddr_to_string(char *buf, size_t len,
inet_ntop
(
usa
->
sa
.
sa_family
,
(
void
*
)
&
usa
->
sin
.
sin_addr
,
buf
,
len
);
inet_ntop
(
usa
->
sa
.
sa_family
,
(
void
*
)
&
usa
->
sin
.
sin_addr
,
buf
,
len
);
#endif
#endif
}
}
static
void
gmt_time_string
(
char
*
buf
,
size_t
buf_len
,
time_t
*
t
)
{
strftime
(
buf
,
buf_len
,
"%a, %d %b %Y %H:%M:%S GMT"
,
gmtime
(
t
));
}
build/src/webdav.c
0 → 100644
View file @
988b40f7
#include "internal.h"
// Writes PROPFIND properties for a collection element
static
void
print_props
(
struct
mg_connection
*
conn
,
const
char
*
uri
,
struct
file
*
filep
)
{
char
mtime
[
64
];
gmt_time_string
(
mtime
,
sizeof
(
mtime
),
&
filep
->
modification_time
);
conn
->
num_bytes_sent
+=
mg_printf
(
conn
,
"<d:response>"
"<d:href>%s</d:href>"
"<d:propstat>"
"<d:prop>"
"<d:resourcetype>%s</d:resourcetype>"
"<d:getcontentlength>%"
INT64_FMT
"</d:getcontentlength>"
"<d:getlastmodified>%s</d:getlastmodified>"
"</d:prop>"
"<d:status>HTTP/1.1 200 OK</d:status>"
"</d:propstat>"
"</d:response>
\n
"
,
uri
,
filep
->
is_directory
?
"<d:collection/>"
:
""
,
filep
->
size
,
mtime
);
}
static
void
print_dav_dir_entry
(
struct
de
*
de
,
void
*
data
)
{
char
href
[
PATH_MAX
];
char
href_encoded
[
PATH_MAX
];
struct
mg_connection
*
conn
=
(
struct
mg_connection
*
)
data
;
mg_snprintf
(
href
,
sizeof
(
href
),
"%s%s"
,
conn
->
request_info
.
uri
,
de
->
file_name
);
mg_url_encode
(
href
,
href_encoded
,
PATH_MAX
-
1
);
print_props
(
conn
,
href_encoded
,
&
de
->
file
);
}
static
void
handle_propfind
(
struct
mg_connection
*
conn
,
const
char
*
path
,
struct
file
*
filep
)
{
const
char
*
depth
=
mg_get_header
(
conn
,
"Depth"
);
conn
->
must_close
=
1
;
conn
->
status_code
=
207
;
mg_printf
(
conn
,
"HTTP/1.1 207 Multi-Status
\r\n
"
"Connection: close
\r\n
"
"Content-Type: text/xml; charset=utf-8
\r\n\r\n
"
);
conn
->
num_bytes_sent
+=
mg_printf
(
conn
,
"<?xml version=
\"
1.0
\"
encoding=
\"
utf-8
\"
?>"
"<d:multistatus xmlns:d='DAV:'>
\n
"
);
// Print properties for the requested resource itself
print_props
(
conn
,
conn
->
request_info
.
uri
,
filep
);
// If it is a directory, print directory entries too if Depth is not 0
if
(
filep
->
is_directory
&&
!
mg_strcasecmp
(
conn
->
ctx
->
config
[
ENABLE_DIRECTORY_LISTING
],
"yes"
)
&&
(
depth
==
NULL
||
strcmp
(
depth
,
"0"
)
!=
0
))
{
scan_directory
(
conn
,
path
,
conn
,
&
print_dav_dir_entry
);
}
conn
->
num_bytes_sent
+=
mg_printf
(
conn
,
"%s
\n
"
,
"</d:multistatus>"
);
}
build/src/websocket.c
0 → 100644
View file @
988b40f7
This diff is collapsed.
Click to expand it.
mongoose.c
View file @
988b40f7
...
@@ -495,6 +495,10 @@ static void sockaddr_to_string(char *buf, size_t len,
...
@@ -495,6 +495,10 @@ static void sockaddr_to_string(char *buf, size_t len,
#endif
#endif
}
}
static
void
gmt_time_string
(
char
*
buf
,
size_t
buf_len
,
time_t
*
t
)
{
strftime
(
buf
,
buf_len
,
"%a, %d %b %Y %H:%M:%S GMT"
,
gmtime
(
t
));
}
static
void
mg_strlcpy
(
register
char
*
dst
,
register
const
char
*
src
,
size_t
n
)
{
static
void
mg_strlcpy
(
register
char
*
dst
,
register
const
char
*
src
,
size_t
n
)
{
for
(;
*
src
!=
'\0'
&&
n
>
1
;
n
--
)
{
for
(;
*
src
!=
'\0'
&&
n
>
1
;
n
--
)
{
*
dst
++
=
*
src
++
;
*
dst
++
=
*
src
++
;
...
@@ -3849,6 +3853,66 @@ int mg_websocket_write(struct mg_connection* conn, int opcode,
...
@@ -3849,6 +3853,66 @@ int mg_websocket_write(struct mg_connection* conn, int opcode,
#endif // !USE_WEBSOCKET
#endif // !USE_WEBSOCKET
// Writes PROPFIND properties for a collection element
static
void
print_props
(
struct
mg_connection
*
conn
,
const
char
*
uri
,
struct
file
*
filep
)
{
char
mtime
[
64
];
gmt_time_string
(
mtime
,
sizeof
(
mtime
),
&
filep
->
modification_time
);
conn
->
num_bytes_sent
+=
mg_printf
(
conn
,
"<d:response>"
"<d:href>%s</d:href>"
"<d:propstat>"
"<d:prop>"
"<d:resourcetype>%s</d:resourcetype>"
"<d:getcontentlength>%"
INT64_FMT
"</d:getcontentlength>"
"<d:getlastmodified>%s</d:getlastmodified>"
"</d:prop>"
"<d:status>HTTP/1.1 200 OK</d:status>"
"</d:propstat>"
"</d:response>
\n
"
,
uri
,
filep
->
is_directory
?
"<d:collection/>"
:
""
,
filep
->
size
,
mtime
);
}
static
void
print_dav_dir_entry
(
struct
de
*
de
,
void
*
data
)
{
char
href
[
PATH_MAX
];
char
href_encoded
[
PATH_MAX
];
struct
mg_connection
*
conn
=
(
struct
mg_connection
*
)
data
;
mg_snprintf
(
href
,
sizeof
(
href
),
"%s%s"
,
conn
->
request_info
.
uri
,
de
->
file_name
);
mg_url_encode
(
href
,
href_encoded
,
PATH_MAX
-
1
);
print_props
(
conn
,
href_encoded
,
&
de
->
file
);
}
static
void
handle_propfind
(
struct
mg_connection
*
conn
,
const
char
*
path
,
struct
file
*
filep
)
{
const
char
*
depth
=
mg_get_header
(
conn
,
"Depth"
);
conn
->
must_close
=
1
;
conn
->
status_code
=
207
;
mg_printf
(
conn
,
"HTTP/1.1 207 Multi-Status
\r\n
"
"Connection: close
\r\n
"
"Content-Type: text/xml; charset=utf-8
\r\n\r\n
"
);
conn
->
num_bytes_sent
+=
mg_printf
(
conn
,
"<?xml version=
\"
1.0
\"
encoding=
\"
utf-8
\"
?>"
"<d:multistatus xmlns:d='DAV:'>
\n
"
);
// Print properties for the requested resource itself
print_props
(
conn
,
conn
->
request_info
.
uri
,
filep
);
// If it is a directory, print directory entries too if Depth is not 0
if
(
filep
->
is_directory
&&
!
mg_strcasecmp
(
conn
->
ctx
->
config
[
ENABLE_DIRECTORY_LISTING
],
"yes"
)
&&
(
depth
==
NULL
||
strcmp
(
depth
,
"0"
)
!=
0
))
{
scan_directory
(
conn
,
path
,
conn
,
&
print_dav_dir_entry
);
}
conn
->
num_bytes_sent
+=
mg_printf
(
conn
,
"%s
\n
"
,
"</d:multistatus>"
);
}
static
int
call_user
(
int
type
,
struct
mg_connection
*
conn
,
void
*
p
)
{
static
int
call_user
(
int
type
,
struct
mg_connection
*
conn
,
void
*
p
)
{
if
(
conn
!=
NULL
&&
conn
->
ctx
!=
NULL
)
{
if
(
conn
!=
NULL
&&
conn
->
ctx
!=
NULL
)
{
conn
->
event
.
user_data
=
conn
->
ctx
->
user_data
;
conn
->
event
.
user_data
=
conn
->
ctx
->
user_data
;
...
@@ -4039,10 +4103,6 @@ static int convert_uri_to_file_name(struct mg_connection *conn, char *buf,
...
@@ -4039,10 +4103,6 @@ static int convert_uri_to_file_name(struct mg_connection *conn, char *buf,
return
0
;
return
0
;
}
}
static
void
gmt_time_string
(
char
*
buf
,
size_t
buf_len
,
time_t
*
t
)
{
strftime
(
buf
,
buf_len
,
"%a, %d %b %Y %H:%M:%S GMT"
,
gmtime
(
t
));
}
static
void
construct_etag
(
char
*
buf
,
size_t
buf_len
,
static
void
construct_etag
(
char
*
buf
,
size_t
buf_len
,
const
struct
file
*
filep
)
{
const
struct
file
*
filep
)
{
snprintf
(
buf
,
buf_len
,
"
\"
%lx.%"
INT64_FMT
"
\"
"
,
snprintf
(
buf
,
buf_len
,
"
\"
%lx.%"
INT64_FMT
"
\"
"
,
...
@@ -4436,66 +4496,6 @@ static void handle_options_request(struct mg_connection *conn) {
...
@@ -4436,66 +4496,6 @@ static void handle_options_request(struct mg_connection *conn) {
mg_write
(
conn
,
reply
,
sizeof
(
reply
)
-
1
);
mg_write
(
conn
,
reply
,
sizeof
(
reply
)
-
1
);
}
}
// Writes PROPFIND properties for a collection element
static
void
print_props
(
struct
mg_connection
*
conn
,
const
char
*
uri
,
struct
file
*
filep
)
{
char
mtime
[
64
];
gmt_time_string
(
mtime
,
sizeof
(
mtime
),
&
filep
->
modification_time
);
conn
->
num_bytes_sent
+=
mg_printf
(
conn
,
"<d:response>"
"<d:href>%s</d:href>"
"<d:propstat>"
"<d:prop>"
"<d:resourcetype>%s</d:resourcetype>"
"<d:getcontentlength>%"
INT64_FMT
"</d:getcontentlength>"
"<d:getlastmodified>%s</d:getlastmodified>"
"</d:prop>"
"<d:status>HTTP/1.1 200 OK</d:status>"
"</d:propstat>"
"</d:response>
\n
"
,
uri
,
filep
->
is_directory
?
"<d:collection/>"
:
""
,
filep
->
size
,
mtime
);
}
static
void
print_dav_dir_entry
(
struct
de
*
de
,
void
*
data
)
{
char
href
[
PATH_MAX
];
char
href_encoded
[
PATH_MAX
];
struct
mg_connection
*
conn
=
(
struct
mg_connection
*
)
data
;
mg_snprintf
(
href
,
sizeof
(
href
),
"%s%s"
,
conn
->
request_info
.
uri
,
de
->
file_name
);
mg_url_encode
(
href
,
href_encoded
,
PATH_MAX
-
1
);
print_props
(
conn
,
href_encoded
,
&
de
->
file
);
}
static
void
handle_propfind
(
struct
mg_connection
*
conn
,
const
char
*
path
,
struct
file
*
filep
)
{
const
char
*
depth
=
mg_get_header
(
conn
,
"Depth"
);
conn
->
must_close
=
1
;
conn
->
status_code
=
207
;
mg_printf
(
conn
,
"HTTP/1.1 207 Multi-Status
\r\n
"
"Connection: close
\r\n
"
"Content-Type: text/xml; charset=utf-8
\r\n\r\n
"
);
conn
->
num_bytes_sent
+=
mg_printf
(
conn
,
"<?xml version=
\"
1.0
\"
encoding=
\"
utf-8
\"
?>"
"<d:multistatus xmlns:d='DAV:'>
\n
"
);
// Print properties for the requested resource itself
print_props
(
conn
,
conn
->
request_info
.
uri
,
filep
);
// If it is a directory, print directory entries too if Depth is not 0
if
(
filep
->
is_directory
&&
!
mg_strcasecmp
(
conn
->
ctx
->
config
[
ENABLE_DIRECTORY_LISTING
],
"yes"
)
&&
(
depth
==
NULL
||
strcmp
(
depth
,
"0"
)
!=
0
))
{
scan_directory
(
conn
,
path
,
conn
,
&
print_dav_dir_entry
);
}
conn
->
num_bytes_sent
+=
mg_printf
(
conn
,
"%s
\n
"
,
"</d:multistatus>"
);
}
static
int
isbyte
(
int
n
)
{
static
int
isbyte
(
int
n
)
{
return
n
>=
0
&&
n
<=
255
;
return
n
>=
0
&&
n
<=
255
;
}
}
...
...
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