@@ -110,6 +110,8 @@ static void ngx_http_proxy_connect_variable_set_time(ngx_http_request_t *r,
110
110
ngx_http_variable_value_t * v , uintptr_t data );
111
111
static ngx_int_t ngx_http_proxy_connect_sock_ntop (ngx_http_request_t * r ,
112
112
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 );
113
115
114
116
115
117
@@ -237,6 +239,12 @@ static ngx_http_variable_t ngx_http_proxy_connect_vars[] = {
237
239
238
240
#if 1
239
241
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
+
240
248
/*
241
249
* #if defined(nginx_version) && nginx_version <= 1009015
242
250
*
@@ -1019,19 +1027,15 @@ ngx_http_proxy_connect_process_connect(ngx_http_request_t *r,
1019
1027
static void
1020
1028
ngx_http_proxy_connect_resolve_handler (ngx_resolver_ctx_t * ctx )
1021
1029
{
1022
- u_char * p ;
1023
- ngx_int_t i , len ;
1024
1030
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
1031
1031
ngx_http_request_t * r ;
1032
1032
ngx_http_upstream_resolved_t * ur ;
1033
1033
ngx_http_proxy_connect_upstream_t * u ;
1034
1034
1035
+ #if defined(nginx_version ) && nginx_version >= 1013002
1036
+ ngx_uint_t run_posted = ctx -> async ;
1037
+ #endif
1038
+
1035
1039
u = ctx -> data ;
1036
1040
r = u -> request ;
1037
1041
ur = u -> resolved ;
@@ -1056,14 +1060,10 @@ ngx_http_proxy_connect_resolve_handler(ngx_resolver_ctx_t *ctx)
1056
1060
#if (NGX_DEBUG )
1057
1061
{
1058
1062
# 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
1064
1063
ngx_uint_t i ;
1064
+ ngx_str_t addr ;
1065
+ u_char text [NGX_SOCKADDR_STRLEN ];
1065
1066
1066
- # if defined(nginx_version ) && nginx_version >= 1005008
1067
1067
addr .data = text ;
1068
1068
1069
1069
for (i = 0 ; i < ctx -> naddrs ; i ++ ) {
@@ -1074,6 +1074,9 @@ ngx_http_proxy_connect_resolve_handler(ngx_resolver_ctx_t *ctx)
1074
1074
"name was resolved to %V" , & addr );
1075
1075
}
1076
1076
# else
1077
+ ngx_uint_t i ;
1078
+ in_addr_t addr ;
1079
+
1077
1080
for (i = 0 ; i < ctx -> naddrs ; i ++ ) {
1078
1081
addr = ntohl (ctx -> addrs [i ]);
1079
1082
@@ -1086,30 +1089,47 @@ ngx_http_proxy_connect_resolve_handler(ngx_resolver_ctx_t *ctx)
1086
1089
}
1087
1090
#endif
1088
1091
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 );
1094
1095
goto failed ;
1095
1096
}
1096
1097
1097
- if ( ur -> naddrs == 1 ) {
1098
- i = 0 ;
1098
+ ngx_resolve_name_done ( ctx );
1099
+ ur -> ctx = NULL ;
1099
1100
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 );
1102
1108
}
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 */
1103
1125
1104
1126
#if defined(nginx_version ) && nginx_version >= 1005008
1127
+
1105
1128
socklen = ur -> addrs [i ].socklen ;
1106
1129
1107
1130
sockaddr = ngx_palloc (r -> pool , socklen );
1108
1131
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 ;
1113
1133
}
1114
1134
1115
1135
ngx_memcpy (sockaddr , ur -> addrs [i ].sockaddr , socklen );
@@ -1124,57 +1144,37 @@ ngx_http_proxy_connect_resolve_handler(ngx_resolver_ctx_t *ctx)
1124
1144
((struct sockaddr_in * ) sockaddr )-> sin_port = htons (ur -> port );
1125
1145
}
1126
1146
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
-
1139
1147
#else
1140
1148
/* for nginx older than 1.5.8 */
1141
1149
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 );
1148
1151
1149
- return ;
1152
+ sockaddr = ngx_pcalloc (r -> pool , socklen );
1153
+ if (sockaddr == NULL ) {
1154
+ return NGX_ERROR ;
1150
1155
}
1151
1156
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
1154
1162
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
+ }
1157
1167
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 );
1161
1169
1162
- ur -> sockaddr = (struct sockaddr * ) sin ;
1163
- ur -> socklen = sizeof (struct sockaddr_in );
1164
- #endif
1170
+ ur -> sockaddr = sockaddr ;
1171
+ ur -> socklen = socklen ;
1165
1172
1166
1173
ur -> host .data = p ;
1167
1174
ur -> host .len = len ;
1168
1175
ur -> naddrs = 1 ;
1169
1176
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 ;
1178
1178
}
1179
1179
1180
1180
@@ -1516,26 +1516,13 @@ ngx_http_proxy_connect_sock_ntop(ngx_http_request_t *r,
1516
1516
1517
1517
/* fix u->resolved->host to "<address:port>" format */
1518
1518
1519
- #if defined(nginx_version ) && nginx_version >= 1005008
1520
1519
p = ngx_pnalloc (r -> pool , NGX_SOCKADDR_STRLEN );
1521
1520
if (p == NULL ) {
1522
1521
return NGX_HTTP_INTERNAL_SERVER_ERROR ;
1523
1522
}
1524
1523
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 );
1535
1525
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
1539
1526
u -> resolved -> host .data = p ;
1540
1527
u -> resolved -> host .len = len ;
1541
1528
0 commit comments