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
14e11655
Commit
14e11655
authored
9 years ago
by
Marko Mikulicic
Committed by
rojer
9 years ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add mg_connect_ws helper
PUBLISHED_FROM=0ff1c9becea2f0842dcf020d2d2ad64a8c5d95ae
parent
c82ccd6c
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
162 additions
and
35 deletions
+162
-35
mongoose.c
mongoose.c
+116
-35
mongoose.h
mongoose.h
+46
-0
No files found.
mongoose.c
View file @
14e11655
...
...
@@ -4159,6 +4159,10 @@ int mg_normalize_uri_path(const struct mg_str *in, struct mg_str *out) {
/* Amalgamated: #include "common/sha1.h" */
/* Amalgamated: #include "common/md5.h" */
#ifndef MG_DISABLE_HTTP_WEBSOCKET
#define MG_WS_NO_HOST_HEADER_MAGIC ((char *) 0x1)
#endif
enum
mg_http_proto_data_type
{
DATA_NONE
,
DATA_FILE
,
DATA_PUT
};
struct
mg_http_proto_data_file
{
...
...
@@ -5365,9 +5369,11 @@ void mg_set_protocol_http_websocket(struct mg_connection *nc) {
#ifndef MG_DISABLE_HTTP_WEBSOCKET
void
mg_send_websocket_handshake
(
struct
mg_connection
*
nc
,
const
char
*
uri
,
const
char
*
extra_headers
)
{
unsigned
long
random
=
(
unsigned
long
)
uri
;
void
mg_send_websocket_handshake2
(
struct
mg_connection
*
nc
,
const
char
*
path
,
const
char
*
host
,
const
char
*
protocol
,
const
char
*
extra_headers
)
{
/* pretty poor source of randomness, TODO fix */
unsigned
long
random
=
(
unsigned
long
)
path
;
char
key
[
sizeof
(
random
)
*
3
];
mg_base64_encode
((
unsigned
char
*
)
&
random
,
sizeof
(
random
),
key
);
...
...
@@ -5376,9 +5382,26 @@ void mg_send_websocket_handshake(struct mg_connection *nc, const char *uri,
"Upgrade: websocket
\r\n
"
"Connection: Upgrade
\r\n
"
"Sec-WebSocket-Version: 13
\r\n
"
"Sec-WebSocket-Key: %s
\r\n
"
"%s
\r\n
"
,
uri
,
key
,
extra_headers
==
NULL
?
""
:
extra_headers
);
"Sec-WebSocket-Key: %s
\r\n
"
,
path
,
key
);
/* TODO(mkm): take default hostname from http proto data if host == NULL */
if
(
host
!=
MG_WS_NO_HOST_HEADER_MAGIC
)
{
mg_printf
(
nc
,
"Host: %s
\r\n
"
,
host
);
}
if
(
protocol
!=
NULL
)
{
mg_printf
(
nc
,
"Sec-WebSocket-Protocol: %s
\r\n
"
,
protocol
);
}
if
(
extra_headers
!=
NULL
)
{
mg_printf
(
nc
,
"%s"
,
extra_headers
);
}
mg_printf
(
nc
,
"
\r\n
"
);
}
void
mg_send_websocket_handshake
(
struct
mg_connection
*
nc
,
const
char
*
path
,
const
char
*
extra_headers
)
{
mg_send_websocket_handshake2
(
nc
,
path
,
MG_WS_NO_HOST_HEADER_MAGIC
,
NULL
,
extra_headers
);
}
#endif
/* MG_DISABLE_HTTP_WEBSOCKET */
...
...
@@ -7357,52 +7380,110 @@ void mg_serve_http(struct mg_connection *nc, struct http_message *hm,
#endif
/* MG_DISABLE_FILESYSTEM */
struct
mg_connection
*
mg_connect_http
(
struct
mg_mgr
*
mgr
,
mg_event_handler_t
ev_handler
,
const
char
*
url
,
const
char
*
extra_headers
,
const
char
*
post_data
)
{
struct
mg_connection
*
nc
=
NULL
;
char
*
addr
=
NULL
;
const
char
*
path
=
NULL
;
int
use_ssl
=
0
,
addr_len
=
0
,
port_i
=
-
1
;
if
(
memcmp
(
url
,
"http://"
,
7
)
==
0
)
{
url
+=
7
;
}
else
if
(
memcmp
(
url
,
"https://"
,
8
)
==
0
)
{
url
+=
8
;
use_ssl
=
1
;
/* returns 0 on success, -1 on error */
static
int
mg_http_common_url_parse
(
const
char
*
url
,
const
char
*
schema
,
const
char
*
schema_tls
,
int
*
use_ssl
,
char
**
addr
,
int
*
port_i
,
const
char
**
path
)
{
int
addr_len
=
0
;
if
(
memcmp
(
url
,
schema
,
strlen
(
schema
))
==
0
)
{
url
+=
strlen
(
schema
);
}
else
if
(
memcmp
(
url
,
schema_tls
,
strlen
(
schema_tls
))
==
0
)
{
url
+=
strlen
(
schema_tls
);
*
use_ssl
=
1
;
#ifndef MG_ENABLE_SSL
return
NULL
;
/* SSL is not enabled, cannot do HTTPS URLs */
return
-
1
;
/* SSL is not enabled, cannot do HTTPS URLs */
#endif
}
while
(
*
url
!=
'\0'
)
{
addr
=
(
char
*
)
MG_REALLOC
(
addr
,
addr_len
+
5
/* space for port too. */
);
if
(
addr
==
NULL
)
{
*
addr
=
(
char
*
)
MG_REALLOC
(
*
addr
,
addr_len
+
5
/* space for port too. */
);
if
(
*
addr
==
NULL
)
{
DBG
((
"OOM"
));
return
NULL
;
return
-
1
;
}
if
(
*
url
==
'/'
)
{
url
++
;
break
;
}
if
(
*
url
==
':'
)
port_i
=
addr_len
;
addr
[
addr_len
++
]
=
*
url
;
addr
[
addr_len
]
=
'\0'
;
if
(
*
url
==
':'
)
*
port_i
=
addr_len
;
(
*
addr
)
[
addr_len
++
]
=
*
url
;
(
*
addr
)
[
addr_len
]
=
'\0'
;
url
++
;
}
if
(
addr_len
==
0
)
goto
cleanup
;
if
(
port_i
<
0
)
{
port_i
=
addr_len
;
strcpy
(
addr
+
port_i
,
use_ssl
?
":443"
:
":80"
);
if
(
*
port_i
<
0
)
{
*
port_i
=
addr_len
;
strcpy
(
*
addr
+
*
port_i
,
*
use_ssl
?
":443"
:
":80"
);
}
else
{
port_i
=
-
1
;
*
port_i
=
-
1
;
}
if
(
*
path
==
NULL
)
*
path
=
url
;
if
(
**
path
==
'\0'
)
*
path
=
"/"
;
DBG
((
"%s %s"
,
*
addr
,
*
path
));
return
0
;
cleanup:
MG_FREE
(
*
addr
);
return
-
1
;
}
struct
mg_connection
*
mg_connect_ws
(
struct
mg_mgr
*
mgr
,
mg_event_handler_t
ev_handler
,
const
char
*
url
,
const
char
*
protocol
,
const
char
*
extra_headers
)
{
struct
mg_connection
*
nc
=
NULL
;
char
*
addr
=
NULL
;
int
port_i
=
-
1
;
const
char
*
path
=
NULL
;
int
use_ssl
=
0
;
if
(
mg_http_common_url_parse
(
url
,
"ws://"
,
"wss://"
,
&
use_ssl
,
&
addr
,
&
port_i
,
&
path
)
<
0
)
{
DBG
((
"%p: error parsing wss url: %s"
,
(
void
*
)
nc
,
url
));
return
NULL
;
}
if
(
path
==
NULL
)
path
=
url
;
if
((
nc
=
mg_connect
(
mgr
,
addr
,
ev_handler
))
!=
NULL
)
{
mg_set_protocol_http_websocket
(
nc
);
if
(
use_ssl
)
{
#ifdef MG_ENABLE_SSL
mg_set_ssl
(
nc
,
NULL
,
NULL
);
#endif
}
/* If the port was addred by us, restore the original host. */
if
(
port_i
>=
0
)
addr
[
port_i
]
=
'\0'
;
mg_send_websocket_handshake2
(
nc
,
path
,
addr
,
protocol
,
extra_headers
);
}
MG_FREE
(
addr
);
return
nc
;
}
struct
mg_connection
*
mg_connect_http
(
struct
mg_mgr
*
mgr
,
mg_event_handler_t
ev_handler
,
const
char
*
url
,
const
char
*
extra_headers
,
const
char
*
post_data
)
{
struct
mg_connection
*
nc
=
NULL
;
char
*
addr
=
NULL
;
int
port_i
=
-
1
;
const
char
*
path
=
NULL
;
int
use_ssl
=
0
;
if
(
mg_http_common_url_parse
(
url
,
"http://"
,
"https://"
,
&
use_ssl
,
&
addr
,
&
port_i
,
&
path
)
<
0
)
{
return
NULL
;
}
DBG
((
"%s %s"
,
addr
,
path
));
if
((
nc
=
mg_connect
(
mgr
,
addr
,
ev_handler
))
!=
NULL
)
{
mg_set_protocol_http_websocket
(
nc
);
...
...
@@ -7414,6 +7495,7 @@ struct mg_connection *mg_connect_http(struct mg_mgr *mgr,
/* If the port was addred by us, restore the original host. */
if
(
port_i
>=
0
)
addr
[
port_i
]
=
'\0'
;
mg_printf
(
nc
,
"%s /%s HTTP/1.1
\r\n
Host: %s
\r\n
Content-Length: %"
SIZE_T_FMT
"
\r\n
%s
\r\n
%s"
,
post_data
==
NULL
?
"GET"
:
"POST"
,
path
,
addr
,
...
...
@@ -7422,7 +7504,6 @@ struct mg_connection *mg_connect_http(struct mg_mgr *mgr,
post_data
==
NULL
?
""
:
post_data
);
}
cleanup:
MG_FREE
(
addr
);
return
nc
;
}
...
...
This diff is collapsed.
Click to expand it.
mongoose.h
View file @
14e11655
...
...
@@ -1990,10 +1990,56 @@ void mg_set_protocol_http_websocket(struct mg_connection *nc);
* to fetch, extra_headers` is extra HTTP headers to send or `NULL`.
*
* This function is intended to be used by websocket client.
*
* Note that the Host header is mandatory in HTTP/1.1 and must be
* included in `extra_headers`. `mg_send_websocket_handshake2` offers
* a better API for that.
*
* Deprecated in favour of `mg_send_websocket_handshake2`
*/
void
mg_send_websocket_handshake
(
struct
mg_connection
*
nc
,
const
char
*
uri
,
const
char
*
extra_headers
);
/*
* Send websocket handshake to the server.
*
* `nc` must be a valid connection, connected to a server. `uri` is an URI
* to fetch, `host` goes into the `Host` header, `protocol` goes into the
* `Sec-WebSocket-Proto` header (NULL to omit), extra_headers` is extra HTTP
* headers to send or `NULL`.
*
* This function is intended to be used by websocket client.
*/
void
mg_send_websocket_handshake2
(
struct
mg_connection
*
nc
,
const
char
*
path
,
const
char
*
host
,
const
char
*
protocol
,
const
char
*
extra_headers
);
/*
* Helper function that creates an outbound WebSocket connection.
*
* `url` is a URL to connect to. It must be properly URL-encoded, e.g. have
* no spaces, etc. By default, `mg_connect_ws()` sends Connection and
* Host headers. `extra_headers` is an extra HTTP headers to send, e.g.
* `"User-Agent: my-app\r\n"`.
* If `protocol` is not NULL, then a `Sec-WebSocket-Protocol` header is sent.
*
* Examples:
*
* [source,c]
* ----
* nc1 = mg_connect_ws(mgr, ev_handler_1, "ws://echo.websocket.org", NULL,
* NULL);
* nc2 = mg_connect_ws(mgr, ev_handler_1, "wss://echo.websocket.org", NULL,
* NULL);
* nc3 = mg_connect_ws(mgr, ev_handler_1, "ws://api.cesanta.com",
* "clubby.cesanta.com", NULL);
* ----
*/
struct
mg_connection
*
mg_connect_ws
(
struct
mg_mgr
*
mgr
,
mg_event_handler_t
event_handler
,
const
char
*
url
,
const
char
*
protocol
,
const
char
*
extra_headers
);
/*
* Send websocket frame to the remote end.
*
...
...
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