Skip to content

Commit 774f071

Browse files
authored
Merge pull request chobits#104 from chobits/for_pull_request
refactor logic: add ngx_http_proxy_connect_create_peer() function
2 parents 854ff61 + f30c309 commit 774f071

File tree

1 file changed

+65
-78
lines changed

1 file changed

+65
-78
lines changed

ngx_http_proxy_connect_module.c

Lines changed: 65 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ static void ngx_http_proxy_connect_variable_set_time(ngx_http_request_t *r,
110110
ngx_http_variable_value_t *v, uintptr_t data);
111111
static ngx_int_t ngx_http_proxy_connect_sock_ntop(ngx_http_request_t *r,
112112
ngx_http_proxy_connect_upstream_t *u);
113+
static ngx_int_t ngx_http_proxy_connect_create_peer(ngx_http_request_t *r,
114+
ngx_http_upstream_resolved_t *ur);
113115

114116

115117

@@ -237,6 +239,12 @@ static ngx_http_variable_t ngx_http_proxy_connect_vars[] = {
237239

238240
#if 1
239241

242+
#if defined(nginx_version) && nginx_version >= 1005008
243+
#define __ngx_sock_ntop ngx_sock_ntop
244+
#else
245+
#define __ngx_sock_ntop(sa, slen, p, len, port) ngx_sock_ntop(sa, p, len, port)
246+
#endif
247+
240248
/*
241249
* #if defined(nginx_version) && nginx_version <= 1009015
242250
*
@@ -1019,19 +1027,15 @@ ngx_http_proxy_connect_process_connect(ngx_http_request_t *r,
10191027
static void
10201028
ngx_http_proxy_connect_resolve_handler(ngx_resolver_ctx_t *ctx)
10211029
{
1022-
u_char *p;
1023-
ngx_int_t i, len;
10241030
ngx_connection_t *c;
1025-
#if defined(nginx_version) && nginx_version >= 1005008
1026-
socklen_t socklen;
1027-
struct sockaddr *sockaddr;
1028-
#else
1029-
struct sockaddr_in *sin;
1030-
#endif
10311031
ngx_http_request_t *r;
10321032
ngx_http_upstream_resolved_t *ur;
10331033
ngx_http_proxy_connect_upstream_t *u;
10341034

1035+
#if defined(nginx_version) && nginx_version >= 1013002
1036+
ngx_uint_t run_posted = ctx->async;
1037+
#endif
1038+
10351039
u = ctx->data;
10361040
r = u->request;
10371041
ur = u->resolved;
@@ -1056,14 +1060,10 @@ ngx_http_proxy_connect_resolve_handler(ngx_resolver_ctx_t *ctx)
10561060
#if (NGX_DEBUG)
10571061
{
10581062
# if defined(nginx_version) && nginx_version >= 1005008
1059-
u_char text[NGX_SOCKADDR_STRLEN];
1060-
ngx_str_t addr;
1061-
# else
1062-
in_addr_t addr;
1063-
# endif
10641063
ngx_uint_t i;
1064+
ngx_str_t addr;
1065+
u_char text[NGX_SOCKADDR_STRLEN];
10651066

1066-
# if defined(nginx_version) && nginx_version >= 1005008
10671067
addr.data = text;
10681068

10691069
for (i = 0; i < ctx->naddrs; i++) {
@@ -1074,6 +1074,9 @@ ngx_http_proxy_connect_resolve_handler(ngx_resolver_ctx_t *ctx)
10741074
"name was resolved to %V", &addr);
10751075
}
10761076
# else
1077+
ngx_uint_t i;
1078+
in_addr_t addr;
1079+
10771080
for (i = 0; i < ctx->naddrs; i++) {
10781081
addr = ntohl(ctx->addrs[i]);
10791082

@@ -1086,30 +1089,47 @@ ngx_http_proxy_connect_resolve_handler(ngx_resolver_ctx_t *ctx)
10861089
}
10871090
#endif
10881091

1089-
if (ur->naddrs == 0) {
1090-
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
1091-
"%V could not be resolved", &ctx->name);
1092-
1093-
ngx_http_proxy_connect_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);
1092+
if (ngx_http_proxy_connect_create_peer(r, ur) != NGX_OK) {
1093+
ngx_http_proxy_connect_finalize_request(r, u,
1094+
NGX_HTTP_INTERNAL_SERVER_ERROR);
10941095
goto failed;
10951096
}
10961097

1097-
if (ur->naddrs == 1) {
1098-
i = 0;
1098+
ngx_resolve_name_done(ctx);
1099+
ur->ctx = NULL;
10991100

1100-
} else {
1101-
i = ngx_random() % ur->naddrs;
1101+
ngx_http_proxy_connect_process_connect(r, u);
1102+
1103+
failed:
1104+
1105+
#if defined(nginx_version) && nginx_version >= 1013002
1106+
if (run_posted) {
1107+
ngx_http_run_posted_requests(c);
11021108
}
1109+
#else
1110+
ngx_http_run_posted_requests(c);
1111+
#endif
1112+
}
1113+
1114+
1115+
static ngx_int_t
1116+
ngx_http_proxy_connect_create_peer(ngx_http_request_t *r,
1117+
ngx_http_upstream_resolved_t *ur)
1118+
{
1119+
u_char *p;
1120+
ngx_int_t i, len;
1121+
socklen_t socklen;
1122+
struct sockaddr *sockaddr;
1123+
1124+
i = ngx_random() % ur->naddrs; /* i<-0 for ur->naddrs == 1 */
11031125

11041126
#if defined(nginx_version) && nginx_version >= 1005008
1127+
11051128
socklen = ur->addrs[i].socklen;
11061129

11071130
sockaddr = ngx_palloc(r->pool, socklen);
11081131
if (sockaddr == NULL) {
1109-
ngx_http_proxy_connect_finalize_request(r, u,
1110-
NGX_HTTP_INTERNAL_SERVER_ERROR);
1111-
1112-
return;
1132+
return NGX_ERROR;
11131133
}
11141134

11151135
ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);
@@ -1124,57 +1144,37 @@ ngx_http_proxy_connect_resolve_handler(ngx_resolver_ctx_t *ctx)
11241144
((struct sockaddr_in *) sockaddr)->sin_port = htons(ur->port);
11251145
}
11261146

1127-
p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);
1128-
if (p == NULL) {
1129-
ngx_http_proxy_connect_finalize_request(r, u,
1130-
NGX_HTTP_INTERNAL_SERVER_ERROR);
1131-
1132-
return;
1133-
}
1134-
1135-
len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);
1136-
ur->sockaddr = sockaddr;
1137-
ur->socklen = socklen;
1138-
11391147
#else
11401148
/* for nginx older than 1.5.8 */
11411149

1142-
len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
1143-
1144-
p = ngx_pnalloc(r->pool, len + sizeof(struct sockaddr_in));
1145-
if (p == NULL) {
1146-
ngx_http_proxy_connect_finalize_request(r, u,
1147-
NGX_HTTP_INTERNAL_SERVER_ERROR);
1150+
socklen = sizeof(struct sockaddr_in);
11481151

1149-
return;
1152+
sockaddr = ngx_pcalloc(r->pool, socklen);
1153+
if (sockaddr == NULL) {
1154+
return NGX_ERROR;
11501155
}
11511156

1152-
sin = (struct sockaddr_in *) &p[len];
1153-
ngx_memzero(sin, sizeof(struct sockaddr_in));
1157+
((struct sockaddr_in *) sockaddr)->sin_family = AF_INET;
1158+
((struct sockaddr_in *) sockaddr)->sin_addr.s_addr = ur->addrs[i];
1159+
((struct sockaddr_in *) sockaddr)->sin_port = htons(ur->port);
1160+
1161+
#endif
11541162

1155-
len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN);
1156-
len = ngx_sprintf(&p[len], ":%d", ur->port) - p;
1163+
p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);
1164+
if (p == NULL) {
1165+
return NGX_ERROR;
1166+
}
11571167

1158-
sin->sin_family = AF_INET;
1159-
sin->sin_port = htons(ur->port);
1160-
sin->sin_addr.s_addr = ur->addrs[i];
1168+
len = __ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);
11611169

1162-
ur->sockaddr = (struct sockaddr *) sin;
1163-
ur->socklen = sizeof(struct sockaddr_in);
1164-
#endif
1170+
ur->sockaddr = sockaddr;
1171+
ur->socklen = socklen;
11651172

11661173
ur->host.data = p;
11671174
ur->host.len = len;
11681175
ur->naddrs = 1;
11691176

1170-
ngx_resolve_name_done(ctx);
1171-
ur->ctx = NULL;
1172-
1173-
ngx_http_proxy_connect_process_connect(r, u);
1174-
1175-
failed:
1176-
1177-
ngx_http_run_posted_requests(c);
1177+
return NGX_OK;
11781178
}
11791179

11801180

@@ -1516,26 +1516,13 @@ ngx_http_proxy_connect_sock_ntop(ngx_http_request_t *r,
15161516

15171517
/* fix u->resolved->host to "<address:port>" format */
15181518

1519-
#if defined(nginx_version) && nginx_version >= 1005008
15201519
p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);
15211520
if (p == NULL) {
15221521
return NGX_HTTP_INTERNAL_SERVER_ERROR;
15231522
}
15241523

1525-
len = ngx_sock_ntop(ur->sockaddr, ur->socklen, p, NGX_SOCKADDR_STRLEN, 1);
1526-
#else
1527-
/* for nginx older than 1.5.8 */
1528-
1529-
len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
1530-
1531-
p = ngx_pnalloc(r->pool, len + sizeof(struct sockaddr_in));
1532-
if (p == NULL) {
1533-
return NGX_HTTP_INTERNAL_SERVER_ERROR;
1534-
}
1524+
len = __ngx_sock_ntop(ur->sockaddr, ur->socklen, p, NGX_SOCKADDR_STRLEN, 1);
15351525

1536-
len = ngx_inet_ntop(AF_INET, ur->sockaddr, p, NGX_INET_ADDRSTRLEN);
1537-
len = ngx_sprintf(&p[len], ":%d", ur->port) - p;
1538-
#endif
15391526
u->resolved->host.data = p;
15401527
u->resolved->host.len = len;
15411528

0 commit comments

Comments
 (0)