mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-26 12:14:56 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80d74e9e34 | ||
|
|
43a0b500f5 | ||
|
|
3d53ed17fb | ||
|
|
4ea452307e | ||
|
|
e61f20f1ed | ||
|
|
ca11f5ab49 | ||
|
|
000d24d31a | ||
|
|
ef92f2e9c5 | ||
|
|
4e89eac8dd | ||
|
|
b015e33ea5 | ||
|
|
96e762d4a1 | ||
|
|
359060a151 | ||
|
|
af1aff7fbb | ||
|
|
517ef216c1 | ||
|
|
734c13cdf5 | ||
|
|
1bf3ad2426 | ||
|
|
884b9a4813 | ||
|
|
7153690016 | ||
|
|
f00b3a2b3a | ||
|
|
c2b5e4f3b8 | ||
|
|
bc15e9ce9a | ||
|
|
70dc6d8dc9 | ||
|
|
10b11b03a8 | ||
|
|
cb602f178c | ||
|
|
464113c5ae | ||
|
|
c34f6c54e7 | ||
|
|
8fb58ebbca | ||
|
|
dce60c6dbb | ||
|
|
f668d08804 |
No files matched your search
@@ -61,8 +61,11 @@ the functionality:
|
|||||||
|
|
||||||
# Contributions
|
# Contributions
|
||||||
|
|
||||||
To submit contributions, sign [Cesanta CLA](https://cesanta.com/cla.html)
|
Contributions are welcome! Please follow the guidelines below:
|
||||||
and send GitHub pull request.
|
|
||||||
|
- Sign [Cesanta CLA](https://cesanta.com/cla.html) and send GitHub pull request
|
||||||
|
- When making pull requests, please make sure that it has only one commit,
|
||||||
|
and imlements/fixes only one piece of functionality
|
||||||
|
|
||||||
# Looking for a pre-compiled Mongoose web server Windows or Mac binary?
|
# Looking for a pre-compiled Mongoose web server Windows or Mac binary?
|
||||||
- [Download pre-compiled Mongoose web server binary.](https://www.cesanta.com/binary.html)
|
- [Download pre-compiled Mongoose web server binary.](https://www.cesanta.com/binary.html)
|
||||||
@@ -16,9 +16,6 @@ signature: |
|
|||||||
struct mbuf send_mbuf; /* Data scheduled for sending */
|
struct mbuf send_mbuf; /* Data scheduled for sending */
|
||||||
time_t last_io_time; /* Timestamp of the last socket IO */
|
time_t last_io_time; /* Timestamp of the last socket IO */
|
||||||
double ev_timer_time; /* Timestamp of the future MG_EV_TIMER */
|
double ev_timer_time; /* Timestamp of the future MG_EV_TIMER */
|
||||||
#if MG_ENABLE_SSL
|
|
||||||
void *ssl_if_data; /* SSL library data. */
|
|
||||||
#endif
|
|
||||||
mg_event_handler_t proto_handler; /* Protocol-specific event handler */
|
mg_event_handler_t proto_handler; /* Protocol-specific event handler */
|
||||||
void *proto_data; /* Protocol-specific data */
|
void *proto_data; /* Protocol-specific data */
|
||||||
void (*proto_data_destructor)(void *proto_data);
|
void (*proto_data_destructor)(void *proto_data);
|
||||||
@@ -51,16 +48,25 @@ signature: |
|
|||||||
/* Flags that are settable by user */
|
/* Flags that are settable by user */
|
||||||
#define MG_F_SEND_AND_CLOSE (1 << 10) /* Push remaining data and close */
|
#define MG_F_SEND_AND_CLOSE (1 << 10) /* Push remaining data and close */
|
||||||
#define MG_F_CLOSE_IMMEDIATELY (1 << 11) /* Disconnect */
|
#define MG_F_CLOSE_IMMEDIATELY (1 << 11) /* Disconnect */
|
||||||
#define MG_F_WEBSOCKET_NO_DEFRAG (1 << 12) /* Websocket specific */
|
|
||||||
#define MG_F_DELETE_CHUNK (1 << 13) /* HTTP specific */
|
/* Flags for protocol handlers */
|
||||||
|
#define MG_F_PROTO_1 (1 << 12)
|
||||||
|
#define MG_F_PROTO_2 (1 << 13)
|
||||||
#define MG_F_ENABLE_BROADCAST (1 << 14) /* Allow broadcast address usage */
|
#define MG_F_ENABLE_BROADCAST (1 << 14) /* Allow broadcast address usage */
|
||||||
|
|
||||||
#define MG_F_USER_1 (1 << 20) /* Flags left for application */
|
/* Flags left for application */
|
||||||
|
#define MG_F_USER_1 (1 << 20)
|
||||||
#define MG_F_USER_2 (1 << 21)
|
#define MG_F_USER_2 (1 << 21)
|
||||||
#define MG_F_USER_3 (1 << 22)
|
#define MG_F_USER_3 (1 << 22)
|
||||||
#define MG_F_USER_4 (1 << 23)
|
#define MG_F_USER_4 (1 << 23)
|
||||||
#define MG_F_USER_5 (1 << 24)
|
#define MG_F_USER_5 (1 << 24)
|
||||||
#define MG_F_USER_6 (1 << 25)
|
#define MG_F_USER_6 (1 << 25)
|
||||||
|
|
||||||
|
#if MG_ENABLE_SSL
|
||||||
|
void *ssl_if_data; /* SSL library data. */
|
||||||
|
#else
|
||||||
|
void *unused_ssl_if_data; /* To keep the size of the structure the same. */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
PROG = http_proxy_client
|
||||||
|
#SSL_LIB=openssl
|
||||||
|
CFLAGS_EXTRA = -DMG_ENABLE_CALLBACK_USERDATA=1
|
||||||
|
include ../examples.mk
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014 Cesanta Software Limited
|
||||||
|
* All rights reserved
|
||||||
|
*
|
||||||
|
* This program fetches HTTP URLs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MG_ENABLE_CALLBACK_USERDATA 1
|
||||||
|
#include "mongoose.h"
|
||||||
|
|
||||||
|
static int s_exit_flag = 0;
|
||||||
|
static int s_show_headers = 0;
|
||||||
|
|
||||||
|
static void ev_handler(struct mg_connection *c, int ev, void *ev_data,
|
||||||
|
void *userdata) {
|
||||||
|
struct http_message *hm = (struct http_message *) ev_data;
|
||||||
|
|
||||||
|
switch (ev) {
|
||||||
|
case MG_EV_CONNECT:
|
||||||
|
if (*(int *) ev_data != 0) {
|
||||||
|
fprintf(stderr, "connect() failed: %s\n", strerror(*(int *) ev_data));
|
||||||
|
s_exit_flag = 1;
|
||||||
|
} else {
|
||||||
|
// Stage 2. Connection to the HTTP proxy is established.
|
||||||
|
// Write CONNECT request, and turn this connection to HTTP.
|
||||||
|
// NOTE: target URL is passed to us as userdata.
|
||||||
|
unsigned port = 80;
|
||||||
|
struct mg_str scheme, host;
|
||||||
|
mg_parse_uri(mg_mk_str((char *) userdata), &scheme, NULL, &host, &port,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
if (port == 0) port = (scheme.len == 5) ? 443 : 80;
|
||||||
|
mg_printf(c, "CONNECT %.*s:%u HTTP/1.1\r\n\r\n", (int) host.len, host.p,
|
||||||
|
port);
|
||||||
|
// Now set the flag and wait for the connection establishment
|
||||||
|
c->flags |= MG_F_USER_1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MG_EV_RECV:
|
||||||
|
// Stage 3. Check if proxy replied. Here, we don't parse the reply
|
||||||
|
// for simplicity. Assume success, and write HTTP request.
|
||||||
|
if (c->flags & MG_F_USER_1) {
|
||||||
|
struct mg_str host, path;
|
||||||
|
c->flags &= ~MG_F_USER_1;
|
||||||
|
mg_parse_uri(mg_mk_str((char *) userdata), NULL, NULL, &host, NULL,
|
||||||
|
&path, NULL, NULL);
|
||||||
|
if (path.len == 0) path = mg_mk_str("/");
|
||||||
|
mg_printf(c, "GET %.*s HTTP/1.0\r\nHost: %.*s\r\n\r\n", (int) path.len,
|
||||||
|
path.p, (int) host.len, host.p);
|
||||||
|
mg_set_protocol_http_websocket(c);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MG_EV_HTTP_REPLY:
|
||||||
|
c->flags |= MG_F_CLOSE_IMMEDIATELY;
|
||||||
|
if (s_show_headers) {
|
||||||
|
fwrite(hm->message.p, 1, hm->message.len, stdout);
|
||||||
|
} else {
|
||||||
|
fwrite(hm->body.p, 1, hm->body.len, stdout);
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
s_exit_flag = 1;
|
||||||
|
break;
|
||||||
|
case MG_EV_CLOSE:
|
||||||
|
if (s_exit_flag == 0) {
|
||||||
|
printf("Server closed connection\n");
|
||||||
|
s_exit_flag = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
struct mg_mgr mgr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
mg_mgr_init(&mgr, NULL);
|
||||||
|
|
||||||
|
/* Process command line arguments */
|
||||||
|
for (i = 1; i < argc; i++) {
|
||||||
|
if (strcmp(argv[i], "--show-headers") == 0) {
|
||||||
|
s_show_headers = 1;
|
||||||
|
} else if (strcmp(argv[i], "--hexdump") == 0 && i + 1 < argc) {
|
||||||
|
mgr.hexdump_file = argv[++i];
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i + 2 != argc) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Usage: %s [--hexdump <file>] "
|
||||||
|
"[--show-headers] PROXY_HOST:PROXY_PORT URL\n",
|
||||||
|
argv[0]);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stage 1. Connect to the HTTP proxy as to a plain TCP server.
|
||||||
|
// Pass URL as a callback argument
|
||||||
|
mg_connect(&mgr, argv[i], ev_handler, argv[i + 1]);
|
||||||
|
|
||||||
|
while (s_exit_flag == 0) {
|
||||||
|
mg_mgr_poll(&mgr, 1000);
|
||||||
|
}
|
||||||
|
mg_mgr_free(&mgr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
+229
-686
File diff suppressed because it is too large.
Load diff
+30
-507
@@ -1,9 +1,6 @@
|
|||||||
#ifdef MG_MODULE_LINES
|
|
||||||
#line 1 "mongoose/src/mg_common.h"
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2004-2013 Sergey Lyubka
|
* Copyright (c) 2004-2013 Sergey Lyubka
|
||||||
* Copyright (c) 2013-2015 Cesanta Software Limited
|
* Copyright (c) 2013-2020 Cesanta Software Limited
|
||||||
* All rights reserved
|
* All rights reserved
|
||||||
*
|
*
|
||||||
* This software is dual-licensed: you can redistribute it and/or modify
|
* This software is dual-licensed: you can redistribute it and/or modify
|
||||||
@@ -20,10 +17,13 @@
|
|||||||
* license, as set out in <https://www.cesanta.com/license>.
|
* license, as set out in <https://www.cesanta.com/license>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef MG_MODULE_LINES
|
||||||
|
#line 1 "mongoose/src/mg_common.h"
|
||||||
|
#endif
|
||||||
#ifndef CS_MONGOOSE_SRC_COMMON_H_
|
#ifndef CS_MONGOOSE_SRC_COMMON_H_
|
||||||
#define CS_MONGOOSE_SRC_COMMON_H_
|
#define CS_MONGOOSE_SRC_COMMON_H_
|
||||||
|
|
||||||
#define MG_VERSION "6.16"
|
#define MG_VERSION "6.18"
|
||||||
|
|
||||||
/* Local tweaks, applied before any of Mongoose's own headers. */
|
/* Local tweaks, applied before any of Mongoose's own headers. */
|
||||||
#ifdef MG_LOCALS
|
#ifdef MG_LOCALS
|
||||||
@@ -228,7 +228,7 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
|
|
||||||
#if _MSC_VER < 1700
|
#if defined(_MSC_VER) && (_MSC_VER < 1700)
|
||||||
typedef int bool;
|
typedef int bool;
|
||||||
#else
|
#else
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@@ -510,22 +510,6 @@ typedef struct stat cs_stat_t;
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_esp32.h"
|
#line 1 "common/platforms/platform_esp32.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_ESP32_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_ESP32_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_ESP32_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_ESP32_H_
|
||||||
@@ -567,22 +551,6 @@ typedef struct stat cs_stat_t;
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_esp8266.h"
|
#line 1 "common/platforms/platform_esp8266.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_ESP8266_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_ESP8266_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_ESP8266_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_ESP8266_H_
|
||||||
@@ -640,22 +608,6 @@ typedef struct stat cs_stat_t;
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_cc3100.h"
|
#line 1 "common/platforms/platform_cc3100.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_CC3100_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_CC3100_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_CC3100_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_CC3100_H_
|
||||||
@@ -701,22 +653,6 @@ int inet_pton(int af, const char *src, void *dst);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_cc3200.h"
|
#line 1 "common/platforms/platform_cc3200.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_CC3200_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_CC3200_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_CC3200_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_CC3200_H_
|
||||||
@@ -838,22 +774,6 @@ int stat(const char *pathname, struct stat *st);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_cc3220.h"
|
#line 1 "common/platforms/platform_cc3220.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_CC3220_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_CC3220_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_CC3220_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_CC3220_H_
|
||||||
@@ -962,22 +882,6 @@ int stat(const char *pathname, struct stat *st);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_msp432.h"
|
#line 1 "common/platforms/platform_msp432.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_MSP432_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_MSP432_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_MSP432_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_MSP432_H_
|
||||||
@@ -1082,22 +986,6 @@ int _stat(const char *pathname, struct stat *st);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_tm4c129.h"
|
#line 1 "common/platforms/platform_tm4c129.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_TM4C129_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_TM4C129_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_TM4C129_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_TM4C129_H_
|
||||||
@@ -1154,22 +1042,6 @@ typedef struct stat cs_stat_t;
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_mbed.h"
|
#line 1 "common/platforms/platform_mbed.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_MBED_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_MBED_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_MBED_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_MBED_H_
|
||||||
@@ -1250,22 +1122,6 @@ in_addr_t inet_addr(const char *cp);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_nrf51.h"
|
#line 1 "common/platforms/platform_nrf51.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_NRF51_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_NRF51_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_NRF51_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_NRF51_H_
|
||||||
#if CS_PLATFORM == CS_P_NRF51
|
#if CS_PLATFORM == CS_P_NRF51
|
||||||
@@ -1307,22 +1163,6 @@ int gettimeofday(struct timeval *tp, void *tzp);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_nrf52.h"
|
#line 1 "common/platforms/platform_nrf52.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_NRF52_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_NRF52_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_NRF52_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_NRF52_H_
|
||||||
#if CS_PLATFORM == CS_P_NRF52
|
#if CS_PLATFORM == CS_P_NRF52
|
||||||
@@ -1367,22 +1207,6 @@ int gettimeofday(struct timeval *tp, void *tzp);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/simplelink/cs_simplelink.h"
|
#line 1 "common/platforms/simplelink/cs_simplelink.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_SIMPLELINK_CS_SIMPLELINK_H_
|
#ifndef CS_COMMON_PLATFORMS_SIMPLELINK_CS_SIMPLELINK_H_
|
||||||
#define CS_COMMON_PLATFORMS_SIMPLELINK_CS_SIMPLELINK_H_
|
#define CS_COMMON_PLATFORMS_SIMPLELINK_CS_SIMPLELINK_H_
|
||||||
@@ -1750,22 +1574,6 @@ const char *strerror();
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_nxp_lpc.h"
|
#line 1 "common/platforms/platform_nxp_lpc.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_NXP_LPC_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_NXP_LPC_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_NXP_LPC_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_NXP_LPC_H_
|
||||||
@@ -1818,22 +1626,6 @@ typedef struct stat cs_stat_t;
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_nxp_kinetis.h"
|
#line 1 "common/platforms/platform_nxp_kinetis.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_NXP_KINETIS_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_NXP_KINETIS_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_NXP_KINETIS_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_NXP_KINETIS_H_
|
||||||
@@ -1864,22 +1656,6 @@ typedef struct stat cs_stat_t;
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_pic32.h"
|
#line 1 "common/platforms/platform_pic32.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_PIC32_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_PIC32_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_PIC32_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_PIC32_H_
|
||||||
@@ -1916,22 +1692,6 @@ char *inet_ntoa(struct in_addr in);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_rs14100.h"
|
#line 1 "common/platforms/platform_rs14100.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2019 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_RS14100_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_RS14100_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_RS14100_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_RS14100_H_
|
||||||
@@ -1980,22 +1740,6 @@ typedef struct stat cs_stat_t;
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/platform_stm32.h"
|
#line 1 "common/platforms/platform_stm32.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_PLATFORM_STM32_H_
|
#ifndef CS_COMMON_PLATFORMS_PLATFORM_STM32_H_
|
||||||
#define CS_COMMON_PLATFORMS_PLATFORM_STM32_H_
|
#define CS_COMMON_PLATFORMS_PLATFORM_STM32_H_
|
||||||
@@ -2034,22 +1778,6 @@ typedef struct stat cs_stat_t;
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/platforms/lwip/mg_lwip.h"
|
#line 1 "common/platforms/lwip/mg_lwip.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_PLATFORMS_LWIP_MG_LWIP_H_
|
#ifndef CS_COMMON_PLATFORMS_LWIP_MG_LWIP_H_
|
||||||
#define CS_COMMON_PLATFORMS_LWIP_MG_LWIP_H_
|
#define CS_COMMON_PLATFORMS_LWIP_MG_LWIP_H_
|
||||||
@@ -2117,22 +1845,6 @@ void mg_lwip_set_keepalive_params(struct mg_connection *nc, int idle,
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/cs_md5.h"
|
#line 1 "common/cs_md5.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_MD5_H_
|
#ifndef CS_COMMON_MD5_H_
|
||||||
#define CS_COMMON_MD5_H_
|
#define CS_COMMON_MD5_H_
|
||||||
@@ -2165,22 +1877,6 @@ void cs_md5_final(unsigned char *md, cs_md5_ctx *c);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/cs_sha1.h"
|
#line 1 "common/cs_sha1.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_SHA1_H_
|
#ifndef CS_COMMON_SHA1_H_
|
||||||
#define CS_COMMON_SHA1_H_
|
#define CS_COMMON_SHA1_H_
|
||||||
@@ -2219,22 +1915,6 @@ void cs_hmac_sha1(const unsigned char *key, size_t key_len,
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/cs_time.h"
|
#line 1 "common/cs_time.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_CS_TIME_H_
|
#ifndef CS_COMMON_CS_TIME_H_
|
||||||
#define CS_COMMON_CS_TIME_H_
|
#define CS_COMMON_CS_TIME_H_
|
||||||
@@ -2264,22 +1944,6 @@ double cs_timegm(const struct tm *tm);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/mg_str.h"
|
#line 1 "common/mg_str.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_MG_STR_H_
|
#ifndef CS_COMMON_MG_STR_H_
|
||||||
#define CS_COMMON_MG_STR_H_
|
#define CS_COMMON_MG_STR_H_
|
||||||
@@ -2351,6 +2015,11 @@ int mg_strcmp(const struct mg_str str1, const struct mg_str str2);
|
|||||||
*/
|
*/
|
||||||
int mg_strncmp(const struct mg_str str1, const struct mg_str str2, size_t n);
|
int mg_strncmp(const struct mg_str str1, const struct mg_str str2, size_t n);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compare two `mg_str`s ignoreing case; return value is the same as `strcmp`.
|
||||||
|
*/
|
||||||
|
int mg_strcasecmp(const struct mg_str str1, const struct mg_str str2);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free the string (assuming it was heap allocated).
|
* Free the string (assuming it was heap allocated).
|
||||||
*/
|
*/
|
||||||
@@ -2375,22 +2044,6 @@ int mg_str_starts_with(struct mg_str s, struct mg_str prefix);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/mbuf.h"
|
#line 1 "common/mbuf.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mbufs are mutable/growing memory buffers, like C++ strings.
|
* Mbufs are mutable/growing memory buffers, like C++ strings.
|
||||||
@@ -2489,22 +2142,6 @@ void mbuf_trim(struct mbuf *);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/cs_base64.h"
|
#line 1 "common/cs_base64.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_CS_BASE64_H_
|
#ifndef CS_COMMON_CS_BASE64_H_
|
||||||
#define CS_COMMON_CS_BASE64_H_
|
#define CS_COMMON_CS_BASE64_H_
|
||||||
@@ -2558,22 +2195,6 @@ int cs_base64_decode(const unsigned char *s, int len, char *dst, int *dec_len);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "common/str_util.h"
|
#line 1 "common/str_util.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2018 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the ""License"");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an ""AS IS"" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_COMMON_STR_UTIL_H_
|
#ifndef CS_COMMON_STR_UTIL_H_
|
||||||
#define CS_COMMON_STR_UTIL_H_
|
#define CS_COMMON_STR_UTIL_H_
|
||||||
@@ -3514,10 +3135,6 @@ struct { \
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_features.h"
|
#line 1 "mongoose/src/mg_features.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2016 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_MONGOOSE_SRC_FEATURES_H_
|
#ifndef CS_MONGOOSE_SRC_FEATURES_H_
|
||||||
#define CS_MONGOOSE_SRC_FEATURES_H_
|
#define CS_MONGOOSE_SRC_FEATURES_H_
|
||||||
@@ -3693,10 +3310,6 @@ struct { \
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_net_if.h"
|
#line 1 "mongoose/src/mg_net_if.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2016 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_MONGOOSE_SRC_NET_IF_H_
|
#ifndef CS_MONGOOSE_SRC_NET_IF_H_
|
||||||
#define CS_MONGOOSE_SRC_NET_IF_H_
|
#define CS_MONGOOSE_SRC_NET_IF_H_
|
||||||
@@ -3827,10 +3440,6 @@ double mg_mgr_min_timer(const struct mg_mgr *mgr);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_ssl_if.h"
|
#line 1 "mongoose/src/mg_ssl_if.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014-2016 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_MONGOOSE_SRC_SSL_IF_H_
|
#ifndef CS_MONGOOSE_SRC_SSL_IF_H_
|
||||||
#define CS_MONGOOSE_SRC_SSL_IF_H_
|
#define CS_MONGOOSE_SRC_SSL_IF_H_
|
||||||
@@ -3844,7 +3453,7 @@ extern "C" {
|
|||||||
struct mg_ssl_if_ctx;
|
struct mg_ssl_if_ctx;
|
||||||
struct mg_connection;
|
struct mg_connection;
|
||||||
|
|
||||||
void mg_ssl_if_init();
|
void mg_ssl_if_init(void);
|
||||||
|
|
||||||
enum mg_ssl_if_result {
|
enum mg_ssl_if_result {
|
||||||
MG_SSL_OK = 0,
|
MG_SSL_OK = 0,
|
||||||
@@ -3885,22 +3494,6 @@ int mg_ssl_if_write(struct mg_connection *nc, const void *data, size_t len);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_net.h"
|
#line 1 "mongoose/src/mg_net.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
* This software is dual-licensed: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation. For the terms of this
|
|
||||||
* license, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* You are free to use this software under the terms of the GNU General
|
|
||||||
* Public License, but WITHOUT ANY WARRANTY; without even the implied
|
|
||||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Alternatively, you can license this software under a commercial
|
|
||||||
* license, as set out in <https://www.cesanta.com/license>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* === Core API: TCP/UDP/SSL
|
* === Core API: TCP/UDP/SSL
|
||||||
@@ -3997,9 +3590,6 @@ struct mg_connection {
|
|||||||
struct mbuf send_mbuf; /* Data scheduled for sending */
|
struct mbuf send_mbuf; /* Data scheduled for sending */
|
||||||
time_t last_io_time; /* Timestamp of the last socket IO */
|
time_t last_io_time; /* Timestamp of the last socket IO */
|
||||||
double ev_timer_time; /* Timestamp of the future MG_EV_TIMER */
|
double ev_timer_time; /* Timestamp of the future MG_EV_TIMER */
|
||||||
#if MG_ENABLE_SSL
|
|
||||||
void *ssl_if_data; /* SSL library data. */
|
|
||||||
#endif
|
|
||||||
mg_event_handler_t proto_handler; /* Protocol-specific event handler */
|
mg_event_handler_t proto_handler; /* Protocol-specific event handler */
|
||||||
void *proto_data; /* Protocol-specific data */
|
void *proto_data; /* Protocol-specific data */
|
||||||
void (*proto_data_destructor)(void *proto_data);
|
void (*proto_data_destructor)(void *proto_data);
|
||||||
@@ -4032,16 +3622,25 @@ struct mg_connection {
|
|||||||
/* Flags that are settable by user */
|
/* Flags that are settable by user */
|
||||||
#define MG_F_SEND_AND_CLOSE (1 << 10) /* Push remaining data and close */
|
#define MG_F_SEND_AND_CLOSE (1 << 10) /* Push remaining data and close */
|
||||||
#define MG_F_CLOSE_IMMEDIATELY (1 << 11) /* Disconnect */
|
#define MG_F_CLOSE_IMMEDIATELY (1 << 11) /* Disconnect */
|
||||||
#define MG_F_WEBSOCKET_NO_DEFRAG (1 << 12) /* Websocket specific */
|
|
||||||
#define MG_F_DELETE_CHUNK (1 << 13) /* HTTP specific */
|
/* Flags for protocol handlers */
|
||||||
|
#define MG_F_PROTO_1 (1 << 12)
|
||||||
|
#define MG_F_PROTO_2 (1 << 13)
|
||||||
#define MG_F_ENABLE_BROADCAST (1 << 14) /* Allow broadcast address usage */
|
#define MG_F_ENABLE_BROADCAST (1 << 14) /* Allow broadcast address usage */
|
||||||
|
|
||||||
#define MG_F_USER_1 (1 << 20) /* Flags left for application */
|
/* Flags left for application */
|
||||||
|
#define MG_F_USER_1 (1 << 20)
|
||||||
#define MG_F_USER_2 (1 << 21)
|
#define MG_F_USER_2 (1 << 21)
|
||||||
#define MG_F_USER_3 (1 << 22)
|
#define MG_F_USER_3 (1 << 22)
|
||||||
#define MG_F_USER_4 (1 << 23)
|
#define MG_F_USER_4 (1 << 23)
|
||||||
#define MG_F_USER_5 (1 << 24)
|
#define MG_F_USER_5 (1 << 24)
|
||||||
#define MG_F_USER_6 (1 << 25)
|
#define MG_F_USER_6 (1 << 25)
|
||||||
|
|
||||||
|
#if MG_ENABLE_SSL
|
||||||
|
void *ssl_if_data; /* SSL library data. */
|
||||||
|
#else
|
||||||
|
void *unused_ssl_if_data; /* To keep the size of the structure the same. */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -4481,10 +4080,6 @@ double mg_time(void);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_uri.h"
|
#line 1 "mongoose/src/mg_uri.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* === URI
|
* === URI
|
||||||
@@ -4551,10 +4146,6 @@ int mg_normalize_uri_path(const struct mg_str *in, struct mg_str *out);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_util.h"
|
#line 1 "mongoose/src/mg_util.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* === Utility API
|
* === Utility API
|
||||||
@@ -4769,10 +4360,6 @@ struct mg_str mg_url_encode(const struct mg_str src);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_http.h"
|
#line 1 "mongoose/src/mg_http.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* === Common API reference
|
* === Common API reference
|
||||||
@@ -4783,8 +4370,8 @@ struct mg_str mg_url_encode(const struct mg_str src);
|
|||||||
|
|
||||||
#if MG_ENABLE_HTTP
|
#if MG_ENABLE_HTTP
|
||||||
|
|
||||||
/* Amalgamated: #include "mg_net.h" */
|
|
||||||
/* Amalgamated: #include "common/mg_str.h" */
|
/* Amalgamated: #include "common/mg_str.h" */
|
||||||
|
/* Amalgamated: #include "mg_net.h" */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -4891,6 +4478,9 @@ struct mg_ssi_call_ctx {
|
|||||||
#define MG_EV_HTTP_MULTIPART_REQUEST_END 125
|
#define MG_EV_HTTP_MULTIPART_REQUEST_END 125
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MG_F_WEBSOCKET_NO_DEFRAG MG_F_PROTO_1
|
||||||
|
#define MG_F_DELETE_CHUNK MG_F_PROTO_2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attaches a built-in HTTP event handler to the given connection.
|
* Attaches a built-in HTTP event handler to the given connection.
|
||||||
* The user-defined event handler will receive following extra events:
|
* The user-defined event handler will receive following extra events:
|
||||||
@@ -5775,22 +5365,6 @@ int mg_http_create_digest_auth_header(char *buf, size_t buf_len,
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_mqtt.h"
|
#line 1 "mongoose/src/mg_mqtt.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
* This software is dual-licensed: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation. For the terms of this
|
|
||||||
* license, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* You are free to use this software under the terms of the GNU General
|
|
||||||
* Public License, but WITHOUT ANY WARRANTY; without even the implied
|
|
||||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Alternatively, you can license this software under a commercial
|
|
||||||
* license, as set out in <https://www.cesanta.com/license>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* === MQTT API reference
|
* === MQTT API reference
|
||||||
@@ -5878,10 +5452,10 @@ struct mg_mqtt_proto_data {
|
|||||||
|
|
||||||
/* Message flags */
|
/* Message flags */
|
||||||
#define MG_MQTT_RETAIN 0x1
|
#define MG_MQTT_RETAIN 0x1
|
||||||
#define MG_MQTT_DUP 0x4
|
|
||||||
#define MG_MQTT_QOS(qos) ((qos) << 1)
|
#define MG_MQTT_QOS(qos) ((qos) << 1)
|
||||||
#define MG_MQTT_GET_QOS(flags) (((flags) &0x6) >> 1)
|
#define MG_MQTT_GET_QOS(flags) (((flags) &0x6) >> 1)
|
||||||
#define MG_MQTT_SET_QOS(flags, qos) (flags) = ((flags) & ~0x6) | ((qos) << 1)
|
#define MG_MQTT_SET_QOS(flags, qos) (flags) = ((flags) & ~0x6) | ((qos) << 1)
|
||||||
|
#define MG_MQTT_DUP 0x8
|
||||||
|
|
||||||
/* Connection flags */
|
/* Connection flags */
|
||||||
#define MG_MQTT_CLEAN_SESSION 0x02
|
#define MG_MQTT_CLEAN_SESSION 0x02
|
||||||
@@ -6006,22 +5580,6 @@ int mg_mqtt_vmatch_topic_expression(const char *exp, struct mg_str topic);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_mqtt_server.h"
|
#line 1 "mongoose/src/mg_mqtt_server.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
* This software is dual-licensed: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation. For the terms of this
|
|
||||||
* license, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* You are free to use this software under the terms of the GNU General
|
|
||||||
* Public License, but WITHOUT ANY WARRANTY; without even the implied
|
|
||||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Alternatively, you can license this software under a commercial
|
|
||||||
* license, as set out in <https://www.cesanta.com/license>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* === MQTT Server API reference
|
* === MQTT Server API reference
|
||||||
@@ -6113,10 +5671,6 @@ struct mg_mqtt_session *mg_mqtt_next(struct mg_mqtt_broker *brk,
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_dns.h"
|
#line 1 "mongoose/src/mg_dns.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* === DNS API reference
|
* === DNS API reference
|
||||||
@@ -6239,6 +5793,7 @@ int mg_dns_encode_record(struct mbuf *io, struct mg_dns_resource_record *rr,
|
|||||||
* Encodes a DNS name.
|
* Encodes a DNS name.
|
||||||
*/
|
*/
|
||||||
int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len);
|
int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len);
|
||||||
|
int mg_dns_encode_name_s(struct mbuf *io, struct mg_str name);
|
||||||
|
|
||||||
/* Low-level: parses a DNS response. */
|
/* Low-level: parses a DNS response. */
|
||||||
int mg_parse_dns(const char *buf, int len, struct mg_dns_message *msg);
|
int mg_parse_dns(const char *buf, int len, struct mg_dns_message *msg);
|
||||||
@@ -6280,10 +5835,6 @@ void mg_set_protocol_dns(struct mg_connection *nc);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_dns_server.h"
|
#line 1 "mongoose/src/mg_dns_server.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* === DNS server API reference
|
* === DNS server API reference
|
||||||
@@ -6377,10 +5928,6 @@ void mg_dns_send_reply(struct mg_connection *nc, struct mg_dns_reply *r);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_resolv.h"
|
#line 1 "mongoose/src/mg_resolv.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2014 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* === API reference
|
* === API reference
|
||||||
@@ -6461,22 +6008,6 @@ int mg_resolve_from_hosts_file(const char *host, union socket_address *usa);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_coap.h"
|
#line 1 "mongoose/src/mg_coap.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2015 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
* This software is dual-licensed: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation. For the terms of this
|
|
||||||
* license, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* You are free to use this software under the terms of the GNU General
|
|
||||||
* Public License, but WITHOUT ANY WARRANTY; without even the implied
|
|
||||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Alternatively, you can license this software under a commercial
|
|
||||||
* license, as set out in <https://www.cesanta.com/license>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* === CoAP API reference
|
* === CoAP API reference
|
||||||
@@ -6629,10 +6160,6 @@ uint32_t mg_coap_compose(struct mg_coap_message *cm, struct mbuf *io);
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_sntp.h"
|
#line 1 "mongoose/src/mg_sntp.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2016 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_MONGOOSE_SRC_SNTP_H_
|
#ifndef CS_MONGOOSE_SRC_SNTP_H_
|
||||||
#define CS_MONGOOSE_SRC_SNTP_H_
|
#define CS_MONGOOSE_SRC_SNTP_H_
|
||||||
@@ -6686,10 +6213,6 @@ struct mg_connection *mg_sntp_get_time(struct mg_mgr *mgr,
|
|||||||
#ifdef MG_MODULE_LINES
|
#ifdef MG_MODULE_LINES
|
||||||
#line 1 "mongoose/src/mg_socks.h"
|
#line 1 "mongoose/src/mg_socks.h"
|
||||||
#endif
|
#endif
|
||||||
/*
|
|
||||||
* Copyright (c) 2017 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_MONGOOSE_SRC_SOCKS_H_
|
#ifndef CS_MONGOOSE_SRC_SOCKS_H_
|
||||||
#define CS_MONGOOSE_SRC_SOCKS_H_
|
#define CS_MONGOOSE_SRC_SOCKS_H_
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
|
|
||||||
#if _MSC_VER < 1700
|
#if defined(_MSC_VER) && (_MSC_VER < 1700)
|
||||||
typedef int bool;
|
typedef int bool;
|
||||||
#else
|
#else
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|||||||
+1
-20
@@ -1,26 +1,7 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2004-2013 Sergey Lyubka
|
|
||||||
* Copyright (c) 2013-2015 Cesanta Software Limited
|
|
||||||
* All rights reserved
|
|
||||||
*
|
|
||||||
* This software is dual-licensed: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation. For the terms of this
|
|
||||||
* license, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* You are free to use this software under the terms of the GNU General
|
|
||||||
* Public License, but WITHOUT ANY WARRANTY; without even the implied
|
|
||||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* Alternatively, you can license this software under a commercial
|
|
||||||
* license, as set out in <https://www.cesanta.com/license>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CS_MONGOOSE_SRC_COMMON_H_
|
#ifndef CS_MONGOOSE_SRC_COMMON_H_
|
||||||
#define CS_MONGOOSE_SRC_COMMON_H_
|
#define CS_MONGOOSE_SRC_COMMON_H_
|
||||||
|
|
||||||
#define MG_VERSION "6.15"
|
#define MG_VERSION "6.17"
|
||||||
|
|
||||||
/* Local tweaks, applied before any of Mongoose's own headers. */
|
/* Local tweaks, applied before any of Mongoose's own headers. */
|
||||||
#ifdef MG_LOCALS
|
#ifdef MG_LOCALS
|
||||||
|
|||||||
+14
-10
@@ -85,35 +85,39 @@ int mg_dns_copy_questions(struct mbuf *io, struct mg_dns_message *msg) {
|
|||||||
return mbuf_append(io, begin, end - begin);
|
return mbuf_append(io, begin, end - begin);
|
||||||
}
|
}
|
||||||
|
|
||||||
int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len) {
|
int mg_dns_encode_name_s(struct mbuf *io, struct mg_str name) {
|
||||||
const char *s;
|
const char *s;
|
||||||
unsigned char n;
|
unsigned char n;
|
||||||
size_t pos = io->len;
|
size_t pos = io->len;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if ((s = strchr(name, '.')) == NULL) {
|
if ((s = mg_strchr(name, '.')) == NULL) {
|
||||||
s = name + len;
|
s = name.p + name.len;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s - name > 127) {
|
if (s - name.p > 127) {
|
||||||
return -1; /* TODO(mkm) cover */
|
return -1; /* TODO(mkm) cover */
|
||||||
}
|
}
|
||||||
n = s - name; /* chunk length */
|
n = s - name.p; /* chunk length */
|
||||||
mbuf_append(io, &n, 1); /* send length */
|
mbuf_append(io, &n, 1); /* send length */
|
||||||
mbuf_append(io, name, n);
|
mbuf_append(io, name.p, n);
|
||||||
|
|
||||||
if (*s == '.') {
|
if (n < name.len && *s == '.') {
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
|
||||||
name += n;
|
name.p += n;
|
||||||
len -= n;
|
name.len -= n;
|
||||||
} while (*s != '\0');
|
} while (name.len > 0);
|
||||||
mbuf_append(io, "\0", 1); /* Mark end of host name */
|
mbuf_append(io, "\0", 1); /* Mark end of host name */
|
||||||
|
|
||||||
return io->len - pos;
|
return io->len - pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len) {
|
||||||
|
return mg_dns_encode_name_s(io, mg_mk_str_n(name, len));
|
||||||
|
}
|
||||||
|
|
||||||
int mg_dns_encode_record(struct mbuf *io, struct mg_dns_resource_record *rr,
|
int mg_dns_encode_record(struct mbuf *io, struct mg_dns_resource_record *rr,
|
||||||
const char *name, size_t nlen, const void *rdata,
|
const char *name, size_t nlen, const void *rdata,
|
||||||
size_t rlen) {
|
size_t rlen) {
|
||||||
|
|||||||
@@ -124,6 +124,7 @@ int mg_dns_encode_record(struct mbuf *io, struct mg_dns_resource_record *rr,
|
|||||||
* Encodes a DNS name.
|
* Encodes a DNS name.
|
||||||
*/
|
*/
|
||||||
int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len);
|
int mg_dns_encode_name(struct mbuf *io, const char *name, size_t len);
|
||||||
|
int mg_dns_encode_name_s(struct mbuf *io, struct mg_str name);
|
||||||
|
|
||||||
/* Low-level: parses a DNS response. */
|
/* Low-level: parses a DNS response. */
|
||||||
int mg_parse_dns(const char *buf, int len, struct mg_dns_message *msg);
|
int mg_parse_dns(const char *buf, int len, struct mg_dns_message *msg);
|
||||||
|
|||||||
+94
-61
@@ -236,7 +236,7 @@ static void mg_http_free_proto_data_endpoints(struct mg_http_endpoint **ep) {
|
|||||||
current = tmp;
|
current = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
ep = NULL;
|
*ep = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mg_http_free_reverse_proxy_data(struct mg_reverse_proxy_data *rpd) {
|
static void mg_http_free_reverse_proxy_data(struct mg_reverse_proxy_data *rpd) {
|
||||||
@@ -328,37 +328,53 @@ static const struct {
|
|||||||
MIME_ENTRY("asf", "video/x-ms-asf"),
|
MIME_ENTRY("asf", "video/x-ms-asf"),
|
||||||
MIME_ENTRY("avi", "video/x-msvideo"),
|
MIME_ENTRY("avi", "video/x-msvideo"),
|
||||||
MIME_ENTRY("bmp", "image/bmp"),
|
MIME_ENTRY("bmp", "image/bmp"),
|
||||||
{NULL, 0, NULL}};
|
{NULL, 0, NULL},
|
||||||
|
};
|
||||||
|
|
||||||
static struct mg_str mg_get_mime_type(const char *path, const char *dflt,
|
static struct mg_str mg_get_mime_types_entry(struct mg_str path) {
|
||||||
const struct mg_serve_http_opts *opts) {
|
size_t i;
|
||||||
|
for (i = 0; mg_static_builtin_mime_types[i].extension != NULL; i++) {
|
||||||
|
if (path.len < mg_static_builtin_mime_types[i].ext_len + 1) continue;
|
||||||
|
struct mg_str ext = MG_MK_STR_N(mg_static_builtin_mime_types[i].extension,
|
||||||
|
mg_static_builtin_mime_types[i].ext_len);
|
||||||
|
struct mg_str pext = MG_MK_STR_N(path.p + (path.len - ext.len), ext.len);
|
||||||
|
if (pext.p[-1] == '.' && mg_strcasecmp(ext, pext) == 0) {
|
||||||
|
return mg_mk_str(mg_static_builtin_mime_types[i].mime_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mg_mk_str(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
MG_INTERNAL int mg_get_mime_type_encoding(
|
||||||
|
struct mg_str path, struct mg_str *type, struct mg_str *encoding,
|
||||||
|
const struct mg_serve_http_opts *opts) {
|
||||||
const char *ext, *overrides;
|
const char *ext, *overrides;
|
||||||
size_t i, path_len;
|
struct mg_str k, v;
|
||||||
struct mg_str r, k, v;
|
|
||||||
|
|
||||||
path_len = strlen(path);
|
|
||||||
|
|
||||||
overrides = opts->custom_mime_types;
|
overrides = opts->custom_mime_types;
|
||||||
while ((overrides = mg_next_comma_list_entry(overrides, &k, &v)) != NULL) {
|
while ((overrides = mg_next_comma_list_entry(overrides, &k, &v)) != NULL) {
|
||||||
ext = path + (path_len - k.len);
|
ext = path.p + (path.len - k.len);
|
||||||
if (path_len > k.len && mg_vcasecmp(&k, ext) == 0) {
|
if (path.len > k.len && mg_vcasecmp(&k, ext) == 0) {
|
||||||
return v;
|
*type = v;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; mg_static_builtin_mime_types[i].extension != NULL; i++) {
|
*type = mg_get_mime_types_entry(path);
|
||||||
ext = path + (path_len - mg_static_builtin_mime_types[i].ext_len);
|
|
||||||
if (path_len > mg_static_builtin_mime_types[i].ext_len && ext[-1] == '.' &&
|
/* Check for .html.gz, .js.gz, etc. */
|
||||||
mg_casecmp(ext, mg_static_builtin_mime_types[i].extension) == 0) {
|
if (mg_vcmp(type, "application/x-gunzip") == 0) {
|
||||||
r.p = mg_static_builtin_mime_types[i].mime_type;
|
struct mg_str path2 = mg_mk_str_n(path.p, path.len - 3);
|
||||||
r.len = strlen(r.p);
|
struct mg_str type2 = mg_get_mime_types_entry(path2);
|
||||||
return r;
|
LOG(LL_ERROR, ("'%.*s' '%.*s' '%.*s'", (int) path.len, path.p,
|
||||||
|
(int) path2.len, path2.p, (int) type2.len, type2.p));
|
||||||
|
if (type2.len > 0) {
|
||||||
|
*type = type2;
|
||||||
|
*encoding = mg_mk_str("gzip");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
r.p = dflt;
|
return (type->len > 0);
|
||||||
r.len = strlen(r.p);
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1458,12 +1474,15 @@ static int mg_http_parse_range_header(const struct mg_str *header, int64_t *a,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mg_http_serve_file(struct mg_connection *nc, struct http_message *hm,
|
void mg_http_serve_file_internal(struct mg_connection *nc,
|
||||||
const char *path, const struct mg_str mime_type,
|
struct http_message *hm, const char *path,
|
||||||
const struct mg_str extra_headers) {
|
struct mg_str mime_type,
|
||||||
|
struct mg_str encoding,
|
||||||
|
struct mg_str extra_headers) {
|
||||||
struct mg_http_proto_data *pd = mg_http_get_proto_data(nc);
|
struct mg_http_proto_data *pd = mg_http_get_proto_data(nc);
|
||||||
cs_stat_t st;
|
cs_stat_t st;
|
||||||
LOG(LL_DEBUG, ("%p [%s] %.*s", nc, path, (int) mime_type.len, mime_type.p));
|
LOG(LL_DEBUG, ("%p [%s] %.*s %.*s", nc, path, (int) mime_type.len,
|
||||||
|
mime_type.p, (int) encoding.len, encoding.p));
|
||||||
if (mg_stat(path, &st) != 0 || (pd->file.fp = mg_fopen(path, "rb")) == NULL) {
|
if (mg_stat(path, &st) != 0 || (pd->file.fp = mg_fopen(path, "rb")) == NULL) {
|
||||||
int code, err = mg_get_errno();
|
int code, err = mg_get_errno();
|
||||||
switch (err) {
|
switch (err) {
|
||||||
@@ -1502,8 +1521,9 @@ void mg_http_serve_file(struct mg_connection *nc, struct http_message *hm,
|
|||||||
} else {
|
} else {
|
||||||
status_code = 206;
|
status_code = 206;
|
||||||
cl = r2 - r1 + 1;
|
cl = r2 - r1 + 1;
|
||||||
snprintf(range, sizeof(range), "Content-Range: bytes %" INT64_FMT
|
snprintf(range, sizeof(range),
|
||||||
"-%" INT64_FMT "/%" INT64_FMT "\r\n",
|
"Content-Range: bytes %" INT64_FMT "-%" INT64_FMT
|
||||||
|
"/%" INT64_FMT "\r\n",
|
||||||
r1, r1 + cl - 1, (int64_t) st.st_size);
|
r1, r1 + cl - 1, (int64_t) st.st_size);
|
||||||
#if _FILE_OFFSET_BITS == 64 || _POSIX_C_SOURCE >= 200112L || \
|
#if _FILE_OFFSET_BITS == 64 || _POSIX_C_SOURCE >= 200112L || \
|
||||||
_XOPEN_SOURCE >= 600
|
_XOPEN_SOURCE >= 600
|
||||||
@@ -1528,13 +1548,6 @@ void mg_http_serve_file(struct mg_connection *nc, struct http_message *hm,
|
|||||||
mg_http_construct_etag(etag, sizeof(etag), &st);
|
mg_http_construct_etag(etag, sizeof(etag), &st);
|
||||||
mg_gmt_time_string(current_time, sizeof(current_time), &t);
|
mg_gmt_time_string(current_time, sizeof(current_time), &t);
|
||||||
mg_gmt_time_string(last_modified, sizeof(last_modified), &st.st_mtime);
|
mg_gmt_time_string(last_modified, sizeof(last_modified), &st.st_mtime);
|
||||||
/*
|
|
||||||
* Content length casted to size_t because:
|
|
||||||
* 1) that's the maximum buffer size anyway
|
|
||||||
* 2) ESP8266 RTOS SDK newlib vprintf cannot contain a 64bit arg at non-last
|
|
||||||
* position
|
|
||||||
* TODO(mkm): fix ESP8266 RTOS SDK
|
|
||||||
*/
|
|
||||||
mg_send_response_line_s(nc, status_code, extra_headers);
|
mg_send_response_line_s(nc, status_code, extra_headers);
|
||||||
mg_printf(nc,
|
mg_printf(nc,
|
||||||
"Date: %s\r\n"
|
"Date: %s\r\n"
|
||||||
@@ -1544,17 +1557,29 @@ void mg_http_serve_file(struct mg_connection *nc, struct http_message *hm,
|
|||||||
"Connection: %s\r\n"
|
"Connection: %s\r\n"
|
||||||
"Content-Length: %" SIZE_T_FMT
|
"Content-Length: %" SIZE_T_FMT
|
||||||
"\r\n"
|
"\r\n"
|
||||||
"%sEtag: %s\r\n\r\n",
|
"%s"
|
||||||
|
"Etag: %s\r\n",
|
||||||
current_time, last_modified, (int) mime_type.len, mime_type.p,
|
current_time, last_modified, (int) mime_type.len, mime_type.p,
|
||||||
(pd->file.keepalive ? "keep-alive" : "close"), (size_t) cl, range,
|
(pd->file.keepalive ? "keep-alive" : "close"), (size_t) cl, range,
|
||||||
etag);
|
etag);
|
||||||
|
if (encoding.len > 0) {
|
||||||
|
mg_printf(nc, "Content-Encoding: %.*s\r\n", (int) encoding.len,
|
||||||
|
encoding.p);
|
||||||
|
}
|
||||||
|
mg_send(nc, "\r\n", 2);
|
||||||
pd->file.cl = cl;
|
pd->file.cl = cl;
|
||||||
pd->file.type = DATA_FILE;
|
pd->file.type = DATA_FILE;
|
||||||
mg_http_transfer_file_data(nc);
|
mg_http_transfer_file_data(nc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mg_http_serve_file(struct mg_connection *nc, struct http_message *hm,
|
||||||
|
const char *path, const struct mg_str mime_type,
|
||||||
|
const struct mg_str extra_headers) {
|
||||||
|
mg_http_serve_file_internal(nc, hm, path, mime_type, mg_mk_str(NULL),
|
||||||
|
extra_headers);
|
||||||
|
}
|
||||||
|
|
||||||
static void mg_http_serve_file2(struct mg_connection *nc, const char *path,
|
static void mg_http_serve_file2(struct mg_connection *nc, const char *path,
|
||||||
struct http_message *hm,
|
struct http_message *hm,
|
||||||
struct mg_serve_http_opts *opts) {
|
struct mg_serve_http_opts *opts) {
|
||||||
@@ -1564,8 +1589,12 @@ static void mg_http_serve_file2(struct mg_connection *nc, const char *path,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
mg_http_serve_file(nc, hm, path, mg_get_mime_type(path, "text/plain", opts),
|
struct mg_str type = MG_NULL_STR, encoding = MG_NULL_STR;
|
||||||
mg_mk_str(opts->extra_headers));
|
if (!mg_get_mime_type_encoding(mg_mk_str(path), &type, &encoding, opts)) {
|
||||||
|
type = mg_mk_str("text/plain");
|
||||||
|
}
|
||||||
|
mg_http_serve_file_internal(nc, hm, path, type, encoding,
|
||||||
|
mg_mk_str(opts->extra_headers));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1841,7 +1870,7 @@ void cs_md5(char buf[33], ...) {
|
|||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, buf);
|
va_start(ap, buf);
|
||||||
while ((p = va_arg(ap, const unsigned char *) ) != NULL) {
|
while ((p = va_arg(ap, const unsigned char *)) != NULL) {
|
||||||
msgs[num_msgs] = p;
|
msgs[num_msgs] = p;
|
||||||
msg_lens[num_msgs] = va_arg(ap, size_t);
|
msg_lens[num_msgs] = va_arg(ap, size_t);
|
||||||
num_msgs++;
|
num_msgs++;
|
||||||
@@ -2073,7 +2102,7 @@ static void mg_print_dir_entry(struct mg_connection *nc, const char *file_name,
|
|||||||
href = mg_url_encode(mg_mk_str(file_name));
|
href = mg_url_encode(mg_mk_str(file_name));
|
||||||
mg_printf_http_chunk(nc,
|
mg_printf_http_chunk(nc,
|
||||||
"<tr><td><a href=\"%s%s\">%s%s</a></td>"
|
"<tr><td><a href=\"%s%s\">%s%s</a></td>"
|
||||||
"<td>%s</td><td name=%" INT64_FMT ">%s</td></tr>\n",
|
"<td>%s</td><td name=\"%" INT64_FMT "\">%s</td></tr>",
|
||||||
href.p, slash, path, slash, mod, is_dir ? -1 : fsize,
|
href.p, slash, path, slash, mod, is_dir ? -1 : fsize,
|
||||||
size);
|
size);
|
||||||
free((void *) href.p);
|
free((void *) href.p);
|
||||||
@@ -2139,23 +2168,24 @@ static void mg_send_directory_listing(struct mg_connection *nc, const char *dir,
|
|||||||
|
|
||||||
mg_printf_http_chunk(
|
mg_printf_http_chunk(
|
||||||
nc,
|
nc,
|
||||||
"<html><head><title>Index of %.*s</title>%s%s"
|
"<!DOCTYPE html><html><head><title>Index of %.*s</title>%s%s"
|
||||||
"<style>th,td {text-align: left; padding-right: 1em; "
|
"<style>th,td {text-align: left; padding-right: 1em; "
|
||||||
"font-family: monospace; }</style></head>\n"
|
"font-family: monospace; }</style></head>"
|
||||||
"<body><h1>Index of %.*s</h1>\n<table cellpadding=0><thead>"
|
"<body><h1>Index of %.*s</h1><table cellpadding=\"0\"><thead>"
|
||||||
"<tr><th><a href=# rel=0>Name</a></th><th>"
|
"<tr><th><a href=\"#\" rel=\"0\">Name</a></th><th>"
|
||||||
"<a href=# rel=1>Modified</a</th>"
|
"<a href=\"#\" rel=\"1\">Modified</a></th>"
|
||||||
"<th><a href=# rel=2>Size</a></th></tr>"
|
"<th><a href=\"#\" rel=\"2\">Size</a></th></tr>"
|
||||||
"<tr><td colspan=3><hr></td></tr>\n"
|
"<tr><td colspan=\"3\"><hr></td></tr>"
|
||||||
"</thead>\n"
|
"</thead>"
|
||||||
"<tbody id=tb>",
|
"<tbody id=\"tb\">",
|
||||||
(int) hm->uri.len, hm->uri.p, sort_js_code, sort_js_code2,
|
(int) hm->uri.len, hm->uri.p, sort_js_code, sort_js_code2,
|
||||||
(int) hm->uri.len, hm->uri.p);
|
(int) hm->uri.len, hm->uri.p);
|
||||||
mg_scan_directory(nc, dir, opts, mg_print_dir_entry);
|
mg_scan_directory(nc, dir, opts, mg_print_dir_entry);
|
||||||
mg_printf_http_chunk(nc,
|
mg_printf_http_chunk(nc,
|
||||||
"</tbody><tr><td colspan=3><hr></td></tr>\n"
|
"</tbody>"
|
||||||
"</table>\n"
|
"<tfoot><tr><td colspan=\"3\"><hr></td></tr></tfoot>"
|
||||||
"<address>%s</address>\n"
|
"</table>"
|
||||||
|
"<address>%s</address>"
|
||||||
"</body></html>",
|
"</body></html>",
|
||||||
mg_version_header);
|
mg_version_header);
|
||||||
mg_send_http_chunk(nc, "", 0);
|
mg_send_http_chunk(nc, "", 0);
|
||||||
@@ -2472,13 +2502,13 @@ MG_INTERNAL int mg_uri_to_local_path(struct http_message *hm,
|
|||||||
*p++ = DIRSEP;
|
*p++ = DIRSEP;
|
||||||
/* No NULs and DIRSEPs in the component (percent-encoded). */
|
/* No NULs and DIRSEPs in the component (percent-encoded). */
|
||||||
for (i = 0; i < component.len; i++, p++) {
|
for (i = 0; i < component.len; i++, p++) {
|
||||||
if (*p == '\0' || *p == DIRSEP
|
if (*p == '\0' ||
|
||||||
|
*p == DIRSEP
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
/* On Windows, "/" is also accepted, so check for that too. */
|
/* On Windows, "/" is also accepted, so check for that too. */
|
||||||
||
|
|| *p == '/'
|
||||||
*p == '/'
|
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
ok = 0;
|
ok = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2691,7 +2721,9 @@ MG_INTERNAL void mg_send_http_file(struct mg_connection *nc, char *path,
|
|||||||
mg_http_send_error(nc, 501, NULL);
|
mg_http_send_error(nc, 501, NULL);
|
||||||
#endif
|
#endif
|
||||||
} else if (mg_is_not_modified(hm, &st)) {
|
} else if (mg_is_not_modified(hm, &st)) {
|
||||||
mg_http_send_error(nc, 304, "Not Modified");
|
/* Note: not using mg_http_send_error in order to keep connection alive */
|
||||||
|
/* Note: passing extra headers allow users to control session cookies */
|
||||||
|
mg_send_head(nc, 304, 0, opts->extra_headers);
|
||||||
} else {
|
} else {
|
||||||
mg_http_serve_file2(nc, index_file ? index_file : path, hm, opts);
|
mg_http_serve_file2(nc, index_file ? index_file : path, hm, opts);
|
||||||
}
|
}
|
||||||
@@ -2824,7 +2856,7 @@ void mg_file_upload_handler(struct mg_connection *nc, int ev, void *ev_data,
|
|||||||
#ifdef SPIFFS_ERR_FULL
|
#ifdef SPIFFS_ERR_FULL
|
||||||
|| mg_get_errno() == SPIFFS_ERR_FULL
|
|| mg_get_errno() == SPIFFS_ERR_FULL
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
mg_printf(nc,
|
mg_printf(nc,
|
||||||
"HTTP/1.1 413 Payload Too Large\r\n"
|
"HTTP/1.1 413 Payload Too Large\r\n"
|
||||||
"Content-Type: text/plain\r\n"
|
"Content-Type: text/plain\r\n"
|
||||||
@@ -2983,8 +3015,9 @@ struct mg_connection *mg_connect_http_opt(
|
|||||||
if (path.len == 0) path = mg_mk_str("/");
|
if (path.len == 0) path = mg_mk_str("/");
|
||||||
if (host.len == 0) host = mg_mk_str("");
|
if (host.len == 0) host = mg_mk_str("");
|
||||||
|
|
||||||
mg_printf(nc, "%s %.*s HTTP/1.1\r\nHost: %.*s\r\nContent-Length: %" SIZE_T_FMT
|
mg_printf(nc,
|
||||||
"\r\n%.*s%s\r\n%s",
|
"%s %.*s HTTP/1.1\r\nHost: %.*s\r\nContent-Length: %" SIZE_T_FMT
|
||||||
|
"\r\n%.*s%s\r\n%s",
|
||||||
(post_data[0] == '\0' ? "GET" : "POST"), (int) path.len, path.p,
|
(post_data[0] == '\0' ? "GET" : "POST"), (int) path.len, path.p,
|
||||||
(int) (path.p - host.p), host.p, strlen(post_data), (int) auth.len,
|
(int) (path.p - host.p), host.p, strlen(post_data), (int) auth.len,
|
||||||
(auth.buf == NULL ? "" : auth.buf), extra_headers, post_data);
|
(auth.buf == NULL ? "" : auth.buf), extra_headers, post_data);
|
||||||
@@ -3093,7 +3126,7 @@ static void mg_http_call_endpoint_handler(struct mg_connection *nc, int ev,
|
|||||||
#if MG_ENABLE_HTTP_STREAMING_MULTIPART
|
#if MG_ENABLE_HTTP_STREAMING_MULTIPART
|
||||||
|| ev == MG_EV_HTTP_MULTIPART_REQUEST
|
|| ev == MG_EV_HTTP_MULTIPART_REQUEST
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
struct mg_http_endpoint *ep =
|
struct mg_http_endpoint *ep =
|
||||||
mg_http_get_endpoint_handler(nc->listener, &hm->uri);
|
mg_http_get_endpoint_handler(nc->listener, &hm->uri);
|
||||||
if (ep != NULL) {
|
if (ep != NULL) {
|
||||||
|
|||||||
+4
-1
@@ -12,8 +12,8 @@
|
|||||||
|
|
||||||
#if MG_ENABLE_HTTP
|
#if MG_ENABLE_HTTP
|
||||||
|
|
||||||
#include "mg_net.h"
|
|
||||||
#include "common/mg_str.h"
|
#include "common/mg_str.h"
|
||||||
|
#include "mg_net.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -120,6 +120,9 @@ struct mg_ssi_call_ctx {
|
|||||||
#define MG_EV_HTTP_MULTIPART_REQUEST_END 125
|
#define MG_EV_HTTP_MULTIPART_REQUEST_END 125
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MG_F_WEBSOCKET_NO_DEFRAG MG_F_PROTO_1
|
||||||
|
#define MG_F_DELETE_CHUNK MG_F_PROTO_2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attaches a built-in HTTP event handler to the given connection.
|
* Attaches a built-in HTTP event handler to the given connection.
|
||||||
* The user-defined event handler will receive following extra events:
|
* The user-defined event handler will receive following extra events:
|
||||||
|
|||||||
+11
-3
@@ -170,7 +170,7 @@ MG_INTERNAL void mg_handle_ssi_request(struct mg_connection *nc,
|
|||||||
const char *path,
|
const char *path,
|
||||||
const struct mg_serve_http_opts *opts) {
|
const struct mg_serve_http_opts *opts) {
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
struct mg_str mime_type;
|
struct mg_str mime_type = MG_NULL_STR, encoding = MG_NULL_STR;
|
||||||
DBG(("%p %s", nc, path));
|
DBG(("%p %s", nc, path));
|
||||||
|
|
||||||
if ((fp = mg_fopen(path, "rb")) == NULL) {
|
if ((fp = mg_fopen(path, "rb")) == NULL) {
|
||||||
@@ -178,12 +178,20 @@ MG_INTERNAL void mg_handle_ssi_request(struct mg_connection *nc,
|
|||||||
} else {
|
} else {
|
||||||
mg_set_close_on_exec((sock_t) fileno(fp));
|
mg_set_close_on_exec((sock_t) fileno(fp));
|
||||||
|
|
||||||
mime_type = mg_get_mime_type(path, "text/plain", opts);
|
if (!mg_get_mime_type_encoding(mg_mk_str(path), &mime_type, &encoding,
|
||||||
|
opts)) {
|
||||||
|
mime_type = mg_mk_str("text/plain");
|
||||||
|
}
|
||||||
mg_send_response_line(nc, 200, opts->extra_headers);
|
mg_send_response_line(nc, 200, opts->extra_headers);
|
||||||
mg_printf(nc,
|
mg_printf(nc,
|
||||||
"Content-Type: %.*s\r\n"
|
"Content-Type: %.*s\r\n"
|
||||||
"Connection: close\r\n\r\n",
|
"Connection: close\r\n",
|
||||||
(int) mime_type.len, mime_type.p);
|
(int) mime_type.len, mime_type.p);
|
||||||
|
if (encoding.len > 0) {
|
||||||
|
mg_printf(nc, "Content-Encoding: %.*s\r\n", (int) encoding.len,
|
||||||
|
encoding.p);
|
||||||
|
}
|
||||||
|
mg_send(nc, "\r\n", 2);
|
||||||
mg_send_ssi_file(nc, hm, path, fp, 0, opts);
|
mg_send_ssi_file(nc, hm, path, fp, 0, opts);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
nc->flags |= MG_F_SEND_AND_CLOSE;
|
nc->flags |= MG_F_SEND_AND_CLOSE;
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004-2013 Sergey Lyubka
|
||||||
|
* Copyright (c) 2013-2020 Cesanta Software Limited
|
||||||
|
* All rights reserved
|
||||||
|
*
|
||||||
|
* This software is dual-licensed: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation. For the terms of this
|
||||||
|
* license, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* You are free to use this software under the terms of the GNU General
|
||||||
|
* Public License, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* Alternatively, you can license this software under a commercial
|
||||||
|
* license, as set out in <https://www.cesanta.com/license>.
|
||||||
|
*/
|
||||||
+28
-6
@@ -10,6 +10,8 @@
|
|||||||
#include "mg_internal.h"
|
#include "mg_internal.h"
|
||||||
#include "mg_mqtt.h"
|
#include "mg_mqtt.h"
|
||||||
|
|
||||||
|
#define MG_F_MQTT_PING_PENDING MG_F_PROTO_1
|
||||||
|
|
||||||
static uint16_t getu16(const char *p) {
|
static uint16_t getu16(const char *p) {
|
||||||
const uint8_t *up = (const uint8_t *) p;
|
const uint8_t *up = (const uint8_t *) p;
|
||||||
return (up[0] << 8) + up[1];
|
return (up[0] << 8) + up[1];
|
||||||
@@ -23,7 +25,7 @@ static const char *scanto(const char *p, struct mg_str *s) {
|
|||||||
|
|
||||||
MG_INTERNAL int parse_mqtt(struct mbuf *io, struct mg_mqtt_message *mm) {
|
MG_INTERNAL int parse_mqtt(struct mbuf *io, struct mg_mqtt_message *mm) {
|
||||||
uint8_t header;
|
uint8_t header;
|
||||||
size_t len = 0, len_len = 0;
|
uint32_t len, len_len; /* must be 32-bit, see #1055 */
|
||||||
const char *p, *end, *eop = &io->buf[io->len];
|
const char *p, *end, *eop = &io->buf[io->len];
|
||||||
unsigned char lc = 0;
|
unsigned char lc = 0;
|
||||||
int cmd;
|
int cmd;
|
||||||
@@ -40,7 +42,7 @@ MG_INTERNAL int parse_mqtt(struct mbuf *io, struct mg_mqtt_message *mm) {
|
|||||||
len += (lc & 0x7f) << 7 * len_len;
|
len += (lc & 0x7f) << 7 * len_len;
|
||||||
len_len++;
|
len_len++;
|
||||||
if (!(lc & 0x80)) break;
|
if (!(lc & 0x80)) break;
|
||||||
if (len_len > 4) return MG_MQTT_ERROR_MALFORMED_MSG;
|
if (len_len > sizeof(len)) return MG_MQTT_ERROR_MALFORMED_MSG;
|
||||||
}
|
}
|
||||||
|
|
||||||
end = p + len;
|
end = p + len;
|
||||||
@@ -172,6 +174,10 @@ static void mqtt_handler(struct mg_connection *nc, int ev,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (mm.cmd == MG_MQTT_CMD_PINGRESP) {
|
||||||
|
LOG(LL_DEBUG, ("Recv PINGRESP"));
|
||||||
|
nc->flags &= ~MG_F_MQTT_PING_PENDING;
|
||||||
|
}
|
||||||
|
|
||||||
nc->handler(nc, MG_MQTT_EVENT_BASE + mm.cmd, &mm MG_UD_ARG(user_data));
|
nc->handler(nc, MG_MQTT_EVENT_BASE + mm.cmd, &mm MG_UD_ARG(user_data));
|
||||||
mbuf_remove(io, len);
|
mbuf_remove(io, len);
|
||||||
@@ -182,10 +188,26 @@ static void mqtt_handler(struct mg_connection *nc, int ev,
|
|||||||
struct mg_mqtt_proto_data *pd =
|
struct mg_mqtt_proto_data *pd =
|
||||||
(struct mg_mqtt_proto_data *) nc->proto_data;
|
(struct mg_mqtt_proto_data *) nc->proto_data;
|
||||||
double now = mg_time();
|
double now = mg_time();
|
||||||
if (pd->keep_alive > 0 && pd->last_control_time > 0 &&
|
if (pd->keep_alive > 0 && pd->last_control_time > 0) {
|
||||||
(now - pd->last_control_time) > pd->keep_alive) {
|
double diff = (now - pd->last_control_time);
|
||||||
LOG(LL_DEBUG, ("Send PINGREQ"));
|
if (diff > pd->keep_alive) {
|
||||||
mg_mqtt_ping(nc);
|
if (diff < 1500000000) {
|
||||||
|
if (!(nc->flags & MG_F_MQTT_PING_PENDING)) {
|
||||||
|
LOG(LL_DEBUG, ("Send PINGREQ"));
|
||||||
|
nc->flags |= MG_F_MQTT_PING_PENDING;
|
||||||
|
mg_mqtt_ping(nc);
|
||||||
|
} else {
|
||||||
|
LOG(LL_DEBUG, ("Ping timeout"));
|
||||||
|
nc->flags |= MG_F_CLOSE_IMMEDIATELY;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Wall time has just been set. Avoid immediate ping,
|
||||||
|
* more likely than not it is not needed. The standard allows for
|
||||||
|
* 1.5X interval for ping requests, so even if were just about to
|
||||||
|
* send one, we should be ok waiting 0.4X more. */
|
||||||
|
pd->last_control_time = now - pd->keep_alive * 0.6;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -101,10 +101,10 @@ struct mg_mqtt_proto_data {
|
|||||||
|
|
||||||
/* Message flags */
|
/* Message flags */
|
||||||
#define MG_MQTT_RETAIN 0x1
|
#define MG_MQTT_RETAIN 0x1
|
||||||
#define MG_MQTT_DUP 0x4
|
|
||||||
#define MG_MQTT_QOS(qos) ((qos) << 1)
|
#define MG_MQTT_QOS(qos) ((qos) << 1)
|
||||||
#define MG_MQTT_GET_QOS(flags) (((flags) &0x6) >> 1)
|
#define MG_MQTT_GET_QOS(flags) (((flags) &0x6) >> 1)
|
||||||
#define MG_MQTT_SET_QOS(flags, qos) (flags) = ((flags) & ~0x6) | ((qos) << 1)
|
#define MG_MQTT_SET_QOS(flags, qos) (flags) = ((flags) & ~0x6) | ((qos) << 1)
|
||||||
|
#define MG_MQTT_DUP 0x8
|
||||||
|
|
||||||
/* Connection flags */
|
/* Connection flags */
|
||||||
#define MG_MQTT_CLEAN_SESSION 0x02
|
#define MG_MQTT_CLEAN_SESSION 0x02
|
||||||
|
|||||||
+1
-1
@@ -540,7 +540,7 @@ struct mg_connection *mg_if_accept_new_conn(struct mg_connection *lc) {
|
|||||||
nc->iface = lc->iface;
|
nc->iface = lc->iface;
|
||||||
if (lc->flags & MG_F_SSL) nc->flags |= MG_F_SSL;
|
if (lc->flags & MG_F_SSL) nc->flags |= MG_F_SSL;
|
||||||
mg_add_conn(nc->mgr, nc);
|
mg_add_conn(nc->mgr, nc);
|
||||||
LOG(LL_DEBUG, ("%p %p %d %d", lc, nc, nc->sock, (int) nc->flags));
|
LOG(LL_DEBUG, ("%p %p %d %#x", lc, nc, (int) nc->sock, (int) nc->flags));
|
||||||
return nc;
|
return nc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
-6
@@ -110,9 +110,6 @@ struct mg_connection {
|
|||||||
struct mbuf send_mbuf; /* Data scheduled for sending */
|
struct mbuf send_mbuf; /* Data scheduled for sending */
|
||||||
time_t last_io_time; /* Timestamp of the last socket IO */
|
time_t last_io_time; /* Timestamp of the last socket IO */
|
||||||
double ev_timer_time; /* Timestamp of the future MG_EV_TIMER */
|
double ev_timer_time; /* Timestamp of the future MG_EV_TIMER */
|
||||||
#if MG_ENABLE_SSL
|
|
||||||
void *ssl_if_data; /* SSL library data. */
|
|
||||||
#endif
|
|
||||||
mg_event_handler_t proto_handler; /* Protocol-specific event handler */
|
mg_event_handler_t proto_handler; /* Protocol-specific event handler */
|
||||||
void *proto_data; /* Protocol-specific data */
|
void *proto_data; /* Protocol-specific data */
|
||||||
void (*proto_data_destructor)(void *proto_data);
|
void (*proto_data_destructor)(void *proto_data);
|
||||||
@@ -145,16 +142,25 @@ struct mg_connection {
|
|||||||
/* Flags that are settable by user */
|
/* Flags that are settable by user */
|
||||||
#define MG_F_SEND_AND_CLOSE (1 << 10) /* Push remaining data and close */
|
#define MG_F_SEND_AND_CLOSE (1 << 10) /* Push remaining data and close */
|
||||||
#define MG_F_CLOSE_IMMEDIATELY (1 << 11) /* Disconnect */
|
#define MG_F_CLOSE_IMMEDIATELY (1 << 11) /* Disconnect */
|
||||||
#define MG_F_WEBSOCKET_NO_DEFRAG (1 << 12) /* Websocket specific */
|
|
||||||
#define MG_F_DELETE_CHUNK (1 << 13) /* HTTP specific */
|
/* Flags for protocol handlers */
|
||||||
|
#define MG_F_PROTO_1 (1 << 12)
|
||||||
|
#define MG_F_PROTO_2 (1 << 13)
|
||||||
#define MG_F_ENABLE_BROADCAST (1 << 14) /* Allow broadcast address usage */
|
#define MG_F_ENABLE_BROADCAST (1 << 14) /* Allow broadcast address usage */
|
||||||
|
|
||||||
#define MG_F_USER_1 (1 << 20) /* Flags left for application */
|
/* Flags left for application */
|
||||||
|
#define MG_F_USER_1 (1 << 20)
|
||||||
#define MG_F_USER_2 (1 << 21)
|
#define MG_F_USER_2 (1 << 21)
|
||||||
#define MG_F_USER_3 (1 << 22)
|
#define MG_F_USER_3 (1 << 22)
|
||||||
#define MG_F_USER_4 (1 << 23)
|
#define MG_F_USER_4 (1 << 23)
|
||||||
#define MG_F_USER_5 (1 << 24)
|
#define MG_F_USER_5 (1 << 24)
|
||||||
#define MG_F_USER_6 (1 << 25)
|
#define MG_F_USER_6 (1 << 25)
|
||||||
|
|
||||||
|
#if MG_ENABLE_SSL
|
||||||
|
void *ssl_if_data; /* SSL library data. */
|
||||||
|
#else
|
||||||
|
void *unused_ssl_if_data; /* To keep the size of the structure the same. */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -47,8 +47,8 @@ void mg_socket_if_connect_tcp(struct mg_connection *nc,
|
|||||||
#endif
|
#endif
|
||||||
rc = connect(nc->sock, &sa->sa, sizeof(sa->sin));
|
rc = connect(nc->sock, &sa->sa, sizeof(sa->sin));
|
||||||
nc->err = rc < 0 && mg_is_error() ? mg_get_errno() : 0;
|
nc->err = rc < 0 && mg_is_error() ? mg_get_errno() : 0;
|
||||||
DBG(("%p sock %d rc %d errno %d err %d", nc, nc->sock, rc, mg_get_errno(),
|
DBG(("%p sock %d rc %d errno %d err %d", nc, (int) nc->sock, rc,
|
||||||
nc->err));
|
mg_get_errno(), nc->err));
|
||||||
}
|
}
|
||||||
|
|
||||||
void mg_socket_if_connect_udp(struct mg_connection *nc) {
|
void mg_socket_if_connect_udp(struct mg_connection *nc) {
|
||||||
@@ -218,8 +218,8 @@ void mg_mgr_handle_conn(struct mg_connection *nc, int fd_flags, double now) {
|
|||||||
int worth_logging =
|
int worth_logging =
|
||||||
fd_flags != 0 || (nc->flags & (MG_F_WANT_READ | MG_F_WANT_WRITE));
|
fd_flags != 0 || (nc->flags & (MG_F_WANT_READ | MG_F_WANT_WRITE));
|
||||||
if (worth_logging) {
|
if (worth_logging) {
|
||||||
DBG(("%p fd=%d fd_flags=%d nc_flags=0x%lx rmbl=%d smbl=%d", nc, nc->sock,
|
DBG(("%p fd=%d fd_flags=%d nc_flags=0x%lx rmbl=%d smbl=%d", nc,
|
||||||
fd_flags, nc->flags, (int) nc->recv_mbuf.len,
|
(int) nc->sock, fd_flags, nc->flags, (int) nc->recv_mbuf.len,
|
||||||
(int) nc->send_mbuf.len));
|
(int) nc->send_mbuf.len));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,7 +271,7 @@ void mg_mgr_handle_conn(struct mg_connection *nc, int fd_flags, double now) {
|
|||||||
if (fd_flags & _MG_F_FD_CAN_WRITE) mg_if_can_send_cb(nc);
|
if (fd_flags & _MG_F_FD_CAN_WRITE) mg_if_can_send_cb(nc);
|
||||||
|
|
||||||
if (worth_logging) {
|
if (worth_logging) {
|
||||||
DBG(("%p after fd=%d nc_flags=0x%lx rmbl=%d smbl=%d", nc, nc->sock,
|
DBG(("%p after fd=%d nc_flags=0x%lx rmbl=%d smbl=%d", nc, (int) nc->sock,
|
||||||
nc->flags, (int) nc->recv_mbuf.len, (int) nc->send_mbuf.len));
|
nc->flags, (int) nc->recv_mbuf.len, (int) nc->send_mbuf.len));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -279,8 +279,7 @@ void mg_mgr_handle_conn(struct mg_connection *nc, int fd_flags, double now) {
|
|||||||
#if MG_ENABLE_BROADCAST
|
#if MG_ENABLE_BROADCAST
|
||||||
static void mg_mgr_handle_ctl_sock(struct mg_mgr *mgr) {
|
static void mg_mgr_handle_ctl_sock(struct mg_mgr *mgr) {
|
||||||
struct ctl_msg ctl_msg;
|
struct ctl_msg ctl_msg;
|
||||||
int len =
|
int len = (int) MG_RECV_FUNC(mgr->ctl[1], (char *) &ctl_msg, sizeof(ctl_msg), 0);
|
||||||
(int) MG_RECV_FUNC(mgr->ctl[1], (char *) &ctl_msg, sizeof(ctl_msg), 0);
|
|
||||||
size_t dummy = MG_SEND_FUNC(mgr->ctl[1], ctl_msg.message, 1, 0);
|
size_t dummy = MG_SEND_FUNC(mgr->ctl[1], ctl_msg.message, 1, 0);
|
||||||
DBG(("read %d from ctl socket", len));
|
DBG(("read %d from ctl socket", len));
|
||||||
(void) dummy; /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25509 */
|
(void) dummy; /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25509 */
|
||||||
@@ -299,7 +298,7 @@ void mg_socket_if_sock_set(struct mg_connection *nc, sock_t sock) {
|
|||||||
mg_set_non_blocking_mode(sock);
|
mg_set_non_blocking_mode(sock);
|
||||||
mg_set_close_on_exec(sock);
|
mg_set_close_on_exec(sock);
|
||||||
nc->sock = sock;
|
nc->sock = sock;
|
||||||
DBG(("%p %d", nc, sock));
|
DBG(("%p %d", nc, (int) sock));
|
||||||
}
|
}
|
||||||
|
|
||||||
void mg_socket_if_init(struct mg_iface *iface) {
|
void mg_socket_if_init(struct mg_iface *iface) {
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ extern "C" {
|
|||||||
struct mg_ssl_if_ctx;
|
struct mg_ssl_if_ctx;
|
||||||
struct mg_connection;
|
struct mg_connection;
|
||||||
|
|
||||||
void mg_ssl_if_init();
|
void mg_ssl_if_init(void);
|
||||||
|
|
||||||
enum mg_ssl_if_result {
|
enum mg_ssl_if_result {
|
||||||
MG_SSL_OK = 0,
|
MG_SSL_OK = 0,
|
||||||
|
|||||||
+18
-12
@@ -44,7 +44,11 @@ struct mg_ssl_if_ctx {
|
|||||||
mbedtls_ssl_context *ssl;
|
mbedtls_ssl_context *ssl;
|
||||||
mbedtls_x509_crt *cert;
|
mbedtls_x509_crt *cert;
|
||||||
mbedtls_pk_context *key;
|
mbedtls_pk_context *key;
|
||||||
|
#ifdef MBEDTLS_X509_CA_CHAIN_ON_DISK
|
||||||
|
char *ca_chain_file;
|
||||||
|
#else
|
||||||
mbedtls_x509_crt *ca_cert;
|
mbedtls_x509_crt *ca_cert;
|
||||||
|
#endif
|
||||||
struct mbuf cipher_suites;
|
struct mbuf cipher_suites;
|
||||||
size_t saved_len;
|
size_t saved_len;
|
||||||
};
|
};
|
||||||
@@ -52,7 +56,7 @@ struct mg_ssl_if_ctx {
|
|||||||
/* Must be provided by the platform. ctx is struct mg_connection. */
|
/* Must be provided by the platform. ctx is struct mg_connection. */
|
||||||
extern int mg_ssl_if_mbed_random(void *ctx, unsigned char *buf, size_t len);
|
extern int mg_ssl_if_mbed_random(void *ctx, unsigned char *buf, size_t len);
|
||||||
|
|
||||||
void mg_ssl_if_init() {
|
void mg_ssl_if_init(void) {
|
||||||
LOG(LL_INFO, ("%s", MBEDTLS_VERSION_STRING_FULL));
|
LOG(LL_INFO, ("%s", MBEDTLS_VERSION_STRING_FULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,18 +224,17 @@ static void mg_ssl_if_mbed_free_certs_and_keys(struct mg_ssl_if_ctx *ctx) {
|
|||||||
MG_FREE(ctx->key);
|
MG_FREE(ctx->key);
|
||||||
ctx->key = NULL;
|
ctx->key = NULL;
|
||||||
}
|
}
|
||||||
|
#ifdef MBEDTLS_X509_CA_CHAIN_ON_DISK
|
||||||
|
MG_FREE(ctx->ca_chain_file);
|
||||||
|
ctx->ca_chain_file = NULL;
|
||||||
|
#else
|
||||||
if (ctx->ca_cert != NULL) {
|
if (ctx->ca_cert != NULL) {
|
||||||
mbedtls_ssl_conf_ca_chain(ctx->conf, NULL, NULL);
|
mbedtls_ssl_conf_ca_chain(ctx->conf, NULL, NULL);
|
||||||
#ifdef MBEDTLS_X509_CA_CHAIN_ON_DISK
|
|
||||||
if (ctx->conf->ca_chain_file != NULL) {
|
|
||||||
MG_FREE((void *) ctx->conf->ca_chain_file);
|
|
||||||
ctx->conf->ca_chain_file = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
mbedtls_x509_crt_free(ctx->ca_cert);
|
mbedtls_x509_crt_free(ctx->ca_cert);
|
||||||
MG_FREE(ctx->ca_cert);
|
MG_FREE(ctx->ca_cert);
|
||||||
ctx->ca_cert = NULL;
|
ctx->ca_cert = NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
enum mg_ssl_if_result mg_ssl_if_handshake(struct mg_connection *nc) {
|
enum mg_ssl_if_result mg_ssl_if_handshake(struct mg_connection *nc) {
|
||||||
@@ -312,11 +315,11 @@ void mg_ssl_if_conn_free(struct mg_connection *nc) {
|
|||||||
mbedtls_ssl_free(ctx->ssl);
|
mbedtls_ssl_free(ctx->ssl);
|
||||||
MG_FREE(ctx->ssl);
|
MG_FREE(ctx->ssl);
|
||||||
}
|
}
|
||||||
mg_ssl_if_mbed_free_certs_and_keys(ctx);
|
|
||||||
if (ctx->conf != NULL) {
|
if (ctx->conf != NULL) {
|
||||||
mbedtls_ssl_config_free(ctx->conf);
|
mbedtls_ssl_config_free(ctx->conf);
|
||||||
MG_FREE(ctx->conf);
|
MG_FREE(ctx->conf);
|
||||||
}
|
}
|
||||||
|
mg_ssl_if_mbed_free_certs_and_keys(ctx);
|
||||||
mbuf_free(&ctx->cipher_suites);
|
mbuf_free(&ctx->cipher_suites);
|
||||||
memset(ctx, 0, sizeof(*ctx));
|
memset(ctx, 0, sizeof(*ctx));
|
||||||
MG_FREE(ctx);
|
MG_FREE(ctx);
|
||||||
@@ -328,12 +331,15 @@ static enum mg_ssl_if_result mg_use_ca_cert(struct mg_ssl_if_ctx *ctx,
|
|||||||
mbedtls_ssl_conf_authmode(ctx->conf, MBEDTLS_SSL_VERIFY_NONE);
|
mbedtls_ssl_conf_authmode(ctx->conf, MBEDTLS_SSL_VERIFY_NONE);
|
||||||
return MG_SSL_OK;
|
return MG_SSL_OK;
|
||||||
}
|
}
|
||||||
|
#ifdef MBEDTLS_X509_CA_CHAIN_ON_DISK
|
||||||
|
ctx->ca_chain_file = strdup(ca_cert);
|
||||||
|
if (ctx->ca_chain_file == NULL) return MG_SSL_ERROR;
|
||||||
|
if (mbedtls_ssl_conf_ca_chain_file(ctx->conf, ctx->ca_chain_file, NULL) != 0) {
|
||||||
|
return MG_SSL_ERROR;
|
||||||
|
}
|
||||||
|
#else
|
||||||
ctx->ca_cert = (mbedtls_x509_crt *) MG_CALLOC(1, sizeof(*ctx->ca_cert));
|
ctx->ca_cert = (mbedtls_x509_crt *) MG_CALLOC(1, sizeof(*ctx->ca_cert));
|
||||||
mbedtls_x509_crt_init(ctx->ca_cert);
|
mbedtls_x509_crt_init(ctx->ca_cert);
|
||||||
#ifdef MBEDTLS_X509_CA_CHAIN_ON_DISK
|
|
||||||
ca_cert = strdup(ca_cert);
|
|
||||||
mbedtls_ssl_conf_ca_chain_file(ctx->conf, ca_cert, NULL);
|
|
||||||
#else
|
|
||||||
if (mbedtls_x509_crt_parse_file(ctx->ca_cert, ca_cert) != 0) {
|
if (mbedtls_x509_crt_parse_file(ctx->ca_cert, ca_cert) != 0) {
|
||||||
return MG_SSL_ERROR;
|
return MG_SSL_ERROR;
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-1
@@ -10,10 +10,13 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
|
#include <openssl/err.h>
|
||||||
#ifndef KR_VERSION
|
#ifndef KR_VERSION
|
||||||
#include <openssl/tls1.h>
|
#include <openssl/tls1.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static const char *mg_default_session_id_context = "mongoose";
|
||||||
|
|
||||||
struct mg_ssl_if_ctx {
|
struct mg_ssl_if_ctx {
|
||||||
SSL *ssl;
|
SSL *ssl;
|
||||||
SSL_CTX *ssl_ctx;
|
SSL_CTX *ssl_ctx;
|
||||||
@@ -21,7 +24,7 @@ struct mg_ssl_if_ctx {
|
|||||||
size_t identity_len;
|
size_t identity_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
void mg_ssl_if_init() {
|
void mg_ssl_if_init(void) {
|
||||||
SSL_library_init();
|
SSL_library_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,6 +78,9 @@ enum mg_ssl_if_result mg_ssl_if_conn_init(
|
|||||||
SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_SSLv2);
|
SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_SSLv2);
|
||||||
SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_SSLv3);
|
SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_SSLv3);
|
||||||
SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_TLSv1);
|
SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_TLSv1);
|
||||||
|
SSL_CTX_set_session_id_context(ctx->ssl_ctx,
|
||||||
|
(void *) mg_default_session_id_context,
|
||||||
|
strlen(mg_default_session_id_context));
|
||||||
#ifdef MG_SSL_OPENSSL_NO_COMPRESSION
|
#ifdef MG_SSL_OPENSSL_NO_COMPRESSION
|
||||||
SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_COMPRESSION);
|
SSL_CTX_set_options(ctx->ssl_ctx, SSL_OP_NO_COMPRESSION);
|
||||||
#endif
|
#endif
|
||||||
@@ -132,6 +138,17 @@ static enum mg_ssl_if_result mg_ssl_if_ssl_err(struct mg_connection *nc,
|
|||||||
int res) {
|
int res) {
|
||||||
struct mg_ssl_if_ctx *ctx = (struct mg_ssl_if_ctx *) nc->ssl_if_data;
|
struct mg_ssl_if_ctx *ctx = (struct mg_ssl_if_ctx *) nc->ssl_if_data;
|
||||||
int err = SSL_get_error(ctx->ssl, res);
|
int err = SSL_get_error(ctx->ssl, res);
|
||||||
|
/*
|
||||||
|
* We've just fetched the last error from the queue.
|
||||||
|
* Now we need to clear the error queue. If we do not, then the following
|
||||||
|
* can happen (actually reported):
|
||||||
|
* - A new connection is accept()-ed with cert error (e.g. self-signed cert)
|
||||||
|
* - Since all accept()-ed connections share listener's context,
|
||||||
|
* - *ALL* SSL accepted connection report read error on the next poll cycle.
|
||||||
|
* Thus a single errored connection can close all the rest, unrelated ones.
|
||||||
|
* Clearing the error keeps the shared SSL_CTX in an OK state.
|
||||||
|
*/
|
||||||
|
ERR_clear_error();
|
||||||
if (err == SSL_ERROR_WANT_READ) return MG_SSL_WANT_READ;
|
if (err == SSL_ERROR_WANT_READ) return MG_SSL_WANT_READ;
|
||||||
if (err == SSL_ERROR_WANT_WRITE) return MG_SSL_WANT_WRITE;
|
if (err == SSL_ERROR_WANT_WRITE) return MG_SSL_WANT_WRITE;
|
||||||
DBG(("%p %p SSL error: %d %d", nc, ctx->ssl_ctx, res, err));
|
DBG(("%p %p SSL error: %d %d", nc, ctx->ssl_ctx, res, err));
|
||||||
|
|||||||
+41
-47
@@ -1,49 +1,43 @@
|
|||||||
-----BEGIN RSA PRIVATE KEY-----
|
Certificate:
|
||||||
MIIEpAIBAAKCAQEAv3/TSSi5hZDwMKG43eqe+GzR1lRMXVYt9I1Mr987v1DT99xR
|
Data:
|
||||||
Dcpfo/3aj6B/V/G67oPz+zbVZN/ZPvvA1Z82T7ixcBFsGIXgEWzxUm1UCUf51ftl
|
Version: 3 (0x2)
|
||||||
MlOaf24cdyegi0y8hRdkWLoC7w0vuMfrgR6cmpbI2LSDSMaXXX2qDoofQsFUYaJN
|
Serial Number:
|
||||||
Nn3uqRK0ixs/jzbzbAT9q2BWYwySUX4VEgADpmi0FyANDjEhmdktxQW9l6IGGzF8
|
11:2a:0e:3c:6a:8c:85:ff:6e:6a:bc:db:95:51:70:ce:b4:30:78:c7
|
||||||
M9mA053hIgZwo+9qf9X3nfNUTWMvisMQtxm0mRYgvD53Oix08VLs6bodNTVOLQoc
|
Signature Algorithm: ecdsa-with-SHA256
|
||||||
H0uH3CTs+H3Z0CkcZaAJe/kwCLFhls9ee3M0nQIDAQABAoIBAQCsADPWUi3QOg6C
|
Issuer: C = IE, L = Dublin, O = Cesanta, CN = Test Root
|
||||||
n79cE5AVsigHSlAMxYshTIjErs0LWZ4J0mk66bpdoXTd7Fp0szojYYGS8f1ZTXXj
|
Validity
|
||||||
jFv3g7lUgZ9d+UgN/rDy9dcLIgeJDozoFZUfTthF/LC0lXMtqw7ou8n1p51a+Y0T
|
Not Before: May 9 21:51:44 2020 GMT
|
||||||
ev2cS9J9R1G+0uPYSgdKgcRsqsLJQS4fu5CAk9d0aeTTl009uxcn9yfTUjwOaR5J
|
Not After : May 9 21:51:44 2050 GMT
|
||||||
PuNmunAEvhE/DGSkt5oNXo7t8Q2L3mYSM0MwKdDFqoQdZAV6TMTv22Mjb6SxOOnJ
|
Subject: C = IE, L = Dublin, O = Cesanta, CN = Test Root
|
||||||
r5gNK2BmM6oNPWvzY0PoI0LcLgFNDWIMqIq4mg73MdzszakaNRDlOYtLAuKbTF3Q
|
Subject Public Key Info:
|
||||||
SDq8OkZBAoGBAOn6B5jBxSa+5GcIIeGqtiRhDMExyblt3Gk2gaw6UIZpvVDXPWWm
|
Public Key Algorithm: id-ecPublicKey
|
||||||
r0tkGJrYecmqesN7DGmmdkyx8KONF+yzYLxSsIEGNesvVYe6PXTDZYYI57As4Z4W
|
Public-Key: (256 bit)
|
||||||
DFlCDt2FaKuMXxyOlUCiXg94z8IJBJ2ldCmmG34gBSvuFe6V5x4XE3crAoGBANGG
|
pub:
|
||||||
P7AWw6uygfjog6B2dFT6n+9UhpyJlqwfPi5eD9V5JXtWlH6xWi3dRfuYAIafg95I
|
04:2c:ab:d1:02:66:24:96:d7:12:3e:09:50:4f:f1:
|
||||||
W8/OZGHrj44gNCgYjvZHud+H3NPJPZ7lftoay5KeShBAa/pCd67OMxp1SvvONYcp
|
50:ee:51:e8:55:03:5e:ba:b1:1d:98:b2:72:79:27:
|
||||||
7TSwm5s+hOJvQOpw2wg0cXnfrxGKpGLOFaRddp9XAoGAFdeXefUs2G8dl1i1AQIU
|
a8:1b:31:0d:5d:50:21:ff:42:f2:da:74:17:5e:53:
|
||||||
utSsgiSJtlvBJblG5bMT7VhVqgRN4P1sg9c2TM5EoETf7PvBruMxS/uYgUwcnaYp
|
b2:65:41:c1:fc:84:de:4a:11:b9:8c:f4:19:d9:c4:
|
||||||
M6tser7/rZLfoyoJrqrHAXo3VsT50u4v/O0jwh5AJTOXdW0CFeSSb1NR4cVBvw3B
|
ca:2b:ea:eb:2c
|
||||||
CFpPWrjWgsFZHsqzpqV01b0CgYEAkDft4pDowmgumlvBLlQaotuX9q6hsWHrOjKP
|
ASN1 OID: prime256v1
|
||||||
JG9OSswGhq0DrWj5/5PNNe5cfk2SARChUZpo8hWoTFXSUL8GuHKKeFgWIhjkt1iU
|
NIST CURVE: P-256
|
||||||
RiAne5ZEuIb/S9UweDwqZM3TfRtlMNIlGh1uHh+cbBfUAQsJWM5wRUk4QcTCfdgI
|
X509v3 extensions:
|
||||||
gYhrvCUCgYBB6u8Q49RjrTBxWK8bcZOjVhYNrd3xrCunFVMt2QAXGGrRaXpqUMnp
|
X509v3 Basic Constraints:
|
||||||
xNUmGe9vGux+s0TRguZcLEX3vX+wFyBfFKwZY9hSU7PFY/da8echpu37JasKvAov
|
CA:TRUE
|
||||||
5+5XWI5RgF+SFVk+Q7St2BlSJa/vBAH8vtrX9Dt/hN/VSo2mAPAyMQ==
|
X509v3 Key Usage:
|
||||||
-----END RSA PRIVATE KEY-----
|
Digital Signature, Key Encipherment, Key Agreement, Certificate Sign, CRL Sign
|
||||||
|
Signature Algorithm: ecdsa-with-SHA256
|
||||||
|
30:46:02:21:00:9c:71:6c:00:8c:06:41:0c:91:2f:cd:41:d3:
|
||||||
|
87:47:e9:df:3a:22:ad:25:7c:bf:0e:2b:39:dd:7a:0c:4e:68:
|
||||||
|
1d:02:21:00:8f:c1:22:30:10:61:5d:51:10:ea:08:2d:02:63:
|
||||||
|
67:67:32:b5:06:63:96:57:bb:78:47:0a:88:d9:19:2e:f3:be
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIDjjCCAnagAwIBAgIJAIOEuwkahzkOMA0GCSqGSIb3DQEBBQUAMDgxCzAJBgNV
|
MIIBqjCCAU+gAwIBAgIUESoOPGqMhf9uarzblVFwzrQweMcwCgYIKoZIzj0EAwIw
|
||||||
BAMTAm5zMQswCQYDVQQKEwJuczELMAkGA1UEBhMCSUUxDzANBgNVBAcTBkR1Ymxp
|
RDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50
|
||||||
bjAeFw0xNDA4MzAxOTA3NDNaFw0yNDA4MjcxOTA3NDNaMDgxCzAJBgNVBAMTAm5z
|
YTESMBAGA1UEAwwJVGVzdCBSb290MCAXDTIwMDUwOTIxNTE0NFoYDzIwNTAwNTA5
|
||||||
MQswCQYDVQQKEwJuczELMAkGA1UEBhMCSUUxDzANBgNVBAcTBkR1YmxpbjCCASIw
|
MjE1MTQ0WjBEMQswCQYDVQQGEwJJRTEPMA0GA1UEBwwGRHVibGluMRAwDgYDVQQK
|
||||||
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9/00kouYWQ8DChuN3qnvhs0dZU
|
DAdDZXNhbnRhMRIwEAYDVQQDDAlUZXN0IFJvb3QwWTATBgcqhkjOPQIBBggqhkjO
|
||||||
TF1WLfSNTK/fO79Q0/fcUQ3KX6P92o+gf1fxuu6D8/s21WTf2T77wNWfNk+4sXAR
|
PQMBBwNCAAQsq9ECZiSW1xI+CVBP8VDuUehVA166sR2YsnJ5J6gbMQ1dUCH/QvLa
|
||||||
bBiF4BFs8VJtVAlH+dX7ZTJTmn9uHHcnoItMvIUXZFi6Au8NL7jH64EenJqWyNi0
|
dBdeU7JlQcH8hN5KEbmM9BnZxMor6ussox0wGzAMBgNVHRMEBTADAQH/MAsGA1Ud
|
||||||
g0jGl119qg6KH0LBVGGiTTZ97qkStIsbP48282wE/atgVmMMklF+FRIAA6ZotBcg
|
DwQEAwIBrjAKBggqhkjOPQQDAgNJADBGAiEAnHFsAIwGQQyRL81B04dH6d86Iq0l
|
||||||
DQ4xIZnZLcUFvZeiBhsxfDPZgNOd4SIGcKPvan/V953zVE1jL4rDELcZtJkWILw+
|
fL8OKzndegxOaB0CIQCPwSIwEGFdURDqCC0CY2dnMrUGY5ZXu3hHCojZGS7zvg==
|
||||||
dzosdPFS7Om6HTU1Ti0KHB9Lh9wk7Ph92dApHGWgCXv5MAixYZbPXntzNJ0CAwEA
|
|
||||||
AaOBmjCBlzAdBgNVHQ4EFgQUsz/nOHpjMkV8pk9dFpy41batoTcwaAYDVR0jBGEw
|
|
||||||
X4AUsz/nOHpjMkV8pk9dFpy41batoTehPKQ6MDgxCzAJBgNVBAMTAm5zMQswCQYD
|
|
||||||
VQQKEwJuczELMAkGA1UEBhMCSUUxDzANBgNVBAcTBkR1YmxpboIJAIOEuwkahzkO
|
|
||||||
MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAEDOtAl7bgAXgcL3HRlV
|
|
||||||
H71tkUaok589PIqsTE4d8s8tFBZ92CyWD8ZPU46HbbyJXMFoFxiN7PvCzOBlgoZM
|
|
||||||
r80HJWZc9tSlqK0NIbIyk1aeM06+F8qB+8/vw/spIkdYzDv3avwyOrc6fFnEzbwz
|
|
||||||
5BFFrF2G9JajRKAP5snAV9iM8I2TD4l+w75MXXl7/DBEohdMBsTeDrrXj4q4sgoB
|
|
||||||
L/yLeCoK6inkMTU5DwcGbiqvNnZA+9T654qlAlKjPMObGGPphK5/QKcOnV7Qtdju
|
|
||||||
DHzDsDimdVbz9G1cxXs/AI/35GD7IDTdNTtmBhkf4/tsQ7Ua80xpIowb1fFUHmo1
|
|
||||||
UAo=
|
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
+48
-43
@@ -1,45 +1,50 @@
|
|||||||
-----BEGIN RSA PRIVATE KEY-----
|
Certificate:
|
||||||
MIIEpAIBAAKCAQEAwV5xaK7ez2/TX7vSgJ0a3YbZj2l1VQ2rMzqO1Id01xlWbF/U
|
Data:
|
||||||
rebwhAdVtWcT9R6RaBTPDGaILkV38u77M2BxIHX4MSnR6WezoA2bGMgvt3+tq2N6
|
Version: 3 (0x2)
|
||||||
q+xkj57vwBEqedBjscVtFkoWtsX8pKwtNlMB1NvTa8p5+BNsvpvzaDX+51+FotId
|
Serial Number:
|
||||||
wvieQfQYgFg36HpOtOyyIV31rZ/5+qtoce8gU6wApHxmovTnQPoduNM6fOUJCHDd
|
03:d8:95:71:ba:5f:70:c8:4d:6a:e8:a6:0f:aa:40:d5:fc:d9:bc:6e
|
||||||
Lz90EeBREtoTVgoWcKvQoCEwJQSBmeDZgkA8Q1OYmbYoS12tIyi8rTkseRj5BvPH
|
Signature Algorithm: ecdsa-with-SHA256
|
||||||
iXfNmHFKliAjvlsml5qI44I9DoagPubTf6qR5wIDAQABAoIBACZ6VZTgH0Ql22jU
|
Issuer: C = IE, L = Dublin, O = Cesanta, CN = Test Root
|
||||||
ZhnjqUHloIsyEAABvUxvXZaa8bwPtavREfAc4UVUdFCpl0YSdBrC8URlbrnOZwT3
|
Validity
|
||||||
WxMpILm139JgoP2R/iNeMbunsh8QkA1nuTRW0NfnZ4vPnqUou33XbFKgIY7zLMfT
|
Not Before: May 9 21:51:52 2020 GMT
|
||||||
3xdNQzMJHzP20Xh03RG81J2rCPMfLScTRo2XxcSxmhhS/p2WLk6pnmMHiNgYGGwX
|
Not After : May 9 21:51:52 2030 GMT
|
||||||
gcdK5lIVjMMNxgcltC30x90v0o0GDRM8/+wua+/vfn8rr3iudv9IHzL8xIzpi6NY
|
Subject: CN = client
|
||||||
CXJ8Kxd6Jtgsr3Boj5i6Mqi3Q/Trxt+rIA4bKAFXxwcp4+GmRIJtQFFiTWXpLCPC
|
Subject Public Key Info:
|
||||||
tLT4CHECgYEA7iCbrGjWHJ4QsUWUGrGlw1/sQ0SIv9BdZm8RydHzpRVtQOi+YOuU
|
Public Key Algorithm: id-ecPublicKey
|
||||||
i6raVaXWzUBKgKcs/htVjAMTiePs/yhlU/MGXivz6uTX/nrD7ISJImmK2K50hgUe
|
Public-Key: (256 bit)
|
||||||
+UBnFKmBMVaNxD9RFWPJkfmNXfW7nBkqSa9CxlBcYPuOcPtZDqRl+gkCgYEAz+HX
|
pub:
|
||||||
8wh3SHKb1cAI+o4caclpUTpGa9/zW4k+7gOh72WCKaqxTNvBvNyZGdXc9t5ToDSf
|
04:e2:2e:72:7b:b6:2d:a3:d3:3b:0e:b1:4e:8a:09:
|
||||||
xxsDXWG10lcHBIGLj4QBEoSWp9I43lid5swY3mCo7CjTl+1l03IfDNaC6CYQFp5p
|
19:66:ff:d6:0e:d4:3f:47:8c:20:ab:06:db:25:77:
|
||||||
ZnKlsQUwR38t/uiyZpnnicCAZjqIfJbeQ5jD6G8CgYB8ufmwQa08ihJmN/KOVNRl
|
8b:2a:ac:fa:a4:e2:f8:97:ba:10:c5:fa:5d:0b:ee:
|
||||||
VF31EfWquqHhYHXpxx2eL23tXLszGtHQoioASIANPAqJ/oaTho+1aXsXc5oUP/1r
|
28:16:56:78:0f:30:17:2b:6b:04:6c:dc:c8:f8:12:
|
||||||
DlUciFsXgswb0APFY9pMewmt2xrPg+koVvJnIS25QQO6cguvb3gKDLNeLrMY3RmI
|
23:d3:2f:01:58
|
||||||
RNNt+nOYnMqMJSsNf1CmuQKBgQCiCZxWaCbyZcNqncFh7BvhqYlaM15o/6ulkhln
|
ASN1 OID: prime256v1
|
||||||
VZWIEUugRtjk2/bry9fa94TBORNeMSbKABhjVaJwTj2+GWw7dd2QHaGBNq/1QIX0
|
NIST CURVE: P-256
|
||||||
POq1jAqf6kLkjbttUes6CosHgYPQ3bGylXLpxO2ZDV1A8Qj+SMDd8xsilEWHN+IQ
|
X509v3 extensions:
|
||||||
NqeeKQKBgQDe4c7VVG+WvRRKshTh8+tjzc9nXKE2AWgwnw729SMFZO/WqX2FPp2C
|
X509v3 Basic Constraints:
|
||||||
7C99XJTVBsCBy8VzuyaojeTKkag0YL3v6UTZYUeyu0YTHGQ33WVPaqdCAo840nmG
|
CA:FALSE
|
||||||
ttwHVqshB9c67HHiYOOFt1VmT3xW6x6yympUyRqR0L+BZ1wOS3h2vQ==
|
X509v3 Key Usage:
|
||||||
-----END RSA PRIVATE KEY-----
|
Digital Signature, Key Encipherment, Key Agreement
|
||||||
|
X509v3 Extended Key Usage:
|
||||||
|
TLS Web Client Authentication
|
||||||
|
Signature Algorithm: ecdsa-with-SHA256
|
||||||
|
30:46:02:21:00:de:e5:30:ae:50:e9:a7:14:a0:c3:79:29:df:
|
||||||
|
bf:d3:a3:f8:19:b0:19:b5:ab:3e:6e:c9:29:18:86:ff:fe:a7:
|
||||||
|
b0:02:21:00:f5:ba:90:d6:1c:fe:ff:05:44:9a:b1:20:2c:ee:
|
||||||
|
00:68:20:85:f7:0f:86:a2:13:1e:86:9a:03:6d:74:aa:72:c2
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIC6DCCAdACBRQJQlZlMA0GCSqGSIb3DQEBBQUAMDgxCzAJBgNVBAMTAm5zMQsw
|
MIIBhzCCASygAwIBAgIUA9iVcbpfcMhNauimD6pA1fzZvG4wCgYIKoZIzj0EAwIw
|
||||||
CQYDVQQKEwJuczELMAkGA1UEBhMCSUUxDzANBgNVBAcTBkR1YmxpbjAeFw0xNDA4
|
RDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50
|
||||||
MzAxOTA3NDRaFw0yNDA4MjcxOTA3NDRaMDgxCzAJBgNVBAMTAm5zMQswCQYDVQQK
|
YTESMBAGA1UEAwwJVGVzdCBSb290MB4XDTIwMDUwOTIxNTE1MloXDTMwMDUwOTIx
|
||||||
EwJuczELMAkGA1UEBhMCSUUxDzANBgNVBAcTBkdhbHdheTCCASIwDQYJKoZIhvcN
|
NTE1MlowETEPMA0GA1UEAwwGY2xpZW50MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD
|
||||||
AQEBBQADggEPADCCAQoCggEBAMFecWiu3s9v01+70oCdGt2G2Y9pdVUNqzM6jtSH
|
QgAE4i5ye7Yto9M7DrFOigkZZv/WDtQ/R4wgqwbbJXeLKqz6pOL4l7oQxfpdC+4o
|
||||||
dNcZVmxf1K3m8IQHVbVnE/UekWgUzwxmiC5Fd/Lu+zNgcSB1+DEp0elns6ANmxjI
|
FlZ4DzAXK2sEbNzI+BIj0y8BWKMvMC0wCQYDVR0TBAIwADALBgNVHQ8EBAMCA6gw
|
||||||
L7d/ratjeqvsZI+e78ARKnnQY7HFbRZKFrbF/KSsLTZTAdTb02vKefgTbL6b82g1
|
EwYDVR0lBAwwCgYIKwYBBQUHAwIwCgYIKoZIzj0EAwIDSQAwRgIhAN7lMK5Q6acU
|
||||||
/udfhaLSHcL4nkH0GIBYN+h6TrTssiFd9a2f+fqraHHvIFOsAKR8ZqL050D6HbjT
|
oMN5Kd+/06P4GbAZtas+bskpGIb//qewAiEA9bqQ1hz+/wVEmrEgLO4AaCCF9w+G
|
||||||
OnzlCQhw3S8/dBHgURLaE1YKFnCr0KAhMCUEgZng2YJAPENTmJm2KEtdrSMovK05
|
ohMehpoDbXSqcsI=
|
||||||
LHkY+Qbzx4l3zZhxSpYgI75bJpeaiOOCPQ6GoD7m03+qkecCAwEAATANBgkqhkiG
|
|
||||||
9w0BAQUFAAOCAQEAJ+wZ/IgAF5LIu0yOfJlaFRJLunKHZENigiVjYvkTdM7NI3O2
|
|
||||||
1AZGY4O8H5Fs3YT5ZY3vas/n6IwWTk3o/JSPXojMFo82XkbI1k2cm3oLtwgEGN3p
|
|
||||||
s5yFsjZE3H7fQJ9wHIzESBPHFY6dwwgMsNENuAM2zkwFpbAkisKhjK+EyUCXauok
|
|
||||||
7zJY6RVPMaNojsje4iE/SBtSOnK/9WDBAgpCznHrSChJmKs4FsU7ZTO+Dg+0vQln
|
|
||||||
l8/yBcEGAFe0GA2D9NvZKH5IoNmitvtU9zdNDK4dzC3Q+C28IjW5jE8peDFtdGs1
|
|
||||||
P0u4kRxmb4UH1DchgoWlZjL2lSFScJ7L4xY2aQ==
|
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgk5sv3YwDGTm29Czy
|
||||||
|
UWuKlbfbvZqZv1fFRBOn2S0D7SuhRANCAATiLnJ7ti2j0zsOsU6KCRlm/9YO1D9H
|
||||||
|
jCCrBtsld4sqrPqk4viXuhDF+l0L7igWVngPMBcrawRs3Mj4EiPTLwFY
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
+48
-43
@@ -1,45 +1,50 @@
|
|||||||
-----BEGIN RSA PRIVATE KEY-----
|
Certificate:
|
||||||
MIIEpAIBAAKCAQEA1mONQ0hAXOL9lb15Pz4fqXXNHREsF3a7/NoMJdQDclx0+a32
|
Data:
|
||||||
MhuHcO6R7Fhsc0mZMuzbmAFLMmIIgXPMKQBZLoA12yCBlZPyKFoWUhFrLa3gUjO6
|
Version: 3 (0x2)
|
||||||
CZlBKqkUVEACpVrQ41ihapeeUHa0uryt3tXwMn2/853yzi1uciGYi4ULTy3yTE/n
|
Serial Number:
|
||||||
qRIVJLiBDSC9WNFLg26f/W4YRW7tANOk2b/W/Ws9B/n7vNDgHG7Lpd38YTpFhhXT
|
6e:73:28:55:df:13:b5:61:f5:4f:4f:5d:00:d9:0a:d8:b5:3a:21:4b
|
||||||
n3xlt/VcczkQhW79Moh6/lY6sLg6H15EjHKHeTn8t9BRm+qYi/CvC258YF/Qz/qK
|
Signature Algorithm: ecdsa-with-SHA256
|
||||||
agSsLT/3FrQ6+aQgg/Eyao0IWAql49PQNxuwPQIDAQABAoIBAQC5y3S1BnyhAyb5
|
Issuer: C = IE, L = Dublin, O = Cesanta, CN = Test Root
|
||||||
Ckd1g4U0+x5TPnqTqxanvuAgOGj0RyQo7ZYbPrhWKqrTxJ3YG8Rk2dhFF3nvo/3z
|
Validity
|
||||||
EkOwlNi07++8g6NJ2flW9xu469eSsslg8+saPnK3Yeh4SzD/1ICLRlg9ZECTQwzF
|
Not Before: May 9 21:51:49 2020 GMT
|
||||||
eJbGM2oCl/AuVIgEHmNFDdCBuT9f0b7j3/Z3aK3lKzqzBYQgZ5fd8UxT+Kn4oAuS
|
Not After : May 9 21:51:49 2030 GMT
|
||||||
cLr3lQT1s6xZOAYn7O2GvXEC+yMMbvm0a97MdwSpQez1WcE9YxtCgAWwn5EmSXlh
|
Subject: CN = server
|
||||||
296iLtbaM1wgYOykJUOUoSgijf8pUfotk4Zj/y1KPHXePgAlyGCtE1zasiYb5K+5
|
Subject Public Key Info:
|
||||||
LuajD++BAoGBAPpKWLNzQBwQLiFaJgt6bLOxlEUR+EnjdFePDPJtyCCCiKJiKO5c
|
Public Key Algorithm: id-ecPublicKey
|
||||||
Z5s/FT1JDQawouhjQwYqT48hbGBPjWRHkSkzB7+cg6FVSKkQRYX2TsSFvN+KCu32
|
Public-Key: (256 bit)
|
||||||
oSgDV9cFo68v1csoZIQ41TtHC82db4OTv9MPUe3Glujnep1TOTwspAM1AoGBANtH
|
pub:
|
||||||
i+HWKOxOm7f/R2VX1ys9UjkAK+msac512XWSLAzBs7NFnB7iJ7m3Bh3ydb1ZiTgW
|
04:92:e0:46:9c:89:c3:37:a9:74:eb:35:55:43:55:
|
||||||
l6bIdoT8TLPYNIXJ6uohhxPU5h3v81PHqIuJMBtmHCQjq3nxeH9mOsfjOFvS1cQa
|
5c:ac:eb:c7:e4:50:ee:f4:c0:ba:17:02:5c:d9:ed:
|
||||||
At45F9pK/5sQpOkkaBGSv8jXUFIKBEDBErourVHpAoGAK0gSAK4sZu3xXDkfnRqF
|
b4:d4:ff:21:12:9a:b4:43:f4:89:4b:69:e4:6d:2b:
|
||||||
k6lgr3UFD5nys3V8UqvjUKPiBtqco2N9Ux5ciOWKCB8hfLg1jephKaoo+JqpI68w
|
96:1f:fc:01:4d:30:5a:79:73:76:ba:19:41:cc:c5:
|
||||||
jgRSEbN6G7sIvpueuiS2yEssNyfC7hWZFrdFSFykSpYmDWSlxSuizAZkJyFTeFhj
|
16:2b:bf:74:28
|
||||||
cpcSnuCZlhr5XB1ZJ2u8zQUCgYEAke5QgpCDFZjO+ynR+vj1gppBwRuDHfUXSUaW
|
ASN1 OID: prime256v1
|
||||||
3S7VT/wNOq6F0uvRYkASuxVkFAqlToWCkYVxktlRtpKZibwyMXT0r1cNejj5Z/VF
|
NIST CURVE: P-256
|
||||||
Du/S6zkOW2K9uN7hwW9oiSSHmlx61RI2fGvkmus0pp7yERKgi6ltJx1cH+z4nZug
|
X509v3 extensions:
|
||||||
efWcdRkCgYBy+XdmsxgNZOunlSC6VZiD0Ve/VFrCtKPWUivKDAZZPKl0T/1tbTwb
|
X509v3 Basic Constraints:
|
||||||
I/N4zTF82jx88rDz+6jN5nOy9qbSR5TeCy6WlBesTvXm49awr5jSK3WkcLgmO+JI
|
CA:FALSE
|
||||||
Zr2ozCBhUG6RvVsUPp2kXEsmwZMV/e9faFAlIXeJhKum6hZmfOgodg==
|
X509v3 Key Usage:
|
||||||
-----END RSA PRIVATE KEY-----
|
Digital Signature, Key Encipherment, Key Agreement
|
||||||
|
X509v3 Extended Key Usage:
|
||||||
|
TLS Web Server Authentication
|
||||||
|
Signature Algorithm: ecdsa-with-SHA256
|
||||||
|
30:46:02:21:00:fa:3a:c7:1e:cb:8c:27:59:41:8d:77:dd:7b:
|
||||||
|
cb:8c:08:15:16:b9:6e:70:e6:47:38:d1:55:42:e0:d7:66:c8:
|
||||||
|
f0:02:21:00:cc:70:4d:96:28:00:d3:c7:39:53:74:b2:49:87:
|
||||||
|
27:92:1b:ab:1a:0e:74:06:59:42:23:47:98:43:d8:20:a7:fa
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIC6DCCAdACBRQJQlZkMA0GCSqGSIb3DQEBBQUAMDgxCzAJBgNVBAMTAm5zMQsw
|
MIIBhzCCASygAwIBAgIUbnMoVd8TtWH1T09dANkK2LU6IUswCgYIKoZIzj0EAwIw
|
||||||
CQYDVQQKEwJuczELMAkGA1UEBhMCSUUxDzANBgNVBAcTBkR1YmxpbjAeFw0xNDA4
|
RDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50
|
||||||
MzAxOTA3NDNaFw0yNDA4MjcxOTA3NDNaMDgxCzAJBgNVBAMTAm5zMQswCQYDVQQK
|
YTESMBAGA1UEAwwJVGVzdCBSb290MB4XDTIwMDUwOTIxNTE0OVoXDTMwMDUwOTIx
|
||||||
EwJuczELMAkGA1UEBhMCSUUxDzANBgNVBAcTBkdhbHdheTCCASIwDQYJKoZIhvcN
|
NTE0OVowETEPMA0GA1UEAwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD
|
||||||
AQEBBQADggEPADCCAQoCggEBANZjjUNIQFzi/ZW9eT8+H6l1zR0RLBd2u/zaDCXU
|
QgAEkuBGnInDN6l06zVVQ1VcrOvH5FDu9MC6FwJc2e201P8hEpq0Q/SJS2nkbSuW
|
||||||
A3JcdPmt9jIbh3DukexYbHNJmTLs25gBSzJiCIFzzCkAWS6ANdsggZWT8ihaFlIR
|
H/wBTTBaeXN2uhlBzMUWK790KKMvMC0wCQYDVR0TBAIwADALBgNVHQ8EBAMCA6gw
|
||||||
ay2t4FIzugmZQSqpFFRAAqVa0ONYoWqXnlB2tLq8rd7V8DJ9v/Od8s4tbnIhmIuF
|
EwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSQAwRgIhAPo6xx7LjCdZ
|
||||||
C08t8kxP56kSFSS4gQ0gvVjRS4Nun/1uGEVu7QDTpNm/1v1rPQf5+7zQ4Bxuy6Xd
|
QY133XvLjAgVFrlucOZHONFVQuDXZsjwAiEAzHBNligA08c5U3SySYcnkhurGg50
|
||||||
/GE6RYYV0598Zbf1XHM5EIVu/TKIev5WOrC4Oh9eRIxyh3k5/LfQUZvqmIvwrwtu
|
BllCI0eYQ9ggp/o=
|
||||||
fGBf0M/6imoErC0/9xa0OvmkIIPxMmqNCFgKpePT0DcbsD0CAwEAATANBgkqhkiG
|
|
||||||
9w0BAQUFAAOCAQEAoVXK97WA24tp3JyPBJKr28gFSUtOBNDPdY8atWaqw7PwUIIM
|
|
||||||
qhs3BTag96tgSoaISRwRphz2LM1Cl+QlItYXySAnxPKrUsA0S6DlxnA6Hq3s2wTR
|
|
||||||
6yIT7oDUDKcWkVQcQmuNGdfxCvZXkCih9lnQn++xHcuVn9mZmjXW2xk42ljDTZCp
|
|
||||||
CM29betpcmuho6sFXsBhY7WjQWg7UpRZat0bOwleS4fsePebMKrnr/6cq4bVw59U
|
|
||||||
XvhSFBlLoGMYteJ82fOYH6pUO1hiPr6ww5d819LPcJEcRpcxCdQZqIq680Kp7+GY
|
|
||||||
0wkyOYr0gkNwWVP7IUZ0FExaQ/s54g71Kd0OgA==
|
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQglNni0t9Dg9icgG8w
|
||||||
|
kbfxWSS+TuNgbtNybIQXcm3NHpmhRANCAASS4EacicM3qXTrNVVDVVys68fkUO70
|
||||||
|
wLoXAlzZ7bTU/yESmrRD9IlLaeRtK5Yf/AFNMFp5c3a6GUHMxRYrv3Qo
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
@@ -4590,6 +4590,15 @@ static const char *test_dns_encode(void) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *test_dns_encode_name(void) {
|
||||||
|
struct mbuf mb;
|
||||||
|
mbuf_init(&mb, 0);
|
||||||
|
ASSERT_EQ(mg_dns_encode_name(&mb, "www.cesanta.com.net.org", 15), 17);
|
||||||
|
ASSERT_STREQ_NZ(mb.buf, "\x03" "www" "\x07" "cesanta" "\x03" "com");
|
||||||
|
mbuf_free(&mb);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static const char *test_dns_uncompress(void) {
|
static const char *test_dns_uncompress(void) {
|
||||||
/*
|
/*
|
||||||
* Order or string constants is important. Names being uncompressed
|
* Order or string constants is important. Names being uncompressed
|
||||||
@@ -5781,6 +5790,7 @@ const char *tests_run(const char *filter) {
|
|||||||
RUN_TEST(test_mqtt_broker);
|
RUN_TEST(test_mqtt_broker);
|
||||||
#endif
|
#endif
|
||||||
RUN_TEST(test_dns_encode);
|
RUN_TEST(test_dns_encode);
|
||||||
|
RUN_TEST(test_dns_encode_name);
|
||||||
RUN_TEST(test_dns_uncompress);
|
RUN_TEST(test_dns_uncompress);
|
||||||
RUN_TEST(test_dns_decode);
|
RUN_TEST(test_dns_decode);
|
||||||
RUN_TEST(test_dns_decode_truncated);
|
RUN_TEST(test_dns_decode_truncated);
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Mongoose is distributed as two files, `mongoose.c` and `mongoose.h` for ease of integration.
|
Mongoose is distributed as two files, `mongoose.c` and `mongoose.h` for ease of integration.
|
||||||
However, when developing Mongoose itself, it can be quite difficult to work with them.
|
However, when developing Mongoose itself, it can be quite difficult to work with them.
|
||||||
Internally, these files are an _amalgamation_ of source an header modules.
|
Internally, these files are an _amalgamation_ of source and header modules.
|
||||||
This directory contains utilities to split and re-constitute amalgamated files.
|
This directory contains utilities to split and re-constitute amalgamated files.
|
||||||
|
|
||||||
Here's how `mongoose.c` can be split into its consituent parts:
|
Here's how `mongoose.c` can be split into its consituent parts:
|
||||||
|
|||||||
+33
-13
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
#
|
#
|
||||||
# Generate a reversible amalgamation of several C source files
|
# Generate a reversible amalgamation of several C source files
|
||||||
# along with their required internal headers.
|
# along with their required internal headers.
|
||||||
@@ -32,10 +32,10 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
import io
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
from StringIO import StringIO
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Produce an amalgamated source')
|
parser = argparse.ArgumentParser(description='Produce an amalgamated source')
|
||||||
parser.add_argument('--prefix', default="NS",
|
parser.add_argument('--prefix', default="NS",
|
||||||
@@ -59,16 +59,17 @@ parser.add_argument('--exportable-headers', dest="export", action='store_true',
|
|||||||
help='allow exporting internal headers')
|
help='allow exporting internal headers')
|
||||||
parser.add_argument('-I', default=['.'], dest='include_path', help='include path', action='append')
|
parser.add_argument('-I', default=['.'], dest='include_path', help='include path', action='append')
|
||||||
parser.add_argument('sources', nargs='*', help='sources')
|
parser.add_argument('sources', nargs='*', help='sources')
|
||||||
|
parser.add_argument('--license', dest="license", help='License file')
|
||||||
|
|
||||||
class File(object):
|
class File(object):
|
||||||
def __init__(self, name, parent_name):
|
def __init__(self, name, parent_name):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.parent_name = parent_name
|
self.parent_name = parent_name
|
||||||
self.buf = StringIO()
|
self.buf = io.StringIO()
|
||||||
emit_file(self.buf, self.name, self.parent_name)
|
emit_file(self.buf, self.name, self.parent_name)
|
||||||
|
|
||||||
def emit(self):
|
def emit(self):
|
||||||
print self.buf.getvalue(),
|
print('%s' % self.buf.getvalue(), end='')
|
||||||
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
@@ -103,25 +104,39 @@ def resolve(path, parent_name):
|
|||||||
break
|
break
|
||||||
if os.path.exists(p) and not args.norel:
|
if os.path.exists(p) and not args.norel:
|
||||||
p = os.path.realpath(p).replace('%s%s' % (os.getcwd(), os.sep), '')
|
p = os.path.realpath(p).replace('%s%s' % (os.getcwd(), os.sep), '')
|
||||||
# print >>sys.stderr, '%s %s -> %s (cwd %s)' % (path, parent_name, p, os.getcwd())
|
|
||||||
return p.replace(os.sep, '/')
|
return p.replace(os.sep, '/')
|
||||||
|
|
||||||
def emit_line_directive(out, name, parent_name):
|
def emit_line_directive(out, name, parent_name):
|
||||||
print >>out, '''#ifdef %(prefix)s_MODULE_LINES
|
print ('''#ifdef %(prefix)s_MODULE_LINES
|
||||||
#line 1 "%(name)s"
|
#line 1 "%(name)s"
|
||||||
#endif''' % dict(
|
#endif''' % dict(
|
||||||
prefix = args.prefix,
|
prefix = args.prefix,
|
||||||
name = resolve(name, parent_name),
|
name = resolve(name, parent_name),
|
||||||
)
|
), file=out)
|
||||||
|
|
||||||
def emit_body(out, name, parent_name):
|
def emit_body(out, name, parent_name):
|
||||||
resolved_name = resolve(name, parent_name)
|
resolved_name = resolve(name, parent_name)
|
||||||
if not args.strict and not os.path.exists(resolved_name):
|
if not args.strict and not os.path.exists(resolved_name):
|
||||||
print >>out, '#include "%s"' % (name,)
|
print('#include "%s"' % name, file=out)
|
||||||
return
|
return
|
||||||
|
|
||||||
with open(resolved_name) as f:
|
with open(resolved_name) as f:
|
||||||
|
in_comment = False
|
||||||
|
comment = ''
|
||||||
for l in f:
|
for l in f:
|
||||||
|
if in_comment:
|
||||||
|
comment += l
|
||||||
|
if re.match('\s*\*/$', l):
|
||||||
|
in_comment = False
|
||||||
|
if not re.match('.*Copyright.*Cesanta', comment, re.M | re.S):
|
||||||
|
out.write(comment)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if re.match('/\*$', l):
|
||||||
|
in_comment = True
|
||||||
|
comment = l
|
||||||
|
continue
|
||||||
|
|
||||||
match = re.match('( *#include "(.*)")', l)
|
match = re.match('( *#include "(.*)")', l)
|
||||||
if match:
|
if match:
|
||||||
all, path_to_include = match.groups()
|
all, path_to_include = match.groups()
|
||||||
@@ -129,9 +144,9 @@ def emit_body(out, name, parent_name):
|
|||||||
if not should_ignore(path_to_include, parent_name):
|
if not should_ignore(path_to_include, parent_name):
|
||||||
already_included.add(path_to_include)
|
already_included.add(path_to_include)
|
||||||
includes.append(File(path_to_include, resolved_name))
|
includes.append(File(path_to_include, resolved_name))
|
||||||
print >>out, '/* Amalgamated: %s */' % (all,)
|
print('/* Amalgamated: %s */' % all, file=out)
|
||||||
else:
|
else:
|
||||||
print >>out, l,
|
out.write(l)
|
||||||
|
|
||||||
|
|
||||||
def emit_file(out, name, parent_name):
|
def emit_file(out, name, parent_name):
|
||||||
@@ -155,15 +170,20 @@ if sys.platform == "win32":
|
|||||||
import os, msvcrt
|
import os, msvcrt
|
||||||
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
|
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
|
||||||
|
|
||||||
|
|
||||||
|
if args.license:
|
||||||
|
with open(args.license) as f:
|
||||||
|
print(f.read())
|
||||||
|
|
||||||
if args.public:
|
if args.public:
|
||||||
print '#include "%s"' % (args.public)
|
print('#include "%s"' % args.public)
|
||||||
|
|
||||||
for i in includes:
|
for i in includes:
|
||||||
i.emit()
|
i.emit()
|
||||||
|
|
||||||
if args.export:
|
if args.export:
|
||||||
print '#ifndef %s_EXPORT_INTERNAL_HEADERS' % (args.prefix,)
|
print('#ifndef %s_EXPORT_INTERNAL_HEADERS' % (args.prefix,))
|
||||||
for i in sources:
|
for i in sources:
|
||||||
i.emit()
|
i.emit()
|
||||||
if args.export:
|
if args.export:
|
||||||
print '#endif /* %s_EXPORT_INTERNAL_HEADERS */' % (args.prefix,)
|
print('#endif /* %s_EXPORT_INTERNAL_HEADERS */' % (args.prefix,))
|
||||||
Reference in new issue
Block a user