#include <ctype.h>
#include <unistd.h>
#include <stdint.h>
+#include <string.h>
#include <fcntl.h>
#include <libubox/ustream.h>
uh->auth_type = uclient_http_update_auth_type(uh);
}
+static bool uclient_request_supports_body(enum request_type req_type)
+{
+ switch (req_type) {
+ case REQ_POST:
+ case REQ_PUT:
+ case REQ_DELETE:
+ return true;
+ default:
+ return false;
+ }
+}
+
static void
uclient_http_add_auth_basic(struct uclient_http *uh)
{
{
uint32_t val = 0;
FILE *f;
+ size_t n;
f = fopen("/dev/urandom", "r");
if (f) {
- fread(&val, sizeof(val), 1, f);
+ n = fread(&val, sizeof(val), 1, f);
fclose(f);
+ if (n != 1)
+ return;
}
bin_to_hex(dest, &val, sizeof(val));
struct uclient_url *url = uh->uc.url;
struct blob_attr *cur;
enum request_type req_type = uh->req_type;
+ bool literal_ipv6;
int rem;
if (uh->state >= HTTP_STATE_HEADERS_SENT)
if (uh->uc.proxy_url)
url = uh->uc.proxy_url;
+ literal_ipv6 = strchr(url->host, ':');
+
ustream_printf(uh->us,
"%s %s HTTP/1.1\r\n"
- "Host: %s\r\n",
- request_types[req_type],
- url->location, url->host);
+ "Host: %s%s%s%s%s\r\n",
+ request_types[req_type], url->location,
+ literal_ipv6 ? "[" : "",
+ url->host,
+ literal_ipv6 ? "]" : "",
+ url->port ? ":" : "",
+ url->port ? url->port : "");
blobmsg_for_each_attr(cur, uh->headers.head, rem)
ustream_printf(uh->us, "%s: %s\r\n", blobmsg_name(cur), (char *) blobmsg_data(cur));
- if (uh->req_type == REQ_POST || uh->req_type == REQ_PUT)
+ if (uclient_request_supports_body(uh->req_type))
ustream_printf(uh->us, "Transfer-Encoding: chunked\r\n");
uclient_http_add_auth_header(uh);
return -1;
uclient_http_send_headers(uh);
- if (uh->req_type == REQ_POST || uh->req_type == REQ_PUT)
+ if (uclient_request_supports_body(uh->req_type))
ustream_printf(uh->us, "0\r\n\r\n");
uh->state = HTTP_STATE_REQUEST_DONE;
if (!tb)
return false;
- url = uclient_get_url(blobmsg_data(tb), url->auth);
+ url = uclient_get_url_location(url, blobmsg_data(tb));
if (!url)
return false;