nginx-0.0.1-2003-03-25-18:40:51 import
diff --git a/src/http/modules/ngx_http_event_proxy_handler.c b/src/http/modules/ngx_http_event_proxy_handler.c
index ac475e3..d283628 100644
--- a/src/http/modules/ngx_http_event_proxy_handler.c
+++ b/src/http/modules/ngx_http_event_proxy_handler.c
@@ -1157,6 +1157,7 @@
{
ngx_http_proxy_conf_t *lcf = (ngx_http_proxy_conf_t *) conf;
char *url;
+ struct hostent *h;
ngx_str_t *value;
ngx_http_proxy_pass_t *pass;
@@ -1166,16 +1167,87 @@
ngx_test_null(pass, ngx_push_array(lcf->proxy_pass), NGX_CONF_ERROR);
if (ngx_strncasecmp(url, "http://", 7) == 0) {
- "invalid prefix in URL %s", url;
+ /* STUB: "invalid prefix in URL %s", url */
+ return "invalid prefix";
}
err = ngx_http_proxy_parse_upstream(url, u);
if (err) {
- "%s %s", err, url;
+ /* STUB: "%s %s", err, url */
+ return err;
}
- h = ngx_gethostbyname(cmd->pool, u->host);
+ if (u.port == 0) {
+ u.port = 80;
+ }
+
+ ngx_test_null(host, ngx_palloc(cf->pool, u.host.len + 1), NGX_CONF_ERROR);
+ ngx_cpystr(host, u.host.data, u.host.len + 1);
+
+ addr.sin_addr.s_addr = inet_addr(host);
+ if (addr.sin_addr.s_addr == INADDR_NONE) {
+ h = gethostbyname(host);
+
+ if (h == NULL || h->h_addr_list[0] == NULL) {
+ /* STUB: "host %s not found", host */
+ return "host not found";
+ }
+
+ for (i = 0; h->h_addr_list[i] != NULL; i++) {
+ /* void */
+ }
+
+ /* MP: ngx_shared_palloc() */
+
+ ngx_test_null(upstreams,
+ ngx_palloc(cf->pool,
+ sizeof(ngx_http_proxy_upstreams_t)
+ + sizeof(ngx_http_proxy_upstream_t) * (i - 1)),
+ NGX_CONF_ERROR);
+
+ upstreams->num = i;
+
+ for (i = 0; h->h_addr_list[i] != NULL; i++) {
+ upstreams->u[i].host.data = host;
+ upstreams->u[i].host.len = u.host.len;
+ upstreams->u[i].addr = *(struct in_addr *)(h->h_addr_list[i]);
+ upstreams->u[i].port = u.port;
+
+ len = INET_ADDRSTRLEN + u.port_name.len + 1;
+ ngx_test_null(upstreams->u[i].addr_port_name.data,
+ ngx_palloc(cf->pool, len),
+ NGX_CONF_ERROR);
+
+ s = (ngx_inet_ntop(AF_INET,
+ upstreams->u[i].addr,
+ upstreams->u[i].addr_port_name.data,
+ len),
+
+ upstreams->u[i].addr_port_name.data[s++] = ':';
+
+ ngx_cpystrn(upstreams->u[i].addr_port_name.data[s],
+ u.port_name.data,
+ u.port_name.len + 1);
+
+ upstreams->u[i].addr_port_name.len = s + u.port_name.len + 1;
+ }
+
+ } else {
+
+ /* MP: ngx_shared_palloc() */
+
+ ngx_test_null(upstreams,
+ ngx_palloc(cf->pool, sizeof(ngx_http_proxy_upstreams_t),
+ NGX_CONF_ERROR);
+
+ upstreams->num = 1;
+
+ upstreams->u[0].host.data = host;
+ upstreams->u[0].host.len = u.host.len;
+ upstreams->u[0].addr = *(struct in_addr *)(h->h_addr_list[i]);
+ upstreams->u[0].port = u.port;
+ }
return NULL;
}