@@ -1594,6 +1594,7 @@ size_t mg_vxprintf(void (*out)(char, void *), void *param, const char *fmt,
1594
1594
1595
1595
1596
1596
1597
+
1597
1598
struct mg_fd *mg_fs_open(struct mg_fs *fs, const char *path, int flags) {
1598
1599
struct mg_fd *fd = (struct mg_fd *) calloc(1, sizeof(*fd));
1599
1600
if (fd != NULL) {
@@ -2328,9 +2329,10 @@ void mg_http_bauth(struct mg_connection *c, const char *user,
2328
2329
}
2329
2330
2330
2331
struct mg_str mg_http_var(struct mg_str buf, struct mg_str name) {
2331
- struct mg_str k, v, result = mg_str_n(NULL, 0);
2332
- while (mg_split(&buf, &k, &v, '&')) {
2333
- 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) {
2334
2336
result = v;
2335
2337
break;
2336
2338
}
@@ -2719,7 +2721,7 @@ static struct mg_str s_known_types[] = {
2719
2721
// clang-format on
2720
2722
2721
2723
static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
2722
- struct mg_str k, v, s = mg_str(extra);
2724
+ struct mg_str entry, k, v, s = mg_str(extra);
2723
2725
size_t i = 0;
2724
2726
2725
2727
// Shrink path to its extension only
@@ -2728,8 +2730,8 @@ static struct mg_str guess_content_type(struct mg_str path, const char *extra) {
2728
2730
path.len = i;
2729
2731
2730
2732
// Process user-provided mime type overrides, if any
2731
- while (mg_commalist(& s, &k , &v )) {
2732
- if (mg_strcmp(path, k) == 0) return v;
2733
+ while (mg_span( s, &entry , &s, ',' )) {
2734
+ if (mg_span(entry, &k, &v, '=') && mg_strcmp(path, k) == 0) return v;
2733
2735
}
2734
2736
2735
2737
// Process built-in mime types
@@ -2745,7 +2747,7 @@ static int getrange(struct mg_str *s, size_t *a, size_t *b) {
2745
2747
for (i = 0; i + 6 < s->len; i++) {
2746
2748
struct mg_str k, v = mg_str_n(s->ptr + i + 6, s->len - i - 6);
2747
2749
if (memcmp(&s->ptr[i], "bytes=", 6) != 0) continue;
2748
- if (mg_split(& v, &k, NULL , '-')) {
2750
+ if (mg_span( v, &k, &v , '-')) {
2749
2751
if (mg_to_size_t(k, a)) numparsed++;
2750
2752
if (v.len > 0 && mg_to_size_t(v, b)) numparsed++;
2751
2753
} else {
@@ -3025,8 +3027,9 @@ static int uri_to_path(struct mg_connection *c, struct mg_http_message *hm,
3025
3027
const struct mg_http_serve_opts *opts, char *path,
3026
3028
size_t path_size) {
3027
3029
struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;
3028
- struct mg_str k, v, s = mg_str(opts->root_dir), u = {0, 0}, p = {0, 0};
3029
- while (mg_commalist(&s, &k, &v)) {
3030
+ struct mg_str k, v, part, s = mg_str(opts->root_dir), u = {NULL, 0}, p = u;
3031
+ while (mg_span(s, &part, &s, ',')) {
3032
+ if (!mg_span(part, &k, &v, '=')) k = part, v = mg_str_n(NULL, 0);
3030
3033
if (v.len == 0) v = k, k = mg_str("/"), u = k, p = v;
3031
3034
if (hm->uri.len < k.len) continue;
3032
3035
if (mg_strcmp(k, mg_str_n(hm->uri.ptr, k.len)) != 0) continue;
@@ -7000,7 +7003,7 @@ static void sntp_cb(struct mg_connection *c, int ev, void *ev_data) {
7000
7003
if (ev == MG_EV_READ) {
7001
7004
int64_t milliseconds = mg_sntp_parse(c->recv.buf, c->recv.len);
7002
7005
if (milliseconds > 0) {
7003
- MG_INFO (("%lu got time: %lld ms from epoch", c->id, milliseconds));
7006
+ MG_DEBUG (("%lu got time: %lld ms from epoch", c->id, milliseconds));
7004
7007
mg_call(c, MG_EV_SNTP_TIME, (uint64_t *) &milliseconds);
7005
7008
MG_VERBOSE(("%u.%u", (unsigned) (milliseconds / 1000),
7006
7009
(unsigned) (milliseconds % 1000)));
@@ -7992,31 +7995,13 @@ bool mg_globmatch(const char *s1, size_t n1, const char *s2, size_t n2) {
7992
7995
return mg_match(mg_str_n(s2, n2), mg_str_n(s1, n1), NULL);
7993
7996
}
7994
7997
7995
- static size_t mg_nce(const char *s, size_t n, size_t ofs, size_t *koff,
7996
- size_t *klen, size_t *voff, size_t *vlen, char delim) {
7997
- size_t kvlen, kl;
7998
- for (kvlen = 0; ofs + kvlen < n && s[ofs + kvlen] != delim;) kvlen++;
7999
- for (kl = 0; kl < kvlen && s[ofs + kl] != '=';) kl++;
8000
- if (koff != NULL) *koff = ofs;
8001
- if (klen != NULL) *klen = kl;
8002
- if (voff != NULL) *voff = kl < kvlen ? ofs + kl + 1 : 0;
8003
- if (vlen != NULL) *vlen = kl < kvlen ? kvlen - kl - 1 : 0;
8004
- ofs += kvlen + 1;
8005
- return ofs > n ? n : ofs;
8006
- }
8007
-
8008
- bool mg_split(struct mg_str *s, struct mg_str *k, struct mg_str *v, char sep) {
8009
- size_t koff = 0, klen = 0, voff = 0, vlen = 0, off = 0;
8010
- if (s->ptr == NULL || s->len == 0) return 0;
8011
- off = mg_nce(s->ptr, s->len, 0, &koff, &klen, &voff, &vlen, sep);
8012
- if (k != NULL) *k = mg_str_n(s->ptr + koff, klen);
8013
- if (v != NULL) *v = mg_str_n(s->ptr + voff, vlen);
8014
- *s = mg_str_n(s->ptr + off, s->len - off);
8015
- return off > 0;
8016
- }
8017
-
8018
- bool mg_commalist(struct mg_str *s, struct mg_str *k, struct mg_str *v) {
8019
- return mg_split(s, k, v, ',');
7998
+ bool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char sep) {
7999
+ size_t len = 0;
8000
+ while (len < s.len && s.ptr[len] != sep) len++; // Find separator
8001
+ if (a != NULL) *a = mg_str_n(s.ptr, len);
8002
+ if (b != NULL) *b = mg_str_n(s.ptr + len, s.len - len);
8003
+ if (b != NULL && len < s.len) b->ptr++, b->len--; // Separator found, skip it
8004
+ return s.len > 0;
8020
8005
}
8021
8006
8022
8007
char *mg_hex(const void *buf, size_t len, char *to) {
@@ -13868,18 +13853,18 @@ static int parse_net(const char *spec, uint32_t *net, uint32_t *mask) {
13868
13853
}
13869
13854
13870
13855
int mg_check_ip_acl(struct mg_str acl, struct mg_addr *remote_ip) {
13871
- struct mg_str k, v ;
13856
+ struct mg_str entry ;
13872
13857
int allowed = acl.len == 0 ? '+' : '-'; // If any ACL is set, deny by default
13873
13858
uint32_t remote_ip4;
13874
13859
if (remote_ip->is_ip6) {
13875
13860
return -1; // TODO(): handle IPv6 ACL and addresses
13876
13861
} else { // IPv4
13877
13862
memcpy((void *) &remote_ip4, remote_ip->ip, sizeof(remote_ip4));
13878
- while (mg_commalist(& acl, &k , &v )) {
13863
+ while (mg_span( acl, &entry , &acl, ',' )) {
13879
13864
uint32_t net, mask;
13880
- if (k .ptr[0] != '+' && k .ptr[0] != '-') return -1;
13881
- if (parse_net(&k .ptr[1], &net, &mask) == 0) return -2;
13882
- if ((mg_ntohl(remote_ip4) & mask) == net) allowed = k .ptr[0];
13865
+ if (entry .ptr[0] != '+' && entry .ptr[0] != '-') return -1;
13866
+ if (parse_net(&entry .ptr[1], &net, &mask) == 0) return -2;
13867
+ if ((mg_ntohl(remote_ip4) & mask) == net) allowed = entry .ptr[0];
13883
13868
}
13884
13869
}
13885
13870
return allowed == '+';
0 commit comments