From: Gregory P. <gre...@gm...> - 2010-08-04 22:39:29
|
No authentication scheme is supported for now. Signed-off-by: Gregory Petrosyan <gre...@gm...> --- http.c | 22 +++++++++++++++++++--- http.h | 1 + 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/http.c b/http.c index 3e301a0..92851c4 100644 --- a/http.c +++ b/http.c @@ -141,11 +141,23 @@ int http_open(struct http_get *hg, int timeout_ms) struct timeval tv; int save, flags; - hostent = gethostbyname(hg->uri.host); + char *proxy = getenv("http_proxy"); + if (proxy) { + hg->proxy = xmalloc(sizeof(*hg->proxy)); + if (http_parse_uri(proxy, hg->proxy)) { + d_print("Failed to parse HTTP proxy URI '%s'\n", proxy); + return -1; + } + } else { + hg->proxy = NULL; + } + + hostent = gethostbyname(hg->proxy ? hg->proxy->host : hg->uri.host); if (hostent == NULL) return -1; + addr.in.sin_family = AF_INET; - addr.in.sin_port = htons(hg->uri.port); + addr.in.sin_port = htons(hg->proxy ? hg->proxy->port : hg->uri.port); memcpy(&addr.in.sin_addr, hostent->h_addr_list[0], hostent->h_length); hg->fd = socket(PF_INET, SOCK_STREAM, 0); @@ -370,7 +382,7 @@ int http_get(struct http_get *hg, struct keyval *headers, int timeout_ms) int i, rc, save; gbuf_add_str(&buf, "GET "); - gbuf_add_str(&buf, hg->uri.path); + gbuf_add_str(&buf, hg->proxy ? hg->uri.uri : hg->uri.path); gbuf_add_str(&buf, " HTTP/1.0\r\n"); for (i = 0; headers[i].key; i++) { gbuf_add_str(&buf, headers[i].key); @@ -424,6 +436,10 @@ char *http_read_body(int fd, size_t *size, int timeout_ms) void http_get_free(struct http_get *hg) { http_free_uri(&hg->uri); + if (hg->proxy) { + http_free_uri(hg->proxy); + free(hg->proxy); + } if (hg->headers) keyvals_free(hg->headers); free(hg->reason); diff --git a/http.h b/http.h index 8a863d4..460d41b 100644 --- a/http.h +++ b/http.h @@ -43,6 +43,7 @@ struct http_uri { struct http_get { struct http_uri uri; + struct http_uri *proxy; int fd; struct keyval *headers; char *reason; -- 1.7.0.4 |