mirror of
https://github.com/owntone/owntone-server.git
synced 2025-04-24 04:20:35 -04:00
[httpd] Wip fixing up
This commit is contained in:
parent
e6033be8f4
commit
22838516aa
@ -1,4 +1,5 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <evhtp.h>
|
#include <evhtp.h>
|
||||||
|
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
@ -17,6 +18,7 @@ struct httpd_uri_parsed
|
|||||||
{
|
{
|
||||||
evhtp_uri_t *ev_uri;
|
evhtp_uri_t *ev_uri;
|
||||||
bool ev_uri_is_standalone; // true if ev_uri was allocated without a request, but via _fromuri
|
bool ev_uri_is_standalone; // true if ev_uri was allocated without a request, but via _fromuri
|
||||||
|
unsigned char *path_parts_buffer; // Allocated to hold the path parts in one buffer
|
||||||
httpd_uri_path_parts path_parts;
|
httpd_uri_path_parts path_parts;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -41,7 +43,12 @@ httpd_query_iterate(httpd_query *query, httpd_query_iteratecb cb, void *arg)
|
|||||||
void
|
void
|
||||||
httpd_query_clear(httpd_query *query)
|
httpd_query_clear(httpd_query *query)
|
||||||
{
|
{
|
||||||
evhtp_kvs_free(query);
|
evhtp_kv_t *param;
|
||||||
|
|
||||||
|
TAILQ_FOREACH(param, query, next)
|
||||||
|
{
|
||||||
|
evhtp_kv_rm_and_free(query, param);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
@ -59,13 +66,19 @@ httpd_header_remove(httpd_headers *headers, const char *key)
|
|||||||
void
|
void
|
||||||
httpd_header_add(httpd_headers *headers, const char *key, const char *val)
|
httpd_header_add(httpd_headers *headers, const char *key, const char *val)
|
||||||
{
|
{
|
||||||
evhtp_headers_add_header(headers, evhtp_header_new(key, val, 1, 1)); // Copy key/val
|
evhtp_header_t *header = evhtp_header_new(key, val, 1, 1); // 1, 1 = Copy key/val
|
||||||
|
evhtp_headers_add_header(headers, header);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
httpd_headers_clear(httpd_headers *headers)
|
httpd_headers_clear(httpd_headers *headers)
|
||||||
{
|
{
|
||||||
evhtp_headers_free(headers);
|
evhtp_kv_t *param;
|
||||||
|
|
||||||
|
TAILQ_FOREACH(param, headers, next)
|
||||||
|
{
|
||||||
|
evhtp_kv_rm_and_free(headers, param);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -213,7 +226,10 @@ httpd_backend_uri_get(httpd_backend *backend, httpd_backend_data *backend_data)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
free(backend_data->uri);
|
free(backend_data->uri);
|
||||||
backend_data->uri = safe_asprintf("%s?%s", uri->path->full, (char *)uri->query_raw);
|
if (backend->uri->query_raw)
|
||||||
|
backend_data->uri = safe_asprintf("%s?%s", uri->path->full, backend->uri->query_raw);
|
||||||
|
else
|
||||||
|
backend_data->uri = safe_asprintf("%s", uri->path->full);
|
||||||
|
|
||||||
return (const char *)backend_data->uri;
|
return (const char *)backend_data->uri;
|
||||||
}
|
}
|
||||||
@ -250,6 +266,7 @@ httpd_backend_peer_get(const char **addr, uint16_t *port, httpd_backend *backend
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
naddr.sa = *conn->saddr;
|
naddr.sa = *conn->saddr;
|
||||||
|
|
||||||
net_address_get(backend_data->peer_address, sizeof(backend_data->peer_address), &naddr);
|
net_address_get(backend_data->peer_address, sizeof(backend_data->peer_address), &naddr);
|
||||||
net_port_get(&backend_data->peer_port, &naddr);
|
net_port_get(&backend_data->peer_port, &naddr);
|
||||||
|
|
||||||
@ -283,44 +300,54 @@ httpd_backend_method_get(enum httpd_methods *method, httpd_backend *backend)
|
|||||||
void
|
void
|
||||||
httpd_backend_preprocess(httpd_backend *backend)
|
httpd_backend_preprocess(httpd_backend *backend)
|
||||||
{
|
{
|
||||||
|
// nothing to do here
|
||||||
}
|
}
|
||||||
|
|
||||||
httpd_uri_parsed *
|
httpd_uri_parsed *
|
||||||
httpd_uri_parsed_create(httpd_backend *backend)
|
httpd_uri_parsed_create(httpd_backend *backend)
|
||||||
{
|
{
|
||||||
httpd_uri_parsed *parsed;
|
httpd_uri_parsed *parsed = NULL;
|
||||||
char *path = NULL;
|
char *path = NULL;
|
||||||
|
size_t path_len;
|
||||||
char *path_part;
|
char *path_part;
|
||||||
size_t path_part_len;
|
off_t path_part_offset;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
unsigned char *unescaped_part;
|
unsigned char *unescaped_part;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (!backend->uri->path->path) // Not sure if this can happen
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
path_len = strlen(backend->uri->path->path);
|
||||||
|
if (path_len == 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
path = strdup(backend->uri->path->path);
|
||||||
|
if (!path)
|
||||||
|
goto error;
|
||||||
|
|
||||||
parsed = calloc(1, sizeof(struct httpd_uri_parsed));
|
parsed = calloc(1, sizeof(struct httpd_uri_parsed));
|
||||||
if (!parsed)
|
if (!parsed)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
parsed->ev_uri = backend->uri;
|
// Pointers of parsed->path_parts will point into this buffer, so it will hold
|
||||||
|
// the uri decoded path parts separated by zeroes
|
||||||
path = strdup(parsed->ev_uri->path->path);
|
parsed->path_parts_buffer = calloc(1, path_len + 1);
|
||||||
if (!path)
|
if (!parsed->path_parts_buffer)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
parsed->ev_uri = backend->uri;
|
||||||
|
|
||||||
path_part = strtok_r(path, "/", &ptr);
|
path_part = strtok_r(path, "/", &ptr);
|
||||||
|
path_part_offset = path_part - path;
|
||||||
for (i = 0; (i < ARRAY_SIZE(parsed->path_parts) && path_part); i++)
|
for (i = 0; (i < ARRAY_SIZE(parsed->path_parts) && path_part); i++)
|
||||||
{
|
{
|
||||||
path_part_len = strlen(path_part);
|
|
||||||
unescaped_part = calloc(1, path_part_len + 1);
|
|
||||||
if (!unescaped_part)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
// libevhtp's evhtp_unescape_string() is wonky (and feels unsafe...), for
|
// libevhtp's evhtp_unescape_string() is wonky (and feels unsafe...), for
|
||||||
// some reason it wants a double pointer to a user allocated buffer. We
|
// some reason it wants a double pointer to a user allocated buffer.
|
||||||
// don't want to lose the buffer if libevhtp modifies the pointer, so we
|
unescaped_part = parsed->path_parts_buffer + (path_part - path) - path_part_offset;
|
||||||
// do this first.
|
|
||||||
parsed->path_parts[i] = (char *)unescaped_part;
|
parsed->path_parts[i] = (char *)unescaped_part;
|
||||||
|
|
||||||
evhtp_unescape_string(&unescaped_part, (unsigned char *)path_part, path_part_len);
|
evhtp_unescape_string(&unescaped_part, (unsigned char *)path_part, strlen(path_part));
|
||||||
path_part = strtok_r(NULL, "/", &ptr);
|
path_part = strtok_r(NULL, "/", &ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -332,6 +359,7 @@ httpd_uri_parsed_create(httpd_backend *backend)
|
|||||||
return parsed;
|
return parsed;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
httpd_uri_parsed_free(parsed);
|
||||||
free(path);
|
free(path);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -345,12 +373,13 @@ httpd_uri_parsed_create_fromuri(const char *uri)
|
|||||||
void
|
void
|
||||||
httpd_uri_parsed_free(httpd_uri_parsed *parsed)
|
httpd_uri_parsed_free(httpd_uri_parsed *parsed)
|
||||||
{
|
{
|
||||||
int i;
|
if (!parsed)
|
||||||
|
return;
|
||||||
// if (parsed->ev_uri_is_standalone)
|
// if (parsed->ev_uri_is_standalone)
|
||||||
// free ev_uri;
|
// free ev_uri;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(parsed->path_parts); i++)
|
free(parsed->path_parts_buffer);
|
||||||
free(parsed->path_parts[i]);
|
free(parsed);
|
||||||
}
|
}
|
||||||
|
|
||||||
httpd_query *
|
httpd_query *
|
||||||
|
Loading…
x
Reference in New Issue
Block a user