diff --git a/docs/c-api/mg_net.h/struct_mg_connection.md b/docs/c-api/mg_net.h/struct_mg_connection.md
index cf6bd7ff..24a25267 100644
--- a/docs/c-api/mg_net.h/struct_mg_connection.md
+++ b/docs/c-api/mg_net.h/struct_mg_connection.md
@@ -16,9 +16,6 @@ signature: |
struct mbuf send_mbuf; /* Data scheduled for sending */
time_t last_io_time; /* Timestamp of the last socket IO */
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 */
void *proto_data; /* Protocol-specific data */
void (*proto_data_destructor)(void *proto_data);
@@ -51,16 +48,25 @@ signature: |
/* Flags that are settable by user */
#define MG_F_SEND_AND_CLOSE (1 << 10) /* Push remaining data and close */
#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_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_3 (1 << 22)
#define MG_F_USER_4 (1 << 23)
#define MG_F_USER_5 (1 << 24)
#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
};
---
diff --git a/mongoose.c b/mongoose.c
index 5c800075..e01ba0a9 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -1,11 +1,26 @@
+/*
+ * 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 .
+ *
+ * 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 .
+ */
+
#include "mongoose.h"
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_internal.h"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
#ifndef CS_MONGOOSE_SRC_INTERNAL_H_
#define CS_MONGOOSE_SRC_INTERNAL_H_
@@ -167,22 +182,6 @@ MG_INTERNAL int mg_sntp_parse_reply(const char *buf, int len,
#ifdef MG_MODULE_LINES
#line 1 "common/mg_mem.h"
#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_MEM_H_
#define CS_COMMON_MG_MEM_H_
@@ -215,22 +214,6 @@ extern "C" {
#ifdef MG_MODULE_LINES
#line 1 "common/cs_base64.c"
#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 EXCLUDE_COMMON
@@ -435,22 +418,6 @@ int cs_base64_decode(const unsigned char *s, int len, char *dst, int *dec_len) {
#ifdef MG_MODULE_LINES
#line 1 "common/cs_dbg.h"
#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_DBG_H_
#define CS_COMMON_CS_DBG_H_
@@ -586,22 +553,6 @@ void cs_log_printf(const char *fmt, ...) PRINTF_LIKE(1, 2);
#ifdef MG_MODULE_LINES
#line 1 "common/cs_dbg.c"
#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.
- */
/* Amalgamated: #include "common/cs_dbg.h" */
@@ -732,22 +683,6 @@ void cs_log_set_level(enum cs_log_level level) {
#ifdef MG_MODULE_LINES
#line 1 "common/cs_dirent.h"
#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_DIRENT_H_
#define CS_COMMON_CS_DIRENT_H_
@@ -786,22 +721,6 @@ struct dirent *readdir(DIR *dir);
#ifdef MG_MODULE_LINES
#line 1 "common/cs_dirent.c"
#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 EXCLUDE_COMMON
@@ -897,22 +816,6 @@ typedef int cs_dirent_dummy;
#ifdef MG_MODULE_LINES
#line 1 "common/cs_time.c"
#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.
- */
/* Amalgamated: #include "common/cs_time.h" */
@@ -995,22 +898,6 @@ double cs_timegm(const struct tm *tm) {
#ifdef MG_MODULE_LINES
#line 1 "common/cs_endian.h"
#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_ENDIAN_H_
#define CS_COMMON_CS_ENDIAN_H_
@@ -1512,22 +1399,6 @@ void cs_hmac_sha1(const unsigned char *key, size_t keylen,
#ifdef MG_MODULE_LINES
#line 1 "common/mbuf.c"
#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 EXCLUDE_COMMON
@@ -1666,22 +1537,6 @@ void mbuf_move(struct mbuf *from, struct mbuf *to) {
#ifdef MG_MODULE_LINES
#line 1 "common/mg_str.c"
#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.
- */
/* Amalgamated: #include "common/mg_mem.h" */
/* Amalgamated: #include "common/mg_str.h" */
@@ -1764,8 +1619,10 @@ int mg_strcmp(const struct mg_str str1, const struct mg_str str2) WEAK;
int mg_strcmp(const struct mg_str str1, const struct mg_str str2) {
size_t i = 0;
while (i < str1.len && i < str2.len) {
- if (str1.p[i] < str2.p[i]) return -1;
- if (str1.p[i] > str2.p[i]) return 1;
+ int c1 = str1.p[i];
+ int c2 = str2.p[i];
+ if (c1 < c2) return -1;
+ if (c1 > c2) return 1;
i++;
}
if (i < str1.len) return 1;
@@ -1787,6 +1644,21 @@ int mg_strncmp(const struct mg_str str1, const struct mg_str str2, size_t n) {
return mg_strcmp(s1, s2);
}
+int mg_strcasecmp(const struct mg_str str1, const struct mg_str str2) WEAK;
+int mg_strcasecmp(const struct mg_str str1, const struct mg_str str2) {
+ size_t i = 0;
+ while (i < str1.len && i < str2.len) {
+ int c1 = tolower((int) str1.p[i]);
+ int c2 = tolower((int) str2.p[i]);
+ if (c1 < c2) return -1;
+ if (c1 > c2) return 1;
+ i++;
+ }
+ if (i < str1.len) return 1;
+ if (i < str2.len) return -1;
+ return 0;
+}
+
void mg_strfree(struct mg_str *s) WEAK;
void mg_strfree(struct mg_str *s) {
char *sp = (char *) s->p;
@@ -1830,22 +1702,6 @@ int mg_str_starts_with(struct mg_str s, struct mg_str prefix) {
#ifdef MG_MODULE_LINES
#line 1 "common/str_util.c"
#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 EXCLUDE_COMMON
@@ -2365,23 +2221,6 @@ size_t mg_match_prefix(const char *pattern, int pattern_len, const char *str) {
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_net.c"
#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 .
- *
- * 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 .
- */
/* Amalgamated: #include "common/cs_time.h" */
/* Amalgamated: #include "mg_dns.h" */
@@ -2907,7 +2746,7 @@ struct mg_connection *mg_if_accept_new_conn(struct mg_connection *lc) {
nc->iface = lc->iface;
if (lc->flags & MG_F_SSL) nc->flags |= MG_F_SSL;
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;
}
@@ -3578,10 +3417,6 @@ double mg_time(void) {
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_net_if_socket.h"
#endif
-/*
- * Copyright (c) 2014-2016 Cesanta Software Limited
- * All rights reserved
- */
#ifndef CS_MONGOOSE_SRC_NET_IF_SOCKET_H_
#define CS_MONGOOSE_SRC_NET_IF_SOCKET_H_
@@ -3606,10 +3441,6 @@ extern const struct mg_iface_vtable mg_socket_iface_vtable;
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_net_if_socks.h"
#endif
-/*
-* Copyright (c) 2014-2017 Cesanta Software Limited
-* All rights reserved
-*/
#ifndef CS_MONGOOSE_SRC_NET_IF_SOCKS_H_
#define CS_MONGOOSE_SRC_NET_IF_SOCKS_H_
@@ -3687,23 +3518,6 @@ double mg_mgr_min_timer(const struct mg_mgr *mgr) {
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_net_if_null.c"
#endif
-/*
- * Copyright (c) 2018 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 .
- *
- * 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 .
- */
static void mg_null_if_connect_tcp(struct mg_connection *c,
const union socket_address *sa) {
@@ -3831,10 +3645,6 @@ const struct mg_iface_vtable mg_default_iface_vtable = MG_NULL_IFACE_VTABLE;
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_net_if_socket.c"
#endif
-/*
- * Copyright (c) 2014-2016 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_NET_IF_SOCKET
@@ -3880,8 +3690,8 @@ void mg_socket_if_connect_tcp(struct mg_connection *nc,
#endif
rc = connect(nc->sock, &sa->sa, sizeof(sa->sin));
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(),
- nc->err));
+ DBG(("%p sock %d rc %d errno %d err %d", nc, (int) nc->sock, rc,
+ mg_get_errno(), nc->err));
}
void mg_socket_if_connect_udp(struct mg_connection *nc) {
@@ -4051,8 +3861,8 @@ void mg_mgr_handle_conn(struct mg_connection *nc, int fd_flags, double now) {
int worth_logging =
fd_flags != 0 || (nc->flags & (MG_F_WANT_READ | MG_F_WANT_WRITE));
if (worth_logging) {
- DBG(("%p fd=%d fd_flags=%d nc_flags=0x%lx rmbl=%d smbl=%d", nc, nc->sock,
- fd_flags, nc->flags, (int) nc->recv_mbuf.len,
+ DBG(("%p fd=%d fd_flags=%d nc_flags=0x%lx rmbl=%d smbl=%d", nc,
+ (int) nc->sock, fd_flags, nc->flags, (int) nc->recv_mbuf.len,
(int) nc->send_mbuf.len));
}
@@ -4104,7 +3914,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 (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));
}
}
@@ -4112,8 +3922,7 @@ void mg_mgr_handle_conn(struct mg_connection *nc, int fd_flags, double now) {
#if MG_ENABLE_BROADCAST
static void mg_mgr_handle_ctl_sock(struct mg_mgr *mgr) {
struct ctl_msg ctl_msg;
- int len =
- (int) MG_RECV_FUNC(mgr->ctl[1], (char *) &ctl_msg, sizeof(ctl_msg), 0);
+ int len = (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);
DBG(("read %d from ctl socket", len));
(void) dummy; /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25509 */
@@ -4132,7 +3941,7 @@ void mg_socket_if_sock_set(struct mg_connection *nc, sock_t sock) {
mg_set_non_blocking_mode(sock);
mg_set_close_on_exec(sock);
nc->sock = sock;
- DBG(("%p %d", nc, sock));
+ DBG(("%p %d", nc, (int) sock));
}
void mg_socket_if_init(struct mg_iface *iface) {
@@ -4416,10 +4225,6 @@ const struct mg_iface_vtable mg_default_iface_vtable = MG_SOCKET_IFACE_VTABLE;
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_net_if_socks.c"
#endif
-/*
- * Copyright (c) 2014-2016 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_SOCKS
@@ -4656,10 +4461,6 @@ struct mg_iface *mg_socks_mk_iface(struct mg_mgr *mgr, const char *proxy_addr) {
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_ssl_if_openssl.c"
#endif
-/*
- * Copyright (c) 2014-2016 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_SSL && MG_SSL_IF == MG_SSL_IF_OPENSSL
@@ -4679,7 +4480,7 @@ struct mg_ssl_if_ctx {
size_t identity_len;
};
-void mg_ssl_if_init() {
+void mg_ssl_if_init(void) {
SSL_library_init();
}
@@ -5056,10 +4857,6 @@ const char *mg_set_ssl(struct mg_connection *nc, const char *cert,
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_ssl_if_mbedtls.c"
#endif
-/*
- * Copyright (c) 2014-2016 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_SSL && MG_SSL_IF == MG_SSL_IF_MBEDTLS
@@ -5102,7 +4899,11 @@ struct mg_ssl_if_ctx {
mbedtls_ssl_context *ssl;
mbedtls_x509_crt *cert;
mbedtls_pk_context *key;
+#ifdef MBEDTLS_X509_CA_CHAIN_ON_DISK
+ char *ca_chain_file;
+#else
mbedtls_x509_crt *ca_cert;
+#endif
struct mbuf cipher_suites;
size_t saved_len;
};
@@ -5110,7 +4911,7 @@ struct mg_ssl_if_ctx {
/* 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);
-void mg_ssl_if_init() {
+void mg_ssl_if_init(void) {
LOG(LL_INFO, ("%s", MBEDTLS_VERSION_STRING_FULL));
}
@@ -5278,18 +5079,17 @@ static void mg_ssl_if_mbed_free_certs_and_keys(struct mg_ssl_if_ctx *ctx) {
MG_FREE(ctx->key);
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) {
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);
MG_FREE(ctx->ca_cert);
ctx->ca_cert = NULL;
}
+#endif
}
enum mg_ssl_if_result mg_ssl_if_handshake(struct mg_connection *nc) {
@@ -5370,11 +5170,11 @@ void mg_ssl_if_conn_free(struct mg_connection *nc) {
mbedtls_ssl_free(ctx->ssl);
MG_FREE(ctx->ssl);
}
- mg_ssl_if_mbed_free_certs_and_keys(ctx);
if (ctx->conf != NULL) {
mbedtls_ssl_config_free(ctx->conf);
MG_FREE(ctx->conf);
}
+ mg_ssl_if_mbed_free_certs_and_keys(ctx);
mbuf_free(&ctx->cipher_suites);
memset(ctx, 0, sizeof(*ctx));
MG_FREE(ctx);
@@ -5386,12 +5186,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);
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));
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) {
return MG_SSL_ERROR;
}
@@ -5568,10 +5371,6 @@ int mg_ssl_if_mbed_random(void *ctx, unsigned char *buf, size_t len) {
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_uri.c"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
/* Amalgamated: #include "mg_internal.h" */
/* Amalgamated: #include "mg_uri.h" */
@@ -5832,10 +5631,6 @@ out:
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_http.c"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_HTTP
@@ -6162,37 +5957,53 @@ static const struct {
MIME_ENTRY("asf", "video/x-ms-asf"),
MIME_ENTRY("avi", "video/x-msvideo"),
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,
- const struct mg_serve_http_opts *opts) {
+static struct mg_str mg_get_mime_types_entry(struct mg_str path) {
+ 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;
- size_t i, path_len;
- struct mg_str r, k, v;
-
- path_len = strlen(path);
+ struct mg_str k, v;
overrides = opts->custom_mime_types;
while ((overrides = mg_next_comma_list_entry(overrides, &k, &v)) != NULL) {
- ext = path + (path_len - k.len);
- if (path_len > k.len && mg_vcasecmp(&k, ext) == 0) {
- return v;
+ ext = path.p + (path.len - k.len);
+ if (path.len > k.len && mg_vcasecmp(&k, ext) == 0) {
+ *type = v;
+ return 1;
}
}
- for (i = 0; mg_static_builtin_mime_types[i].extension != NULL; i++) {
- 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] == '.' &&
- mg_casecmp(ext, mg_static_builtin_mime_types[i].extension) == 0) {
- r.p = mg_static_builtin_mime_types[i].mime_type;
- r.len = strlen(r.p);
- return r;
+ *type = mg_get_mime_types_entry(path);
+
+ /* Check for .html.gz, .js.gz, etc. */
+ if (mg_vcmp(type, "application/x-gunzip") == 0) {
+ struct mg_str path2 = mg_mk_str_n(path.p, path.len - 3);
+ struct mg_str type2 = mg_get_mime_types_entry(path2);
+ 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;
- r.len = strlen(r.p);
- return r;
+ return (type->len > 0);
}
#endif
@@ -7292,12 +7103,15 @@ static int mg_http_parse_range_header(const struct mg_str *header, int64_t *a,
return result;
}
-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) {
+void mg_http_serve_file_internal(struct mg_connection *nc,
+ struct http_message *hm, const char *path,
+ 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);
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) {
int code, err = mg_get_errno();
switch (err) {
@@ -7336,8 +7150,9 @@ void mg_http_serve_file(struct mg_connection *nc, struct http_message *hm,
} else {
status_code = 206;
cl = r2 - r1 + 1;
- snprintf(range, sizeof(range), "Content-Range: bytes %" INT64_FMT
- "-%" INT64_FMT "/%" INT64_FMT "\r\n",
+ snprintf(range, sizeof(range),
+ "Content-Range: bytes %" INT64_FMT "-%" INT64_FMT
+ "/%" INT64_FMT "\r\n",
r1, r1 + cl - 1, (int64_t) st.st_size);
#if _FILE_OFFSET_BITS == 64 || _POSIX_C_SOURCE >= 200112L || \
_XOPEN_SOURCE >= 600
@@ -7362,13 +7177,6 @@ void mg_http_serve_file(struct mg_connection *nc, struct http_message *hm,
mg_http_construct_etag(etag, sizeof(etag), &st);
mg_gmt_time_string(current_time, sizeof(current_time), &t);
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_printf(nc,
"Date: %s\r\n"
@@ -7378,17 +7186,29 @@ void mg_http_serve_file(struct mg_connection *nc, struct http_message *hm,
"Connection: %s\r\n"
"Content-Length: %" SIZE_T_FMT
"\r\n"
- "%sEtag: %s\r\n\r\n",
+ "%s"
+ "Etag: %s\r\n",
current_time, last_modified, (int) mime_type.len, mime_type.p,
(pd->file.keepalive ? "keep-alive" : "close"), (size_t) cl, range,
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.type = DATA_FILE;
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,
struct http_message *hm,
struct mg_serve_http_opts *opts) {
@@ -7398,8 +7218,12 @@ static void mg_http_serve_file2(struct mg_connection *nc, const char *path,
return;
}
#endif
- mg_http_serve_file(nc, hm, path, mg_get_mime_type(path, "text/plain", opts),
- mg_mk_str(opts->extra_headers));
+ struct mg_str type = MG_NULL_STR, encoding = MG_NULL_STR;
+ 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
@@ -7675,7 +7499,7 @@ void cs_md5(char buf[33], ...) {
va_list ap;
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;
msg_lens[num_msgs] = va_arg(ap, size_t);
num_msgs++;
@@ -8306,13 +8130,13 @@ MG_INTERNAL int mg_uri_to_local_path(struct http_message *hm,
*p++ = DIRSEP;
/* No NULs and DIRSEPs in the component (percent-encoded). */
for (i = 0; i < component.len; i++, p++) {
- if (*p == '\0' || *p == DIRSEP
+ if (*p == '\0' ||
+ *p == DIRSEP
#ifdef _WIN32
/* On Windows, "/" is also accepted, so check for that too. */
- ||
- *p == '/'
+ || *p == '/'
#endif
- ) {
+ ) {
ok = 0;
break;
}
@@ -8525,7 +8349,9 @@ MG_INTERNAL void mg_send_http_file(struct mg_connection *nc, char *path,
mg_http_send_error(nc, 501, NULL);
#endif
} 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 {
mg_http_serve_file2(nc, index_file ? index_file : path, hm, opts);
}
@@ -8658,7 +8484,7 @@ void mg_file_upload_handler(struct mg_connection *nc, int ev, void *ev_data,
#ifdef SPIFFS_ERR_FULL
|| mg_get_errno() == SPIFFS_ERR_FULL
#endif
- ) {
+ ) {
mg_printf(nc,
"HTTP/1.1 413 Payload Too Large\r\n"
"Content-Type: text/plain\r\n"
@@ -8817,8 +8643,9 @@ struct mg_connection *mg_connect_http_opt(
if (path.len == 0) path = 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
- "\r\n%.*s%s\r\n%s",
+ mg_printf(nc,
+ "%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,
(int) (path.p - host.p), host.p, strlen(post_data), (int) auth.len,
(auth.buf == NULL ? "" : auth.buf), extra_headers, post_data);
@@ -8927,7 +8754,7 @@ static void mg_http_call_endpoint_handler(struct mg_connection *nc, int ev,
#if MG_ENABLE_HTTP_STREAMING_MULTIPART
|| ev == MG_EV_HTTP_MULTIPART_REQUEST
#endif
- ) {
+ ) {
struct mg_http_endpoint *ep =
mg_http_get_endpoint_handler(nc->listener, &hm->uri);
if (ep != NULL) {
@@ -8963,10 +8790,6 @@ void mg_register_http_endpoint(struct mg_connection *nc, const char *uri_path,
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_http_cgi.c"
#endif
-/*
- * Copyright (c) 2014-2016 Cesanta Software Limited
- * All rights reserved
- */
#ifndef _WIN32
#include
@@ -9479,10 +9302,6 @@ MG_INTERNAL void mg_http_free_proto_data_cgi(struct mg_http_proto_data_cgi *d) {
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_http_ssi.c"
#endif
-/*
- * Copyright (c) 2014-2016 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_HTTP && MG_ENABLE_HTTP_SSI && MG_ENABLE_FILESYSTEM
@@ -9651,7 +9470,7 @@ MG_INTERNAL void mg_handle_ssi_request(struct mg_connection *nc,
const char *path,
const struct mg_serve_http_opts *opts) {
FILE *fp;
- struct mg_str mime_type;
+ struct mg_str mime_type = MG_NULL_STR, encoding = MG_NULL_STR;
DBG(("%p %s", nc, path));
if ((fp = mg_fopen(path, "rb")) == NULL) {
@@ -9659,12 +9478,20 @@ MG_INTERNAL void mg_handle_ssi_request(struct mg_connection *nc,
} else {
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_printf(nc,
"Content-Type: %.*s\r\n"
- "Connection: close\r\n\r\n",
+ "Connection: close\r\n",
(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);
fclose(fp);
nc->flags |= MG_F_SEND_AND_CLOSE;
@@ -9675,10 +9502,6 @@ MG_INTERNAL void mg_handle_ssi_request(struct mg_connection *nc,
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_http_webdav.c"
#endif
-/*
- * Copyright (c) 2014-2016 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_HTTP && MG_ENABLE_HTTP_WEBDAV
@@ -9947,10 +9770,6 @@ MG_INTERNAL void mg_handle_put(struct mg_connection *nc, const char *path,
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_http_websocket.c"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_HTTP && MG_ENABLE_HTTP_WEBSOCKET
@@ -10469,10 +10288,6 @@ struct mg_connection *mg_connect_ws(
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_util.c"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
/* Amalgamated: #include "common/cs_base64.h" */
/* Amalgamated: #include "mg_internal.h" */
@@ -10816,10 +10631,6 @@ struct mg_str mg_url_encode(const struct mg_str src) {
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_mqtt.c"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_MQTT
@@ -10828,6 +10639,8 @@ struct mg_str mg_url_encode(const struct mg_str src) {
/* Amalgamated: #include "mg_internal.h" */
/* Amalgamated: #include "mg_mqtt.h" */
+#define MG_F_MQTT_PING_PENDING MG_F_PROTO_1
+
static uint16_t getu16(const char *p) {
const uint8_t *up = (const uint8_t *) p;
return (up[0] << 8) + up[1];
@@ -10841,7 +10654,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) {
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];
unsigned char lc = 0;
int cmd;
@@ -10858,7 +10671,7 @@ MG_INTERNAL int parse_mqtt(struct mbuf *io, struct mg_mqtt_message *mm) {
len += (lc & 0x7f) << 7 * len_len;
len_len++;
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;
@@ -10990,6 +10803,10 @@ static void mqtt_handler(struct mg_connection *nc, int ev,
}
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));
mbuf_remove(io, len);
@@ -11000,10 +10817,26 @@ static void mqtt_handler(struct mg_connection *nc, int ev,
struct mg_mqtt_proto_data *pd =
(struct mg_mqtt_proto_data *) nc->proto_data;
double now = mg_time();
- if (pd->keep_alive > 0 && pd->last_control_time > 0 &&
- (now - pd->last_control_time) > pd->keep_alive) {
- LOG(LL_DEBUG, ("Send PINGREQ"));
- mg_mqtt_ping(nc);
+ if (pd->keep_alive > 0 && pd->last_control_time > 0) {
+ double diff = (now - pd->last_control_time);
+ if (diff > pd->keep_alive) {
+ 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;
}
@@ -11330,10 +11163,6 @@ void mg_mqtt_disconnect(struct mg_connection *nc) {
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_mqtt_server.c"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
/* Amalgamated: #include "mg_internal.h" */
/* Amalgamated: #include "mg_mqtt_server.h" */
@@ -11527,10 +11356,6 @@ struct mg_mqtt_session *mg_mqtt_next(struct mg_mqtt_broker *brk,
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_dns.c"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_DNS
@@ -11614,35 +11439,39 @@ int mg_dns_copy_questions(struct mbuf *io, struct mg_dns_message *msg) {
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;
unsigned char n;
size_t pos = io->len;
do {
- if ((s = strchr(name, '.')) == NULL) {
- s = name + len;
+ if ((s = mg_strchr(name, '.')) == NULL) {
+ s = name.p + name.len;
}
- if (s - name > 127) {
+ if (s - name.p > 127) {
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, name, n);
+ mbuf_append(io, name.p, n);
- if (*s == '.') {
+ if (n < name.len && *s == '.') {
n++;
}
- name += n;
- len -= n;
- } while (*s != '\0');
+ name.p += n;
+ name.len -= n;
+ } while (name.len > 0);
mbuf_append(io, "\0", 1); /* Mark end of host name */
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,
const char *name, size_t nlen, const void *rdata,
size_t rlen) {
@@ -11907,10 +11736,6 @@ void mg_set_protocol_dns(struct mg_connection *nc) {
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_dns_server.c"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_DNS_SERVER
@@ -11981,10 +11806,6 @@ int mg_dns_reply_record(struct mg_dns_reply *reply,
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_resolv.c"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_ASYNC_RESOLVER
@@ -12276,22 +12097,6 @@ void mg_set_nameserver(struct mg_mgr *mgr, const char *nameserver) {
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_coap.c"
#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 .
- *
- * 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 .
- */
/* Amalgamated: #include "mg_internal.h" */
/* Amalgamated: #include "mg_coap.h" */
@@ -12876,10 +12681,6 @@ int mg_set_protocol_coap(struct mg_connection *nc) {
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_sntp.c"
#endif
-/*
- * Copyright (c) 2016 Cesanta Software Limited
- * All rights reserved
- */
/* Amalgamated: #include "mg_internal.h" */
/* Amalgamated: #include "mg_sntp.h" */
@@ -13167,10 +12968,6 @@ struct mg_connection *mg_sntp_get_time(struct mg_mgr *mgr,
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_socks.c"
#endif
-/*
- * Copyright (c) 2017 Cesanta Software Limited
- * All rights reserved
- */
#if MG_ENABLE_SOCKS
@@ -13329,22 +13126,6 @@ void mg_set_protocol_socks(struct mg_connection *c) {
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/cc3200/cc3200_libc.c"
#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.
- */
#if CS_PLATFORM == CS_P_CC3200
@@ -13447,22 +13228,6 @@ int _isatty(int fd) {
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/msp432/msp432_libc.c"
#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.
- */
#if CS_PLATFORM == CS_P_MSP432
@@ -13480,22 +13245,6 @@ int gettimeofday(struct timeval *tp, void *tzp) {
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/nrf5/nrf5_libc.c"
#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.
- */
#if (CS_PLATFORM == CS_P_NRF51 || CS_PLATFORM == CS_P_NRF52) && \
defined(__ARMCC_VERSION)
@@ -13509,22 +13258,6 @@ int gettimeofday(struct timeval *tp, void *tzp) {
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/simplelink/sl_fs_slfs.h"
#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_SL_FS_SLFS_H_
#define CS_COMMON_PLATFORMS_SIMPLELINK_SL_FS_SLFS_H_
@@ -13560,22 +13293,6 @@ void fs_slfs_unset_file_flags(const char *name);
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/simplelink/sl_fs_slfs.c"
#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.
- */
/* Standard libc interface to TI SimpleLink FS. */
@@ -13865,22 +13582,6 @@ void fs_slfs_unset_file_flags(const char *name) {
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/simplelink/sl_fs.c"
#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.
- */
#if MG_NET_IF == MG_NET_IF_SIMPLELINK && \
(defined(MG_FS_SLFS) || defined(MG_FS_SPIFFS))
@@ -14291,22 +13992,6 @@ int sl_fs_init(void) {
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/simplelink/sl_socket.c"
#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.
- */
#if MG_NET_IF == MG_NET_IF_SIMPLELINK
@@ -14409,22 +14094,6 @@ void mg_run_in_task(void (*cb)(struct mg_mgr *mgr, void *arg), void *cb_arg) {
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/simplelink/sl_net_if.h"
#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_SL_NET_IF_H_
#define CS_COMMON_PLATFORMS_SIMPLELINK_SL_NET_IF_H_
@@ -14449,22 +14118,6 @@ extern const struct mg_iface_vtable mg_simplelink_iface_vtable;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/simplelink/sl_net_if.c"
#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.
- */
/* Amalgamated: #include "common/platforms/simplelink/sl_net_if.h" */
@@ -14884,22 +14537,6 @@ const struct mg_iface_vtable mg_default_iface_vtable = MG_SL_IFACE_VTABLE;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/simplelink/sl_ssl_if.c"
#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.
- */
#if MG_ENABLE_SSL && MG_SSL_IF == MG_SSL_IF_SIMPLELINK
@@ -15138,22 +14775,6 @@ int sl_set_ssl_opts(int sock, struct mg_connection *nc) {
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/lwip/mg_lwip_net_if.h"
#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_NET_IF_LWIP_H_
#define CS_COMMON_PLATFORMS_LWIP_MG_NET_IF_LWIP_H_
@@ -15206,22 +14827,6 @@ void mg_lwip_mgr_schedule_poll(struct mg_mgr *mgr);
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/lwip/mg_lwip_net_if.c"
#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.
- */
#if MG_ENABLE_NET_IF_LWIP_LOW_LEVEL
@@ -15955,22 +15560,6 @@ const struct mg_iface_vtable mg_default_iface_vtable = MG_LWIP_IFACE_VTABLE;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/lwip/mg_lwip_ev_mgr.c"
#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.
- */
#if MG_NET_IF == MG_NET_IF_LWIP_LOW_LEVEL
@@ -16131,22 +15720,6 @@ time_t mg_lwip_if_poll(struct mg_iface *iface, int timeout_ms) {
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/wince/wince_libc.c"
#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.
- */
#ifdef WINCE
@@ -16220,22 +15793,6 @@ static void mg_gmt_time_string(char *buf, size_t buf_len, time_t *t) {
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/pic32/pic32_net_if.h"
#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_PIC32_NET_IF_H_
#define CS_COMMON_PLATFORMS_PIC32_NET_IF_H_
@@ -16260,22 +15817,6 @@ extern const struct mg_iface_vtable mg_pic32_iface_vtable;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/pic32/pic32_net_if.c"
#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.
- */
#if MG_ENABLE_NET_IF_PIC32
@@ -16567,22 +16108,6 @@ const struct mg_iface_vtable mg_default_iface_vtable = MG_PIC32_IFACE_VTABLE;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/windows/windows_direct.c"
#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.
- */
#ifdef _WIN32
diff --git a/mongoose.h b/mongoose.h
index c59fbb6b..c552b252 100644
--- a/mongoose.h
+++ b/mongoose.h
@@ -1,9 +1,6 @@
-#ifdef MG_MODULE_LINES
-#line 1 "mongoose/src/mg_common.h"
-#endif
/*
* Copyright (c) 2004-2013 Sergey Lyubka
- * Copyright (c) 2013-2015 Cesanta Software Limited
+ * Copyright (c) 2013-2020 Cesanta Software Limited
* All rights reserved
*
* This software is dual-licensed: you can redistribute it and/or modify
@@ -20,10 +17,17 @@
* license, as set out in .
*/
+#ifdef MG_MODULE_LINES
+#line 1 "mongoose/src/mg_common.h"
+#endif
#ifndef CS_MONGOOSE_SRC_COMMON_H_
#define CS_MONGOOSE_SRC_COMMON_H_
+<<<<<<< HEAD
#define MG_VERSION "6.16"
+=======
+#define MG_VERSION "6.17"
+>>>>>>> origin/dev
/* Local tweaks, applied before any of Mongoose's own headers. */
#ifdef MG_LOCALS
@@ -510,22 +514,6 @@ typedef struct stat cs_stat_t;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_esp32.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_ESP32_H_
@@ -567,22 +555,6 @@ typedef struct stat cs_stat_t;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_esp8266.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_ESP8266_H_
@@ -640,22 +612,6 @@ typedef struct stat cs_stat_t;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_cc3100.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_CC3100_H_
@@ -701,22 +657,6 @@ int inet_pton(int af, const char *src, void *dst);
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_cc3200.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_CC3200_H_
@@ -838,22 +778,6 @@ int stat(const char *pathname, struct stat *st);
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_cc3220.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_CC3220_H_
@@ -962,22 +886,6 @@ int stat(const char *pathname, struct stat *st);
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_msp432.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_MSP432_H_
@@ -1082,22 +990,6 @@ int _stat(const char *pathname, struct stat *st);
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_tm4c129.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_TM4C129_H_
@@ -1154,22 +1046,6 @@ typedef struct stat cs_stat_t;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_mbed.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_MBED_H_
@@ -1250,22 +1126,6 @@ in_addr_t inet_addr(const char *cp);
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_nrf51.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_NRF51_H_
#if CS_PLATFORM == CS_P_NRF51
@@ -1307,22 +1167,6 @@ int gettimeofday(struct timeval *tp, void *tzp);
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_nrf52.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_NRF52_H_
#if CS_PLATFORM == CS_P_NRF52
@@ -1367,22 +1211,6 @@ int gettimeofday(struct timeval *tp, void *tzp);
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/simplelink/cs_simplelink.h"
#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_
#define CS_COMMON_PLATFORMS_SIMPLELINK_CS_SIMPLELINK_H_
@@ -1750,22 +1578,6 @@ const char *strerror();
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_nxp_lpc.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_NXP_LPC_H_
@@ -1818,22 +1630,6 @@ typedef struct stat cs_stat_t;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_nxp_kinetis.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_NXP_KINETIS_H_
@@ -1864,22 +1660,6 @@ typedef struct stat cs_stat_t;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_pic32.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_PIC32_H_
@@ -1916,22 +1696,6 @@ char *inet_ntoa(struct in_addr in);
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_rs14100.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_RS14100_H_
@@ -1980,22 +1744,6 @@ typedef struct stat cs_stat_t;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/platform_stm32.h"
#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_
#define CS_COMMON_PLATFORMS_PLATFORM_STM32_H_
@@ -2034,22 +1782,6 @@ typedef struct stat cs_stat_t;
#ifdef MG_MODULE_LINES
#line 1 "common/platforms/lwip/mg_lwip.h"
#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_
#define CS_COMMON_PLATFORMS_LWIP_MG_LWIP_H_
@@ -2117,22 +1849,6 @@ void mg_lwip_set_keepalive_params(struct mg_connection *nc, int idle,
#ifdef MG_MODULE_LINES
#line 1 "common/cs_md5.h"
#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_
#define CS_COMMON_MD5_H_
@@ -2165,22 +1881,6 @@ void cs_md5_final(unsigned char *md, cs_md5_ctx *c);
#ifdef MG_MODULE_LINES
#line 1 "common/cs_sha1.h"
#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_
#define CS_COMMON_SHA1_H_
@@ -2219,22 +1919,6 @@ void cs_hmac_sha1(const unsigned char *key, size_t key_len,
#ifdef MG_MODULE_LINES
#line 1 "common/cs_time.h"
#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_
#define CS_COMMON_CS_TIME_H_
@@ -2264,22 +1948,6 @@ double cs_timegm(const struct tm *tm);
#ifdef MG_MODULE_LINES
#line 1 "common/mg_str.h"
#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_
#define CS_COMMON_MG_STR_H_
@@ -2351,6 +2019,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);
+/*
+ * 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).
*/
@@ -2375,22 +2048,6 @@ int mg_str_starts_with(struct mg_str s, struct mg_str prefix);
#ifdef MG_MODULE_LINES
#line 1 "common/mbuf.h"
#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.
@@ -2489,22 +2146,6 @@ void mbuf_trim(struct mbuf *);
#ifdef MG_MODULE_LINES
#line 1 "common/cs_base64.h"
#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_
#define CS_COMMON_CS_BASE64_H_
@@ -2558,22 +2199,6 @@ int cs_base64_decode(const unsigned char *s, int len, char *dst, int *dec_len);
#ifdef MG_MODULE_LINES
#line 1 "common/str_util.h"
#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_
#define CS_COMMON_STR_UTIL_H_
@@ -3514,10 +3139,6 @@ struct { \
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_features.h"
#endif
-/*
- * Copyright (c) 2014-2016 Cesanta Software Limited
- * All rights reserved
- */
#ifndef CS_MONGOOSE_SRC_FEATURES_H_
#define CS_MONGOOSE_SRC_FEATURES_H_
@@ -3693,10 +3314,6 @@ struct { \
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_net_if.h"
#endif
-/*
- * Copyright (c) 2014-2016 Cesanta Software Limited
- * All rights reserved
- */
#ifndef CS_MONGOOSE_SRC_NET_IF_H_
#define CS_MONGOOSE_SRC_NET_IF_H_
@@ -3827,10 +3444,6 @@ double mg_mgr_min_timer(const struct mg_mgr *mgr);
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_ssl_if.h"
#endif
-/*
- * Copyright (c) 2014-2016 Cesanta Software Limited
- * All rights reserved
- */
#ifndef CS_MONGOOSE_SRC_SSL_IF_H_
#define CS_MONGOOSE_SRC_SSL_IF_H_
@@ -3844,7 +3457,7 @@ extern "C" {
struct mg_ssl_if_ctx;
struct mg_connection;
-void mg_ssl_if_init();
+void mg_ssl_if_init(void);
enum mg_ssl_if_result {
MG_SSL_OK = 0,
@@ -3885,22 +3498,6 @@ int mg_ssl_if_write(struct mg_connection *nc, const void *data, size_t len);
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_net.h"
#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 .
- *
- * 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 .
- */
/*
* === Core API: TCP/UDP/SSL
@@ -3997,9 +3594,6 @@ struct mg_connection {
struct mbuf send_mbuf; /* Data scheduled for sending */
time_t last_io_time; /* Timestamp of the last socket IO */
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 */
void *proto_data; /* Protocol-specific data */
void (*proto_data_destructor)(void *proto_data);
@@ -4032,16 +3626,25 @@ struct mg_connection {
/* Flags that are settable by user */
#define MG_F_SEND_AND_CLOSE (1 << 10) /* Push remaining data and close */
#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_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_3 (1 << 22)
#define MG_F_USER_4 (1 << 23)
#define MG_F_USER_5 (1 << 24)
#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 +4084,6 @@ double mg_time(void);
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_uri.h"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
/*
* === URI
@@ -4551,10 +4150,6 @@ int mg_normalize_uri_path(const struct mg_str *in, struct mg_str *out);
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_util.h"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
/*
* === Utility API
@@ -4769,10 +4364,6 @@ struct mg_str mg_url_encode(const struct mg_str src);
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_http.h"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
/*
* === Common API reference
@@ -4783,8 +4374,8 @@ struct mg_str mg_url_encode(const struct mg_str src);
#if MG_ENABLE_HTTP
-/* Amalgamated: #include "mg_net.h" */
/* Amalgamated: #include "common/mg_str.h" */
+/* Amalgamated: #include "mg_net.h" */
#ifdef __cplusplus
extern "C" {
@@ -4891,6 +4482,9 @@ struct mg_ssi_call_ctx {
#define MG_EV_HTTP_MULTIPART_REQUEST_END 125
#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.
* The user-defined event handler will receive following extra events:
@@ -5775,22 +5369,6 @@ int mg_http_create_digest_auth_header(char *buf, size_t buf_len,
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_mqtt.h"
#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 .
- *
- * 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 .
- */
/*
* === MQTT API reference
@@ -5878,10 +5456,10 @@ struct mg_mqtt_proto_data {
/* Message flags */
#define MG_MQTT_RETAIN 0x1
-#define MG_MQTT_DUP 0x4
#define MG_MQTT_QOS(qos) ((qos) << 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_DUP 0x8
/* Connection flags */
#define MG_MQTT_CLEAN_SESSION 0x02
@@ -6006,22 +5584,6 @@ int mg_mqtt_vmatch_topic_expression(const char *exp, struct mg_str topic);
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_mqtt_server.h"
#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 .
- *
- * 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 .
- */
/*
* === MQTT Server API reference
@@ -6113,10 +5675,6 @@ struct mg_mqtt_session *mg_mqtt_next(struct mg_mqtt_broker *brk,
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_dns.h"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
/*
* === DNS API reference
@@ -6239,6 +5797,7 @@ int mg_dns_encode_record(struct mbuf *io, struct mg_dns_resource_record *rr,
* Encodes a DNS name.
*/
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. */
int mg_parse_dns(const char *buf, int len, struct mg_dns_message *msg);
@@ -6280,10 +5839,6 @@ void mg_set_protocol_dns(struct mg_connection *nc);
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_dns_server.h"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
/*
* === DNS server API reference
@@ -6377,10 +5932,6 @@ void mg_dns_send_reply(struct mg_connection *nc, struct mg_dns_reply *r);
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_resolv.h"
#endif
-/*
- * Copyright (c) 2014 Cesanta Software Limited
- * All rights reserved
- */
/*
* === API reference
@@ -6461,22 +6012,6 @@ int mg_resolve_from_hosts_file(const char *host, union socket_address *usa);
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_coap.h"
#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 .
- *
- * 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 .
- */
/*
* === CoAP API reference
@@ -6629,10 +6164,6 @@ uint32_t mg_coap_compose(struct mg_coap_message *cm, struct mbuf *io);
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_sntp.h"
#endif
-/*
- * Copyright (c) 2016 Cesanta Software Limited
- * All rights reserved
- */
#ifndef CS_MONGOOSE_SRC_SNTP_H_
#define CS_MONGOOSE_SRC_SNTP_H_
@@ -6686,10 +6217,6 @@ struct mg_connection *mg_sntp_get_time(struct mg_mgr *mgr,
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_socks.h"
#endif
-/*
- * Copyright (c) 2017 Cesanta Software Limited
- * All rights reserved
- */
#ifndef CS_MONGOOSE_SRC_SOCKS_H_
#define CS_MONGOOSE_SRC_SOCKS_H_
diff --git a/src/mg_common.h b/src/mg_common.h
index f49335dd..9c04cb49 100644
--- a/src/mg_common.h
+++ b/src/mg_common.h
@@ -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 .
- *
- * 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 .
- */
-
#ifndef 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. */
#ifdef MG_LOCALS
diff --git a/src/mg_dns.c b/src/mg_dns.c
index 21bc8c23..0db0cb70 100644
--- a/src/mg_dns.c
+++ b/src/mg_dns.c
@@ -85,35 +85,39 @@ int mg_dns_copy_questions(struct mbuf *io, struct mg_dns_message *msg) {
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;
unsigned char n;
size_t pos = io->len;
do {
- if ((s = strchr(name, '.')) == NULL) {
- s = name + len;
+ if ((s = mg_strchr(name, '.')) == NULL) {
+ s = name.p + name.len;
}
- if (s - name > 127) {
+ if (s - name.p > 127) {
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, name, n);
+ mbuf_append(io, name.p, n);
- if (*s == '.') {
+ if (n < name.len && *s == '.') {
n++;
}
- name += n;
- len -= n;
- } while (*s != '\0');
+ name.p += n;
+ name.len -= n;
+ } while (name.len > 0);
mbuf_append(io, "\0", 1); /* Mark end of host name */
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,
const char *name, size_t nlen, const void *rdata,
size_t rlen) {
diff --git a/src/mg_dns.h b/src/mg_dns.h
index 8a76f58c..88d3c398 100644
--- a/src/mg_dns.h
+++ b/src/mg_dns.h
@@ -124,6 +124,7 @@ int mg_dns_encode_record(struct mbuf *io, struct mg_dns_resource_record *rr,
* Encodes a DNS name.
*/
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. */
int mg_parse_dns(const char *buf, int len, struct mg_dns_message *msg);
diff --git a/src/mg_http.c b/src/mg_http.c
index 2751d51d..6d159192 100644
--- a/src/mg_http.c
+++ b/src/mg_http.c
@@ -328,37 +328,53 @@ static const struct {
MIME_ENTRY("asf", "video/x-ms-asf"),
MIME_ENTRY("avi", "video/x-msvideo"),
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,
- const struct mg_serve_http_opts *opts) {
+static struct mg_str mg_get_mime_types_entry(struct mg_str path) {
+ 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;
- size_t i, path_len;
- struct mg_str r, k, v;
-
- path_len = strlen(path);
+ struct mg_str k, v;
overrides = opts->custom_mime_types;
while ((overrides = mg_next_comma_list_entry(overrides, &k, &v)) != NULL) {
- ext = path + (path_len - k.len);
- if (path_len > k.len && mg_vcasecmp(&k, ext) == 0) {
- return v;
+ ext = path.p + (path.len - k.len);
+ if (path.len > k.len && mg_vcasecmp(&k, ext) == 0) {
+ *type = v;
+ return 1;
}
}
- for (i = 0; mg_static_builtin_mime_types[i].extension != NULL; i++) {
- 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] == '.' &&
- mg_casecmp(ext, mg_static_builtin_mime_types[i].extension) == 0) {
- r.p = mg_static_builtin_mime_types[i].mime_type;
- r.len = strlen(r.p);
- return r;
+ *type = mg_get_mime_types_entry(path);
+
+ /* Check for .html.gz, .js.gz, etc. */
+ if (mg_vcmp(type, "application/x-gunzip") == 0) {
+ struct mg_str path2 = mg_mk_str_n(path.p, path.len - 3);
+ struct mg_str type2 = mg_get_mime_types_entry(path2);
+ 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;
- r.len = strlen(r.p);
- return r;
+ return (type->len > 0);
}
#endif
@@ -1458,12 +1474,15 @@ static int mg_http_parse_range_header(const struct mg_str *header, int64_t *a,
return result;
}
-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) {
+void mg_http_serve_file_internal(struct mg_connection *nc,
+ struct http_message *hm, const char *path,
+ 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);
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) {
int code, err = mg_get_errno();
switch (err) {
@@ -1502,8 +1521,9 @@ void mg_http_serve_file(struct mg_connection *nc, struct http_message *hm,
} else {
status_code = 206;
cl = r2 - r1 + 1;
- snprintf(range, sizeof(range), "Content-Range: bytes %" INT64_FMT
- "-%" INT64_FMT "/%" INT64_FMT "\r\n",
+ snprintf(range, sizeof(range),
+ "Content-Range: bytes %" INT64_FMT "-%" INT64_FMT
+ "/%" INT64_FMT "\r\n",
r1, r1 + cl - 1, (int64_t) st.st_size);
#if _FILE_OFFSET_BITS == 64 || _POSIX_C_SOURCE >= 200112L || \
_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_gmt_time_string(current_time, sizeof(current_time), &t);
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_printf(nc,
"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"
"Content-Length: %" SIZE_T_FMT
"\r\n"
- "%sEtag: %s\r\n\r\n",
+ "%s"
+ "Etag: %s\r\n",
current_time, last_modified, (int) mime_type.len, mime_type.p,
(pd->file.keepalive ? "keep-alive" : "close"), (size_t) cl, range,
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.type = DATA_FILE;
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,
struct http_message *hm,
struct mg_serve_http_opts *opts) {
@@ -1564,8 +1589,12 @@ static void mg_http_serve_file2(struct mg_connection *nc, const char *path,
return;
}
#endif
- mg_http_serve_file(nc, hm, path, mg_get_mime_type(path, "text/plain", opts),
- mg_mk_str(opts->extra_headers));
+ struct mg_str type = MG_NULL_STR, encoding = MG_NULL_STR;
+ 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
@@ -1841,7 +1870,7 @@ void cs_md5(char buf[33], ...) {
va_list ap;
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;
msg_lens[num_msgs] = va_arg(ap, size_t);
num_msgs++;
@@ -2472,13 +2501,13 @@ MG_INTERNAL int mg_uri_to_local_path(struct http_message *hm,
*p++ = DIRSEP;
/* No NULs and DIRSEPs in the component (percent-encoded). */
for (i = 0; i < component.len; i++, p++) {
- if (*p == '\0' || *p == DIRSEP
+ if (*p == '\0' ||
+ *p == DIRSEP
#ifdef _WIN32
/* On Windows, "/" is also accepted, so check for that too. */
- ||
- *p == '/'
+ || *p == '/'
#endif
- ) {
+ ) {
ok = 0;
break;
}
@@ -2691,7 +2720,9 @@ MG_INTERNAL void mg_send_http_file(struct mg_connection *nc, char *path,
mg_http_send_error(nc, 501, NULL);
#endif
} 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 {
mg_http_serve_file2(nc, index_file ? index_file : path, hm, opts);
}
@@ -2824,7 +2855,7 @@ void mg_file_upload_handler(struct mg_connection *nc, int ev, void *ev_data,
#ifdef SPIFFS_ERR_FULL
|| mg_get_errno() == SPIFFS_ERR_FULL
#endif
- ) {
+ ) {
mg_printf(nc,
"HTTP/1.1 413 Payload Too Large\r\n"
"Content-Type: text/plain\r\n"
@@ -2983,8 +3014,9 @@ struct mg_connection *mg_connect_http_opt(
if (path.len == 0) path = 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
- "\r\n%.*s%s\r\n%s",
+ mg_printf(nc,
+ "%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,
(int) (path.p - host.p), host.p, strlen(post_data), (int) auth.len,
(auth.buf == NULL ? "" : auth.buf), extra_headers, post_data);
@@ -3093,7 +3125,7 @@ static void mg_http_call_endpoint_handler(struct mg_connection *nc, int ev,
#if MG_ENABLE_HTTP_STREAMING_MULTIPART
|| ev == MG_EV_HTTP_MULTIPART_REQUEST
#endif
- ) {
+ ) {
struct mg_http_endpoint *ep =
mg_http_get_endpoint_handler(nc->listener, &hm->uri);
if (ep != NULL) {
diff --git a/src/mg_http.h b/src/mg_http.h
index 3be7656f..f368b2ed 100644
--- a/src/mg_http.h
+++ b/src/mg_http.h
@@ -12,8 +12,8 @@
#if MG_ENABLE_HTTP
-#include "mg_net.h"
#include "common/mg_str.h"
+#include "mg_net.h"
#ifdef __cplusplus
extern "C" {
@@ -120,6 +120,9 @@ struct mg_ssi_call_ctx {
#define MG_EV_HTTP_MULTIPART_REQUEST_END 125
#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.
* The user-defined event handler will receive following extra events:
diff --git a/src/mg_http_ssi.c b/src/mg_http_ssi.c
index 6d384db7..d1a95948 100644
--- a/src/mg_http_ssi.c
+++ b/src/mg_http_ssi.c
@@ -170,7 +170,7 @@ MG_INTERNAL void mg_handle_ssi_request(struct mg_connection *nc,
const char *path,
const struct mg_serve_http_opts *opts) {
FILE *fp;
- struct mg_str mime_type;
+ struct mg_str mime_type = MG_NULL_STR, encoding = MG_NULL_STR;
DBG(("%p %s", nc, path));
if ((fp = mg_fopen(path, "rb")) == NULL) {
@@ -178,12 +178,20 @@ MG_INTERNAL void mg_handle_ssi_request(struct mg_connection *nc,
} else {
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_printf(nc,
"Content-Type: %.*s\r\n"
- "Connection: close\r\n\r\n",
+ "Connection: close\r\n",
(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);
fclose(fp);
nc->flags |= MG_F_SEND_AND_CLOSE;
diff --git a/src/mg_license.h b/src/mg_license.h
new file mode 100644
index 00000000..484389d2
--- /dev/null
+++ b/src/mg_license.h
@@ -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 .
+ *
+ * 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 .
+ */
diff --git a/src/mg_mqtt.c b/src/mg_mqtt.c
index 9ab66bc6..06a3814d 100644
--- a/src/mg_mqtt.c
+++ b/src/mg_mqtt.c
@@ -10,6 +10,8 @@
#include "mg_internal.h"
#include "mg_mqtt.h"
+#define MG_F_MQTT_PING_PENDING MG_F_PROTO_1
+
static uint16_t getu16(const char *p) {
const uint8_t *up = (const uint8_t *) p;
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) {
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];
unsigned char lc = 0;
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_len++;
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;
@@ -172,6 +174,10 @@ static void mqtt_handler(struct mg_connection *nc, int ev,
}
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));
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 *) nc->proto_data;
double now = mg_time();
- if (pd->keep_alive > 0 && pd->last_control_time > 0 &&
- (now - pd->last_control_time) > pd->keep_alive) {
- LOG(LL_DEBUG, ("Send PINGREQ"));
- mg_mqtt_ping(nc);
+ if (pd->keep_alive > 0 && pd->last_control_time > 0) {
+ double diff = (now - pd->last_control_time);
+ if (diff > pd->keep_alive) {
+ 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;
}
diff --git a/src/mg_mqtt.h b/src/mg_mqtt.h
index 6067ccc4..31dad583 100644
--- a/src/mg_mqtt.h
+++ b/src/mg_mqtt.h
@@ -101,10 +101,10 @@ struct mg_mqtt_proto_data {
/* Message flags */
#define MG_MQTT_RETAIN 0x1
-#define MG_MQTT_DUP 0x4
#define MG_MQTT_QOS(qos) ((qos) << 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_DUP 0x8
/* Connection flags */
#define MG_MQTT_CLEAN_SESSION 0x02
diff --git a/src/mg_net.c b/src/mg_net.c
index 12c1b17c..ec2f5354 100644
--- a/src/mg_net.c
+++ b/src/mg_net.c
@@ -540,7 +540,7 @@ struct mg_connection *mg_if_accept_new_conn(struct mg_connection *lc) {
nc->iface = lc->iface;
if (lc->flags & MG_F_SSL) nc->flags |= MG_F_SSL;
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;
}
diff --git a/src/mg_net.h b/src/mg_net.h
index cbe75b4c..e6ff21ba 100644
--- a/src/mg_net.h
+++ b/src/mg_net.h
@@ -110,9 +110,6 @@ struct mg_connection {
struct mbuf send_mbuf; /* Data scheduled for sending */
time_t last_io_time; /* Timestamp of the last socket IO */
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 */
void *proto_data; /* Protocol-specific data */
void (*proto_data_destructor)(void *proto_data);
@@ -145,16 +142,25 @@ struct mg_connection {
/* Flags that are settable by user */
#define MG_F_SEND_AND_CLOSE (1 << 10) /* Push remaining data and close */
#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_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_3 (1 << 22)
#define MG_F_USER_4 (1 << 23)
#define MG_F_USER_5 (1 << 24)
#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
};
/*
diff --git a/src/mg_net_if_socket.c b/src/mg_net_if_socket.c
index 607e2b53..c7f7f59a 100644
--- a/src/mg_net_if_socket.c
+++ b/src/mg_net_if_socket.c
@@ -47,8 +47,8 @@ void mg_socket_if_connect_tcp(struct mg_connection *nc,
#endif
rc = connect(nc->sock, &sa->sa, sizeof(sa->sin));
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(),
- nc->err));
+ DBG(("%p sock %d rc %d errno %d err %d", nc, (int) nc->sock, rc,
+ mg_get_errno(), nc->err));
}
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 =
fd_flags != 0 || (nc->flags & (MG_F_WANT_READ | MG_F_WANT_WRITE));
if (worth_logging) {
- DBG(("%p fd=%d fd_flags=%d nc_flags=0x%lx rmbl=%d smbl=%d", nc, nc->sock,
- fd_flags, nc->flags, (int) nc->recv_mbuf.len,
+ DBG(("%p fd=%d fd_flags=%d nc_flags=0x%lx rmbl=%d smbl=%d", nc,
+ (int) nc->sock, fd_flags, nc->flags, (int) nc->recv_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 (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));
}
}
@@ -279,8 +279,7 @@ void mg_mgr_handle_conn(struct mg_connection *nc, int fd_flags, double now) {
#if MG_ENABLE_BROADCAST
static void mg_mgr_handle_ctl_sock(struct mg_mgr *mgr) {
struct ctl_msg ctl_msg;
- int len =
- (int) MG_RECV_FUNC(mgr->ctl[1], (char *) &ctl_msg, sizeof(ctl_msg), 0);
+ int len = (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);
DBG(("read %d from ctl socket", len));
(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_close_on_exec(sock);
nc->sock = sock;
- DBG(("%p %d", nc, sock));
+ DBG(("%p %d", nc, (int) sock));
}
void mg_socket_if_init(struct mg_iface *iface) {
diff --git a/src/mg_ssl_if.h b/src/mg_ssl_if.h
index 62f24b51..0ccd3f0a 100644
--- a/src/mg_ssl_if.h
+++ b/src/mg_ssl_if.h
@@ -15,7 +15,7 @@ extern "C" {
struct mg_ssl_if_ctx;
struct mg_connection;
-void mg_ssl_if_init();
+void mg_ssl_if_init(void);
enum mg_ssl_if_result {
MG_SSL_OK = 0,
diff --git a/src/mg_ssl_if_mbedtls.c b/src/mg_ssl_if_mbedtls.c
index 7640778f..d837481a 100644
--- a/src/mg_ssl_if_mbedtls.c
+++ b/src/mg_ssl_if_mbedtls.c
@@ -44,7 +44,11 @@ struct mg_ssl_if_ctx {
mbedtls_ssl_context *ssl;
mbedtls_x509_crt *cert;
mbedtls_pk_context *key;
+#ifdef MBEDTLS_X509_CA_CHAIN_ON_DISK
+ char *ca_chain_file;
+#else
mbedtls_x509_crt *ca_cert;
+#endif
struct mbuf cipher_suites;
size_t saved_len;
};
@@ -52,7 +56,7 @@ struct mg_ssl_if_ctx {
/* 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);
-void mg_ssl_if_init() {
+void mg_ssl_if_init(void) {
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);
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) {
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);
MG_FREE(ctx->ca_cert);
ctx->ca_cert = NULL;
}
+#endif
}
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);
MG_FREE(ctx->ssl);
}
- mg_ssl_if_mbed_free_certs_and_keys(ctx);
if (ctx->conf != NULL) {
mbedtls_ssl_config_free(ctx->conf);
MG_FREE(ctx->conf);
}
+ mg_ssl_if_mbed_free_certs_and_keys(ctx);
mbuf_free(&ctx->cipher_suites);
memset(ctx, 0, sizeof(*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);
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));
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) {
return MG_SSL_ERROR;
}
diff --git a/src/mg_ssl_if_openssl.c b/src/mg_ssl_if_openssl.c
index 98af8e29..c29a5448 100644
--- a/src/mg_ssl_if_openssl.c
+++ b/src/mg_ssl_if_openssl.c
@@ -21,7 +21,7 @@ struct mg_ssl_if_ctx {
size_t identity_len;
};
-void mg_ssl_if_init() {
+void mg_ssl_if_init(void) {
SSL_library_init();
}
diff --git a/test/unit_test.c b/test/unit_test.c
index 5eb919ca..43dd3eb7 100644
--- a/test/unit_test.c
+++ b/test/unit_test.c
@@ -4590,6 +4590,15 @@ static const char *test_dns_encode(void) {
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) {
/*
* 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);
#endif
RUN_TEST(test_dns_encode);
+ RUN_TEST(test_dns_encode_name);
RUN_TEST(test_dns_uncompress);
RUN_TEST(test_dns_decode);
RUN_TEST(test_dns_decode_truncated);
diff --git a/tools/amalgam.py b/tools/amalgam.py
index f40ca7cd..3d40d4b2 100755
--- a/tools/amalgam.py
+++ b/tools/amalgam.py
@@ -59,6 +59,7 @@ parser.add_argument('--exportable-headers', dest="export", action='store_true',
help='allow exporting internal headers')
parser.add_argument('-I', default=['.'], dest='include_path', help='include path', action='append')
parser.add_argument('sources', nargs='*', help='sources')
+parser.add_argument('--license', dest="license", help='License file')
class File(object):
def __init__(self, name, parent_name):
@@ -121,7 +122,22 @@ def emit_body(out, name, parent_name):
return
with open(resolved_name) as f:
+ in_comment = False
+ comment = ''
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):
+ print >>out, comment,
+ continue
+
+ if re.match('/\*$', l):
+ in_comment = True
+ comment = l
+ continue
+
match = re.match('( *#include "(.*)")', l)
if match:
all, path_to_include = match.groups()
@@ -155,6 +171,11 @@ if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
+
+if args.license:
+ with open(args.license) as f:
+ print f.read()
+
if args.public:
print '#include "%s"' % (args.public)