X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuclient.git;a=blobdiff_plain;f=uclient.c;h=4c85e800cd30de398c15ed2104fc20b24b4e4495;hp=5f27ec9bb06782ff5633b3dc10b88c431fda9d09;hb=8bbe2130890db78856bb5731fa3e16a71d549bfe;hpb=05df41f861b3b492221489423bc80360a21582da diff --git a/uclient.c b/uclient.c index 5f27ec9..4c85e80 100644 --- a/uclient.c +++ b/uclient.c @@ -3,7 +3,8 @@ #include "uclient-utils.h" #include "uclient-backend.h" -static struct uclient_url *uclient_get_url(const char *url_str) +struct uclient_url __hidden * +uclient_get_url(const char *url_str, const char *auth_str) { static const struct uclient_backend *backends[] = { &uclient_backend_http, @@ -12,8 +13,9 @@ static struct uclient_url *uclient_get_url(const char *url_str) const struct uclient_backend *backend; const char * const *prefix = NULL; struct uclient_url *url; - char *url_buf, *next; - int i; + const char *location; + char *host_buf, *uri_buf, *auth_buf, *next; + int i, host_len; for (i = 0; i < ARRAY_SIZE(backends); i++) { int prefix_len = 0; @@ -36,30 +38,40 @@ static struct uclient_url *uclient_get_url(const char *url_str) if (!*prefix) return NULL; - url = calloc_a(sizeof(*url), &url_buf, strlen(url_str) + 1); - url->backend = backend; - strcpy(url_buf, url_str); - - next = strchr(url_buf, '/'); + next = strchr(url_str, '/'); if (next) { - *next = 0; - url->location = next + 1; + location = next; + host_len = next - url_str; } else { - url->location = "/"; + location = "/"; + host_len = strlen(url_str); } - url->host = url_buf; - next = strchr(url_buf, '@'); + url = calloc_a(sizeof(*url), + &host_buf, host_len + 1, + &uri_buf, strlen(location) + 1, + &auth_buf, auth_str ? strlen(auth_str) + 1 : 0); + + url->backend = backend; + url->location = strcpy(uri_buf, location); + url->prefix = prefix - backend->prefix; + + url->host = strncpy(host_buf, url_str, host_len); + + next = strchr(host_buf, '@'); if (next) { *next = 0; url->host = next + 1; - if (uclient_urldecode(url_buf, url_buf, false) < 0) + if (uclient_urldecode(host_buf, host_buf, false) < 0) goto free; - url->auth = url_buf; + url->auth = host_buf; } + if (!url->auth && auth_str) + url->auth = strcpy(auth_buf, auth_str); + /* Literal IPv6 address */ if (*url->host == '[') { url->host++; @@ -88,7 +100,7 @@ struct uclient *uclient_new(const char *url_str, const struct uclient_cb *cb) struct uclient *cl; struct uclient_url *url; - url = uclient_get_url(url_str); + url = uclient_get_url(url_str, NULL); if (!url) return NULL; @@ -109,7 +121,7 @@ int uclient_connect_url(struct uclient *cl, const char *url_str) const struct uclient_backend *backend = cl->backend; if (url_str) { - url = uclient_get_url(url_str); + url = uclient_get_url(url_str, NULL); if (!url) return -1; @@ -178,7 +190,7 @@ static void uclient_backend_change_state(struct uclient *cl) uloop_timeout_set(&cl->timeout, 1); } -void uclient_backend_set_error(struct uclient *cl) +void __hidden uclient_backend_set_error(struct uclient *cl) { if (cl->error) return;