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
cfe80ba9
Commit
cfe80ba9
authored
Dec 08, 2015
by
Alexander Alashkin
Committed by
rojer
Dec 11, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add WebDAV support to sjs/esp8266
PUBLISHED_FROM=a68a2f205cb2f10809183d5160709981585538b7
parent
35abfd44
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
109 additions
and
11 deletions
+109
-11
mongoose.c
mongoose.c
+82
-11
mongoose.h
mongoose.h
+27
-0
No files found.
mongoose.c
View file @
cfe80ba9
...
...
@@ -342,7 +342,7 @@ void cs_log_set_level(enum cs_log_level level) {
s_cs_log_level
=
level
;
}
#ifdef NS_MODULE_LINES
#line 1 "src/../../common/dirent.c"
#line 1 "src/../../common/
cs_
dirent.c"
/**/
#endif
/*
...
...
@@ -353,6 +353,7 @@ void cs_log_set_level(enum cs_log_level level) {
#ifndef EXCLUDE_COMMON
/* Amalgamated: #include "osdep.h" */
/* Amalgamated: #include "cs_dirent.h" */
/*
* This file contains POSIX opendir/closedir/readdir API implementation
...
...
@@ -434,6 +435,48 @@ struct dirent *readdir(DIR *dir) {
}
#endif
#ifdef CS_ENABLE_SPIFFS
DIR
*
opendir
(
const
char
*
dir_name
)
{
DIR
*
dir
=
NULL
;
extern
spiffs
fs
;
if
(
dir_name
!=
NULL
&&
(
dir
=
(
DIR
*
)
malloc
(
sizeof
(
*
dir
)))
!=
NULL
&&
SPIFFS_opendir
(
&
fs
,
(
char
*
)
dir_name
,
&
dir
->
dh
)
==
NULL
)
{
free
(
dir
);
dir
=
NULL
;
}
return
dir
;
}
int
closedir
(
DIR
*
dir
)
{
if
(
dir
!=
NULL
)
{
SPIFFS_closedir
(
&
dir
->
dh
);
free
(
dir
);
}
return
0
;
}
struct
dirent
*
readdir
(
DIR
*
dir
)
{
return
SPIFFS_readdir
(
&
dir
->
dh
,
&
dir
->
de
);
}
/* SPIFFs doesn't support directory operations */
int
rmdir
(
const
char
*
path
)
{
(
void
)
path
;
return
ENOTDIR
;
}
int
mkdir
(
const
char
*
path
,
mode_t
mode
)
{
(
void
)
path
;
(
void
)
mode
;
/* for spiffs supports only root dir, which comes from mongoose as '.' */
return
(
strlen
(
path
)
==
1
&&
*
path
==
'.'
)
?
0
:
ENOTDIR
;
}
#endif
/* CS_ENABLE_SPIFFS */
#endif
/* EXCLUDE_COMMON */
#ifdef NS_MODULE_LINES
#line 1 "src/../deps/frozen/frozen.c"
...
...
@@ -5309,12 +5352,12 @@ static void scan_directory(struct mg_connection *nc, const char *dir,
if
((
dirp
=
(
opendir
(
dir
)))
!=
NULL
)
{
while
((
dp
=
readdir
(
dirp
))
!=
NULL
)
{
/* Do not show current dir and hidden files */
if
(
is_file_hidden
(
dp
->
d_name
,
opts
))
{
if
(
is_file_hidden
(
(
const
char
*
)
dp
->
d_name
,
opts
))
{
continue
;
}
snprintf
(
path
,
sizeof
(
path
),
"%s/%s"
,
dir
,
dp
->
d_name
);
if
(
mg_stat
(
path
,
&
st
)
==
0
)
{
func
(
nc
,
dp
->
d_name
,
&
st
);
func
(
nc
,
(
const
char
*
)
dp
->
d_name
,
&
st
);
}
}
closedir
(
dirp
);
...
...
@@ -5371,6 +5414,7 @@ static void print_props(struct mg_connection *nc, const char *name,
time_t
t
=
stp
->
st_mtime
;
/* store in local variable for NDK compile */
gmt_time_string
(
mtime
,
sizeof
(
mtime
),
&
t
);
mg_url_encode
(
name
,
strlen
(
name
),
buf
,
sizeof
(
buf
));
#ifndef MG_ESP8266
mg_printf
(
nc
,
"<d:response>"
"<d:href>%s</d:href>"
...
...
@@ -5386,6 +5430,28 @@ static void print_props(struct mg_connection *nc, const char *name,
"</d:response>
\n
"
,
buf
,
S_ISDIR
(
stp
->
st_mode
)
?
"<d:collection/>"
:
""
,
(
int64_t
)
stp
->
st_size
,
mtime
);
#else
/*
* TODO(alashkin): esp's sprintf doesn't handle INT64_FMT and call abort()
* Fix it
*/
mg_printf
(
nc
,
"<d:response>"
"<d:href>%s</d:href>"
"<d:propstat>"
"<d:prop>"
"<d:resourcetype>%s</d:resourcetype>"
"<d:getcontentlength>%lu"
"</d:getcontentlength>"
"<d:getlastmodified>%s</d:getlastmodified>"
"</d:prop>"
"<d:status>HTTP/1.1 200 OK</d:status>"
"</d:propstat>"
"</d:response>
\n
"
,
buf
,
S_ISDIR
(
stp
->
st_mode
)
?
"<d:collection/>"
:
""
,
(
unsigned
long
)
stp
->
st_size
,
mtime
);
#endif
}
static
void
handle_propfind
(
struct
mg_connection
*
nc
,
const
char
*
path
,
...
...
@@ -5434,7 +5500,8 @@ static void handle_mkcol(struct mg_connection *nc, const char *path,
send_http_error
(
nc
,
status_code
,
NULL
);
}
static
int
remove_directory
(
const
char
*
dir
)
{
static
int
remove_directory
(
const
struct
mg_serve_http_opts
*
opts
,
const
char
*
dir
)
{
char
path
[
MAX_PATH_SIZE
];
struct
dirent
*
dp
;
cs_stat_t
st
;
...
...
@@ -5443,11 +5510,13 @@ static int remove_directory(const char *dir) {
if
((
dirp
=
opendir
(
dir
))
==
NULL
)
return
0
;
while
((
dp
=
readdir
(
dirp
))
!=
NULL
)
{
if
(
!
strcmp
(
dp
->
d_name
,
"."
)
||
!
strcmp
(
dp
->
d_name
,
".."
))
continue
;
if
(
is_file_hidden
((
const
char
*
)
dp
->
d_name
,
opts
))
{
continue
;
}
snprintf
(
path
,
sizeof
(
path
),
"%s%c%s"
,
dir
,
'/'
,
dp
->
d_name
);
mg_stat
(
path
,
&
st
);
if
(
S_ISDIR
(
st
.
st_mode
))
{
remove_directory
(
path
);
remove_directory
(
opts
,
path
);
}
else
{
remove
(
path
);
}
...
...
@@ -5458,12 +5527,14 @@ static int remove_directory(const char *dir) {
return
1
;
}
static
void
handle_delete
(
struct
mg_connection
*
nc
,
const
char
*
path
)
{
static
void
handle_delete
(
struct
mg_connection
*
nc
,
const
struct
mg_serve_http_opts
*
opts
,
const
char
*
path
)
{
cs_stat_t
st
;
if
(
mg_stat
(
path
,
&
st
)
!=
0
)
{
send_http_error
(
nc
,
404
,
NULL
);
}
else
if
(
S_ISDIR
(
st
.
st_mode
))
{
remove_directory
(
path
);
remove_directory
(
opts
,
path
);
send_http_error
(
nc
,
204
,
NULL
);
}
else
if
(
remove
(
path
)
==
0
)
{
send_http_error
(
nc
,
204
,
NULL
);
...
...
@@ -6170,9 +6241,9 @@ static void mg_send_digest_auth_request(struct mg_connection *c,
static
void
send_options
(
struct
mg_connection
*
nc
)
{
mg_printf
(
nc
,
"%s"
,
"HTTP/1.1 200 OK
\r\n
Allow: GET, POST, HEAD, CONNECT, PUT, "
"DELETE, OPTIONS, MKCOL
,
"
"DELETE, OPTIONS, MKCOL"
#ifndef MG_DISABLE_DAV
"PROPFIND
\r\n
DAV: 1"
"
,
PROPFIND
\r\n
DAV: 1"
#endif
"
\r\n\r\n
"
);
nc
->
flags
|=
MG_F_SEND_AND_CLOSE
;
...
...
@@ -6219,7 +6290,7 @@ void mg_send_http_file(struct mg_connection *nc, char *path,
}
else
if
(
!
mg_vcmp
(
&
hm
->
method
,
"MKCOL"
))
{
handle_mkcol
(
nc
,
path
,
hm
);
}
else
if
(
!
mg_vcmp
(
&
hm
->
method
,
"DELETE"
))
{
handle_delete
(
nc
,
path
);
handle_delete
(
nc
,
opts
,
path
);
}
else
if
(
!
mg_vcmp
(
&
hm
->
method
,
"PUT"
))
{
handle_put
(
nc
,
path
,
hm
);
#endif
...
...
mongoose.h
View file @
cfe80ba9
...
...
@@ -603,6 +603,33 @@ int json_emit_va(char *buf, int buf_len, const char *fmt, va_list);
#endif
/* __cplusplus */
#endif
/* FROZEN_HEADER_INCLUDED */
#ifndef DIRENT_H_INCLUDED
#define DIRENT_H_INCLUDED
#ifdef CS_ENABLE_SPIFFS
#include <spiffs.h>
typedef
struct
{
spiffs_DIR
dh
;
struct
spiffs_dirent
de
;
}
DIR
;
#define d_name name
#define dirent spiffs_dirent
int
rmdir
(
const
char
*
path
);
int
mkdir
(
const
char
*
path
,
mode_t
mode
);
#endif
#if defined(_WIN32) || defined(CS_ENABLE_SPIFFS)
DIR
*
opendir
(
const
char
*
dir_name
);
int
closedir
(
DIR
*
dir
);
struct
dirent
*
readdir
(
DIR
*
dir
);
#endif
#endif
/*
* Copyright (c) 2014 Cesanta Software Limited
* All rights reserved
...
...
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