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
6ef2fea4
Commit
6ef2fea4
authored
9 years ago
by
Marko Mikulicic
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Workaround lx106 gcc bug stack frame size rounding
PUBLISHED_FROM=66906d0e5f6d97b135bd157f5f82dc13bef2fb1a
parent
e244dd84
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
41 additions
and
22 deletions
+41
-22
mongoose.c
mongoose.c
+41
-22
No files found.
mongoose.c
View file @
6ef2fea4
...
...
@@ -4248,9 +4248,28 @@ MG_INTERNAL size_t mg_handle_chunked(struct mg_connection *nc,
return
body_len
;
}
static
void
http_handler
(
struct
mg_connection
*
nc
,
int
ev
,
void
*
ev_data
)
{
struct
mbuf
*
io
=
&
nc
->
recv_mbuf
;
/*
* lx106 compiler has a bug (TODO(mkm) report and insert tracking bug here)
* If a big structure is declared in a big function, lx106 gcc will make it
* even bigger (round up to 4k, from 700 bytes of actual size).
*/
#ifdef MG_ESP8266
static
void
http_handler2
(
struct
mg_connection
*
nc
,
int
ev
,
void
*
ev_data
,
struct
http_message
*
hm
);
void
http_handler
(
struct
mg_connection
*
nc
,
int
ev
,
void
*
ev_data
)
{
struct
http_message
hm
;
http_handler2
(
nc
,
ev
,
ev_data
,
&
hm
);
}
static
void
http_handler2
(
struct
mg_connection
*
nc
,
int
ev
,
void
*
ev_data
,
struct
http_message
*
hm
)
{
#else
void
http_handler
(
struct
mg_connection
*
nc
,
int
ev
,
void
*
ev_data
)
{
struct
http_message
shm
;
struct
http_message
*
hm
=
&
shm
;
#endif
struct
mbuf
*
io
=
&
nc
->
recv_mbuf
;
int
req_len
;
const
int
is_req
=
(
nc
->
listener
!=
NULL
);
#ifndef MG_DISABLE_HTTP_WEBSOCKET
...
...
@@ -4261,10 +4280,10 @@ static void http_handler(struct mg_connection *nc, int ev, void *ev_data) {
* For HTTP messages without Content-Length, always send HTTP message
* before MG_EV_CLOSE message.
*/
if
(
io
->
len
>
0
&&
mg_parse_http
(
io
->
buf
,
io
->
len
,
&
hm
,
is_req
)
>
0
)
{
hm
.
message
.
len
=
io
->
len
;
hm
.
body
.
len
=
io
->
buf
+
io
->
len
-
hm
.
body
.
p
;
nc
->
handler
(
nc
,
is_req
?
MG_EV_HTTP_REQUEST
:
MG_EV_HTTP_REPLY
,
&
hm
);
if
(
io
->
len
>
0
&&
mg_parse_http
(
io
->
buf
,
io
->
len
,
hm
,
is_req
)
>
0
)
{
hm
->
message
.
len
=
io
->
len
;
hm
->
body
.
len
=
io
->
buf
+
io
->
len
-
hm
->
body
.
p
;
nc
->
handler
(
nc
,
is_req
?
MG_EV_HTTP_REQUEST
:
MG_EV_HTTP_REPLY
,
hm
);
}
free_http_proto_data
(
nc
);
}
...
...
@@ -4277,12 +4296,12 @@ static void http_handler(struct mg_connection *nc, int ev, void *ev_data) {
if
(
ev
==
MG_EV_RECV
)
{
struct
mg_str
*
s
;
req_len
=
mg_parse_http
(
io
->
buf
,
io
->
len
,
&
hm
,
is_req
);
req_len
=
mg_parse_http
(
io
->
buf
,
io
->
len
,
hm
,
is_req
);
if
(
req_len
>
0
&&
(
s
=
mg_get_http_header
(
&
hm
,
"Transfer-Encoding"
))
!=
NULL
&&
(
s
=
mg_get_http_header
(
hm
,
"Transfer-Encoding"
))
!=
NULL
&&
mg_vcasecmp
(
s
,
"chunked"
)
==
0
)
{
mg_handle_chunked
(
nc
,
&
hm
,
io
->
buf
+
req_len
,
io
->
len
-
req_len
);
mg_handle_chunked
(
nc
,
hm
,
io
->
buf
+
req_len
,
io
->
len
-
req_len
);
}
if
(
req_len
<
0
||
(
req_len
==
0
&&
io
->
len
>=
MG_MAX_HTTP_REQUEST_SIZE
))
{
...
...
@@ -4292,7 +4311,7 @@ static void http_handler(struct mg_connection *nc, int ev, void *ev_data) {
}
#ifndef MG_DISABLE_HTTP_WEBSOCKET
else
if
(
nc
->
listener
==
NULL
&&
mg_get_http_header
(
&
hm
,
"Sec-WebSocket-Accept"
))
{
mg_get_http_header
(
hm
,
"Sec-WebSocket-Accept"
))
{
/* We're websocket client, got handshake response from server. */
/* TODO(lsm): check the validity of accept Sec-WebSocket-Accept */
mbuf_remove
(
io
,
req_len
);
...
...
@@ -4301,14 +4320,14 @@ static void http_handler(struct mg_connection *nc, int ev, void *ev_data) {
nc
->
handler
(
nc
,
MG_EV_WEBSOCKET_HANDSHAKE_DONE
,
NULL
);
websocket_handler
(
nc
,
MG_EV_RECV
,
ev_data
);
}
else
if
(
nc
->
listener
!=
NULL
&&
(
vec
=
mg_get_http_header
(
&
hm
,
"Sec-WebSocket-Key"
))
!=
NULL
)
{
(
vec
=
mg_get_http_header
(
hm
,
"Sec-WebSocket-Key"
))
!=
NULL
)
{
/* This is a websocket request. Switch protocol handlers. */
mbuf_remove
(
io
,
req_len
);
nc
->
proto_handler
=
websocket_handler
;
nc
->
flags
|=
MG_F_IS_WEBSOCKET
;
/* Send handshake */
nc
->
handler
(
nc
,
MG_EV_WEBSOCKET_HANDSHAKE_REQUEST
,
&
hm
);
nc
->
handler
(
nc
,
MG_EV_WEBSOCKET_HANDSHAKE_REQUEST
,
hm
);
if
(
!
(
nc
->
flags
&
MG_F_CLOSE_IMMEDIATELY
))
{
if
(
nc
->
send_mbuf
.
len
==
0
)
{
ws_handshake
(
nc
,
vec
);
...
...
@@ -4318,7 +4337,7 @@ static void http_handler(struct mg_connection *nc, int ev, void *ev_data) {
}
}
#endif
/* MG_DISABLE_HTTP_WEBSOCKET */
else
if
(
hm
.
message
.
len
<=
io
->
len
)
{
else
if
(
hm
->
message
.
len
<=
io
->
len
)
{
int
trigger_ev
=
nc
->
listener
?
MG_EV_HTTP_REQUEST
:
MG_EV_HTTP_REPLY
;
/* Whole HTTP message is fully buffered, call event handler */
...
...
@@ -4341,15 +4360,15 @@ static void http_handler(struct mg_connection *nc, int ev, void *ev_data) {
/* Populate request object */
v7_set
(
v7
,
req
,
"method"
,
~
0
,
0
,
v7_create_string
(
v7
,
hm
.
method
.
p
,
hm
.
method
.
len
,
1
));
v7_create_string
(
v7
,
hm
->
method
.
p
,
hm
->
method
.
len
,
1
));
v7_set
(
v7
,
req
,
"uri"
,
~
0
,
0
,
v7_create_string
(
v7
,
hm
.
uri
.
p
,
hm
.
uri
.
len
,
1
));
v7_create_string
(
v7
,
hm
->
uri
.
p
,
hm
->
uri
.
len
,
1
));
v7_set
(
v7
,
req
,
"body"
,
~
0
,
0
,
v7_create_string
(
v7
,
hm
.
body
.
p
,
hm
.
body
.
len
,
1
));
v7_create_string
(
v7
,
hm
->
body
.
p
,
hm
->
body
.
len
,
1
));
v7_set
(
v7
,
req
,
"headers"
,
~
0
,
0
,
headers
);
for
(
i
=
0
;
hm
.
header_names
[
i
].
len
>
0
;
i
++
)
{
const
struct
mg_str
*
name
=
&
hm
.
header_names
[
i
];
const
struct
mg_str
*
value
=
&
hm
.
header_values
[
i
];
for
(
i
=
0
;
hm
->
header_names
[
i
].
len
>
0
;
i
++
)
{
const
struct
mg_str
*
name
=
&
hm
->
header_names
[
i
];
const
struct
mg_str
*
value
=
&
hm
->
header_values
[
i
];
v7_set
(
v7
,
headers
,
name
->
p
,
name
->
len
,
0
,
v7_create_string
(
v7
,
value
->
p
,
value
->
len
,
1
));
}
...
...
@@ -4367,12 +4386,12 @@ static void http_handler(struct mg_connection *nc, int ev, void *ev_data) {
if
(
js_callback_handled_request
)
{
nc
->
flags
|=
MG_F_SEND_AND_CLOSE
;
}
else
{
nc
->
handler
(
nc
,
trigger_ev
,
&
hm
);
nc
->
handler
(
nc
,
trigger_ev
,
hm
);
}
#else
nc
->
handler
(
nc
,
trigger_ev
,
&
hm
);
nc
->
handler
(
nc
,
trigger_ev
,
hm
);
#endif
mbuf_remove
(
io
,
hm
.
message
.
len
);
mbuf_remove
(
io
,
hm
->
message
.
len
);
}
}
}
...
...
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