@@ -2329,9 +2329,10 @@ void mg_http_bauth(struct mg_connection *c, const char *user,
2329
2329
}
2330
2330
2331
2331
struct mg_str mg_http_var(struct mg_str buf, struct mg_str name) {
2332
- struct mg_str k, v, result = mg_str_n(NULL, 0);
2333
- while (mg_split(&buf, &k, &v, '&')) {
2334
- if (name.len == k.len && mg_ncasecmp(name.ptr, k.ptr, k.len) == 0) {
2332
+ struct mg_str entry, k, v, result = mg_str_n(NULL, 0);
2333
+ while (mg_span(buf, &entry, &buf, '&')) {
2334
+ if (mg_span(entry, &k, &v, '=') && name.len == k.len &&
2335
+ mg_ncasecmp(name.ptr, k.ptr, k.len) == 0) {
2335
2336
result = v;
2336
2337
break;
2337
2338
}
@@ -2722,7 +2723,7 @@ static struct mg_str s_known_types[] = {
2722
2723
// clang-format on
2723
2724
2724
2725
static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
2725
- struct mg_str k, v, s = mg_str(extra);
2726
+ struct mg_str entry, k, v, s = mg_str(extra);
2726
2727
size_t i = 0;
2727
2728
2728
2729
// Shrink path to its extension only
@@ -2731,8 +2732,8 @@ static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
2731
2732
path.len = i;
2732
2733
2733
2734
// Process user-provided mime type overrides, if any
2734
- while (mg_commalist(& s, &k , &v )) {
2735
- if (mg_strcmp(path, k) == 0) return v;
2735
+ while (mg_span( s, &entry , &s, ',' )) {
2736
+ if (mg_span(entry, &k, &v, '=') && mg_strcmp(path, k) == 0) return v;
2736
2737
}
2737
2738
2738
2739
// Process built-in mime types
@@ -2748,7 +2749,7 @@ static int getrange(struct mg_str *s, size_t *a, size_t *b) {
2748
2749
for (i = 0; i + 6 < s->len; i++) {
2749
2750
struct mg_str k, v = mg_str_n(s->ptr + i + 6, s->len - i - 6);
2750
2751
if (memcmp(&s->ptr[i], "bytes=", 6) != 0) continue;
2751
- if (mg_split(& v, &k, NULL , '-')) {
2752
+ if (mg_span( v, &k, &v , '-')) {
2752
2753
if (mg_to_size_t(k, a)) numparsed++;
2753
2754
if (v.len > 0 && mg_to_size_t(v, b)) numparsed++;
2754
2755
} else {
@@ -3028,8 +3029,9 @@ static int uri_to_path(struct mg_connection *c, struct mg_http_message *hm,
3028
3029
const struct mg_http_serve_opts *opts, char *path,
3029
3030
size_t path_size) {
3030
3031
struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;
3031
- struct mg_str k, v, s = mg_str(opts->root_dir), u = {0, 0}, p = {0, 0};
3032
- while (mg_commalist(&s, &k, &v)) {
3032
+ struct mg_str k, v, part, s = mg_str(opts->root_dir), u = {NULL, 0}, p = u;
3033
+ while (mg_span(s, &part, &s, ',')) {
3034
+ if (!mg_span(part, &k, &v, '=')) k = part, v = mg_str_n(NULL, 0);
3033
3035
if (v.len == 0) v = k, k = mg_str("/"), u = k, p = v;
3034
3036
if (hm->uri.len < k.len) continue;
3035
3037
if (mg_strcmp(k, mg_str_n(hm->uri.ptr, k.len)) != 0) continue;
@@ -7011,7 +7013,7 @@ static void sntp_cb(struct mg_connection *c, int ev, void *ev_data) {
7011
7013
if (ev == MG_EV_READ) {
7012
7014
int64_t milliseconds = mg_sntp_parse(c->recv.buf, c->recv.len);
7013
7015
if (milliseconds > 0) {
7014
- MG_INFO (("%lu got time: %lld ms from epoch", c->id, milliseconds));
7016
+ MG_DEBUG (("%lu got time: %lld ms from epoch", c->id, milliseconds));
7015
7017
mg_call(c, MG_EV_SNTP_TIME, (uint64_t *) &milliseconds);
7016
7018
MG_VERBOSE(("%u.%u", (unsigned) (milliseconds / 1000),
7017
7019
(unsigned) (milliseconds % 1000)));
@@ -8003,31 +8005,13 @@ bool mg_globmatch(const char *s1, size_t n1, const char *s2, size_t n2) {
8003
8005
return mg_match(mg_str_n(s2, n2), mg_str_n(s1, n1), NULL);
8004
8006
}
8005
8007
8006
- static size_t mg_nce(const char *s, size_t n, size_t ofs, size_t *koff,
8007
- size_t *klen, size_t *voff, size_t *vlen, char delim) {
8008
- size_t kvlen, kl;
8009
- for (kvlen = 0; ofs + kvlen < n && s[ofs + kvlen] != delim;) kvlen++;
8010
- for (kl = 0; kl < kvlen && s[ofs + kl] != '=';) kl++;
8011
- if (koff != NULL) *koff = ofs;
8012
- if (klen != NULL) *klen = kl;
8013
- if (voff != NULL) *voff = kl < kvlen ? ofs + kl + 1 : 0;
8014
- if (vlen != NULL) *vlen = kl < kvlen ? kvlen - kl - 1 : 0;
8015
- ofs += kvlen + 1;
8016
- return ofs > n ? n : ofs;
8017
- }
8018
-
8019
- bool mg_split(struct mg_str *s, struct mg_str *k, struct mg_str *v, char sep) {
8020
- size_t koff = 0, klen = 0, voff = 0, vlen = 0, off = 0;
8021
- if (s->ptr == NULL || s->len == 0) return 0;
8022
- off = mg_nce(s->ptr, s->len, 0, &koff, &klen, &voff, &vlen, sep);
8023
- if (k != NULL) *k = mg_str_n(s->ptr + koff, klen);
8024
- if (v != NULL) *v = mg_str_n(s->ptr + voff, vlen);
8025
- *s = mg_str_n(s->ptr + off, s->len - off);
8026
- return off > 0;
8027
- }
8028
-
8029
- bool mg_commalist(struct mg_str *s, struct mg_str *k, struct mg_str *v) {
8030
- return mg_split(s, k, v, ',');
8008
+ bool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char sep) {
8009
+ size_t len = 0;
8010
+ while (len < s.len && s.ptr[len] != sep) len++; // Find separator
8011
+ if (a != NULL) *a = mg_str_n(s.ptr, len);
8012
+ if (b != NULL) *b = mg_str_n(s.ptr + len, s.len - len);
8013
+ if (b != NULL && b->ptr && len < s.len) b->ptr++, b->len--; // Skip separator
8014
+ return s.len > 0;
8031
8015
}
8032
8016
8033
8017
char *mg_hex(const void *buf, size_t len, char *to) {
@@ -13880,18 +13864,18 @@ static int parse_net(const char *spec, uint32_t *net, uint32_t *mask) {
13880
13864
}
13881
13865
13882
13866
int mg_check_ip_acl(struct mg_str acl, struct mg_addr *remote_ip) {
13883
- struct mg_str k, v ;
13867
+ struct mg_str entry ;
13884
13868
int allowed = acl.len == 0 ? '+' : '-'; // If any ACL is set, deny by default
13885
13869
uint32_t remote_ip4;
13886
13870
if (remote_ip->is_ip6) {
13887
13871
return -1; // TODO(): handle IPv6 ACL and addresses
13888
13872
} else { // IPv4
13889
13873
memcpy((void *) &remote_ip4, remote_ip->ip, sizeof(remote_ip4));
13890
- while (mg_commalist(& acl, &k , &v )) {
13874
+ while (mg_span( acl, &entry , &acl, ',' )) {
13891
13875
uint32_t net, mask;
13892
- if (k .ptr[0] != '+' && k .ptr[0] != '-') return -1;
13893
- if (parse_net(&k .ptr[1], &net, &mask) == 0) return -2;
13894
- if ((mg_ntohl(remote_ip4) & mask) == net) allowed = k .ptr[0];
13876
+ if (entry .ptr[0] != '+' && entry .ptr[0] != '-') return -1;
13877
+ if (parse_net(&entry .ptr[1], &net, &mask) == 0) return -2;
13878
+ if ((mg_ntohl(remote_ip4) & mask) == net) allowed = entry .ptr[0];
13895
13879
}
13896
13880
}
13897
13881
return allowed == '+';
0 commit comments