1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-14 09:03:50 +01:00

Merge pull request #20655 from benpicco/nanocoap_link_format_get-fix

nanocoap_link_format: don't drop characters in fragmented entries
This commit is contained in:
Marian Buschsieweke 2024-05-08 05:52:10 +00:00 committed by GitHub
commit 19effe1020
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 14 deletions

View File

@ -58,16 +58,21 @@ static int _dirlist_cb(void *arg, size_t offset, uint8_t *buf, size_t len, int m
}
}
if (*c == ',' || ctx->cur == ctx->end) {
int res;
bool found_end = false;
if (*c == ',') {
found_end = true;
}
else {
*ctx->cur++ = *c;
}
if (found_end || ctx->cur == ctx->end) {
*ctx->cur = 0;
res = ctx->cb(ctx->buf, ctx->ctx);
int res = ctx->cb(ctx->buf, ctx->ctx);
ctx->cur = ctx->buf;
if (res < 0) {
return res;
}
} else {
*ctx->cur++ = *c;
}
}
@ -85,7 +90,7 @@ int nanocoap_link_format_get(nanocoap_sock_t *sock, const char *path,
char buffer[CONFIG_NANOCOAP_QS_MAX];
struct dir_list_ctx ctx = {
.buf = buffer,
.end = buffer + sizeof(buffer) - 1,
.end = buffer + sizeof(buffer),
.cur = buffer,
.cb = cb,
.ctx = arg,

View File

@ -52,16 +52,31 @@ static bool _is_dir(const char *url)
static int _resource_cb(char *entry, void *ctx)
{
(void)ctx;
bool *too_long = ctx;
char *start, *end;
char *start = strchr(entry, '<');
if (start) {
char *end = strchr(entry, '>');
*end = '\0';
entry = start + 1;
if (*too_long) {
goto find_end;
}
start = strchr(entry, '<');
if (start == NULL) {
return 0;
}
entry = start + 1;
find_end:
end = strchr(entry, '>');
if (end == NULL) {
*too_long = true;
printf("%s", entry);
}
else {
*too_long = false;
*end = '\0';
puts(entry);
}
puts(entry);
return 0;
}
@ -91,7 +106,8 @@ static int _nanocoap_get_handler(int argc, char **argv)
}
if (_is_dir(url) && argc < 3) {
res = nanocoap_link_format_get_url(url, _resource_cb, NULL);
bool _ctx = false;
res = nanocoap_link_format_get_url(url, _resource_cb, &_ctx);
if (res) {
printf("Request failed: %s\n", strerror(-res));
}