* is required to determine a server address
*/
- c->local_sockaddr = NULL;
-
if (ngx_http_server_addr(r, NULL) != NGX_OK) {
ngx_http_close_connection(c);
return;
#if (NGX_PCRE)
if (vn->nregex) {
+ size_t ncaptures;
ngx_int_t n;
ngx_uint_t i;
ngx_str_t name;
name.len = len;
name.data = server;
+ ncaptures = 0;
+
sn = vn->regex;
for (i = 0; i < vn->nregex; i++) {
- n = ngx_regex_exec(sn[i].regex, &name, NULL, 0);
+ if (sn[i].captures && r->captures == NULL) {
+
+ ncaptures = (NGX_HTTP_MAX_CAPTURES + 1) * 3;
+
+ r->captures = ngx_palloc(r->pool, ncaptures * sizeof(int));
+ if (r->captures == NULL) {
+ return NGX_ERROR;
+ }
+
+ if (server == buf) {
+ server = ngx_pnalloc(r->pool, len);
+ if (server == NULL) {
+ return NGX_ERROR;
+ }
+
+ ngx_memcpy(server, buf, len);
+ name.data = server;
+ }
+ }
+
+ n = ngx_regex_exec(sn[i].regex, &name, r->captures, ncaptures);
if (n == NGX_REGEX_NO_MATCHED) {
continue;
cscf = sn[i].core_srv_conf;
+ r->ncaptures = ncaptures;
+ r->captures_data = server;
+
goto found;
}
}
(const void *) &tcp_nodelay, sizeof(int))
== -1)
{
+#if (NGX_SOLARIS)
+ /* Solaris returns EINVAL if a socket has been shut down */
+ c->log_error = NGX_ERROR_IGNORE_EINVAL;
+#endif
+
ngx_connection_error(c, ngx_socket_errno,
"setsockopt(TCP_NODELAY) failed");
+
+ c->log_error = NGX_ERROR_INFO;
ngx_http_close_connection(c);
return;
}