static void ngx_mail_smtp_resolve_name(ngx_event_t *rev) { ngx_connection_t *c; ngx_mail_session_t *s; ngx_resolver_ctx_t *ctx; ngx_mail_core_srv_conf_t *cscf; c = rev->data; s = c->data; cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); ctx = ngx_resolve_start(cscf->resolver, NULL); if (ctx == NULL) { ngx_mail_close_connection(c); return; } ctx->name = s->host; ctx->type = NGX_RESOLVE_A; ctx->handler = ngx_mail_smtp_resolve_name_handler; ctx->data = s; ctx->timeout = cscf->resolver_timeout; if (ngx_resolve_name(ctx) != NGX_OK) { ngx_mail_close_connection(c); } }
static void ngx_http_upstream_dynamic_server_resolve(ngx_event_t *ev) { ngx_http_upstream_dynamic_server_main_conf_t *udsmcf = ngx_http_cycle_get_module_main_conf(ngx_cycle, ngx_http_upstream_dynamic_servers_module); ngx_http_upstream_dynamic_server_conf_t *dynamic_server; ngx_resolver_ctx_t *ctx; dynamic_server = ev->data; ctx = ngx_resolve_start(udsmcf->resolver, NULL); if (ctx == NULL) { ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "upstream-dynamic-servers: resolver start error for '%V'", &dynamic_server->host); return; } if (ctx == NGX_NO_RESOLVER) { ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "upstream-dynamic-servers: no resolver defined to resolve '%V'", &dynamic_server->host); return; } ctx->name = dynamic_server->host; ctx->handler = ngx_http_upstream_dynamic_server_resolve_handler; ctx->data = dynamic_server; ctx->timeout = udsmcf->resolver_timeout; ngx_log_debug(NGX_LOG_DEBUG_CORE, ev->log, 0, "upstream-dynamic-servers: Resolving '%V'", &ctx->name); if (ngx_resolve_name(ctx) != NGX_OK) { ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "upstream-dynamic-servers: ngx_resolve_name failed for '%V'", &ctx->name); ngx_add_timer(&dynamic_server->timer, 1000); } }
static void dns_request(ngx_http_request_t * r, ngx_str_t hostname) { ngx_resolver_ctx_t * rctx; ngx_http_core_loc_conf_t * core_loc_cf; if (r == NULL) { return; } ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "rdns: dns request"); core_loc_cf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); if (core_loc_cf == NULL) { ngx_log_debug0(NGX_LOG_ERR, r->connection->log, 0, "rnds: dns request: failed to get core location config"); ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } rctx = ngx_resolve_start(core_loc_cf->resolver, NULL); if (rctx == NULL) { ngx_log_debug0(NGX_LOG_ERR, r->connection->log, 0, "rdns: dns request: unable to create resolver context"); ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } if (rctx == NGX_NO_RESOLVER) { ngx_log_debug0(NGX_LOG_ERR, r->connection->log, 0, "rdns: dns request: core resolver is not defined"); ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } #if (OLD_RESOLVER_API) rctx->type = NGX_RESOLVE_A; #endif rctx->name = hostname; rctx->handler = dns_handler; rctx->data = r; rctx->timeout = core_loc_cf->resolver_timeout; if (ngx_resolve_name(rctx) != NGX_OK) { ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } }
static void ngx_ssl_ocsp_request(ngx_ssl_ocsp_ctx_t *ctx) { ngx_resolver_ctx_t *resolve, temp; ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, "ssl ocsp request"); if (ngx_ssl_ocsp_create_request(ctx) != NGX_OK) { ngx_ssl_ocsp_error(ctx); return; } if (ctx->resolver) { /* resolve OCSP responder hostname */ temp.name = ctx->host; resolve = ngx_resolve_start(ctx->resolver, &temp); if (resolve == NULL) { ngx_ssl_ocsp_error(ctx); return; } if (resolve == NGX_NO_RESOLVER) { ngx_log_error(NGX_LOG_WARN, ctx->log, 0, "no resolver defined to resolve %V", &ctx->host); goto connect; } resolve->name = ctx->host; resolve->type = NGX_RESOLVE_A; resolve->handler = ngx_ssl_ocsp_resolve_handler; resolve->data = ctx; resolve->timeout = ctx->resolver_timeout; if (ngx_resolve_name(resolve) != NGX_OK) { ngx_ssl_ocsp_error(ctx); return; } return; } connect: ngx_ssl_ocsp_connect(ctx); }
static ngx_int_t ngx_http_upstream_resolveMK_get_peer(ngx_peer_connection_t *pc, void *data) { ngx_http_upstream_resolveMK_peer_data_t *urpd = data; ngx_http_upstream_resolveMK_srv_conf_t *urcf = urpd->conf; ngx_resolver_ctx_t *ctx; ngx_http_upstream_resolveMK_peer_t *peer; pc->cached = 0; pc->connection = NULL; if (urcf->resolver_stats == RESOLVE_STATS_WAIT) { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "upstream_resolveMK: resolving"); goto assign; } if (ngx_time() <= urcf->resolved_access + urcf->resolver_interval) { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "upstream_resolveMK: update from DNS cache"); goto assign; } ctx = ngx_resolve_start(urpd->clcf->resolver, NULL); if (ctx == NULL) { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "upstream_resolveMK: resolve_start fail"); goto assign; } if (ctx == NGX_NO_RESOLVER) { ngx_log_error(NGX_LOG_ALERT, pc->log, 0, "upstream_resolveMK: no resolver"); goto assign; } ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "upstream_resolveMK: resolve_start ok"); ctx->name = urcf->resolver_domain; ctx->service = urcf->resolver_service; ctx->handler = ngx_http_upstream_resolveMK_handler; ctx->data = urcf; ctx->timeout = urpd->clcf->resolver_timeout; urcf->resolver_stats = RESOLVE_STATS_WAIT; if (ngx_resolve_name(ctx) != NGX_OK) { ngx_log_error(NGX_LOG_ALERT, pc->log, 0, "upstream_resolveMK: resolve name \"%V\" fail", &ctx->name); } assign: ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, "upstream_resolveMK: resolved_num=%ud", urcf->resolved_num); if (urpd->current == -1) { urcf->resolved_index = (urcf->resolved_index + 1) % urcf->resolved_num; urpd->current = urcf->resolved_index; } else { urpd->current = (urpd->current + 1) % urcf->resolved_num; } peer = &(urcf->peers[urpd->current]); pc->sockaddr = &peer->sockaddr; pc->socklen = peer->socklen; pc->name = &peer->name; ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, "upstream_resolveMK: upstream to DNS peer (%s:%ud)", inet_ntoa(((struct sockaddr_in*)(pc->sockaddr))->sin_addr), ntohs((unsigned short)((struct sockaddr_in*)(pc->sockaddr))->sin_port)); return NGX_OK; }
static int ngx_http_lua_socket_udp_setpeername(lua_State *L) { ngx_http_request_t *r; ngx_http_lua_ctx_t *ctx; ngx_str_t host; int port; ngx_resolver_ctx_t *rctx, temp; ngx_http_core_loc_conf_t *clcf; int saved_top; int n; u_char *p; size_t len; ngx_url_t url; ngx_int_t rc; ngx_http_lua_loc_conf_t *llcf; ngx_udp_connection_t *uc; int timeout; ngx_http_lua_co_ctx_t *coctx; ngx_http_lua_socket_udp_upstream_t *u; /* * TODO: we should probably accept an extra argument to setpeername() * to allow the user bind the datagram unix domain socket himself, * which is necessary for systems without autobind support. */ n = lua_gettop(L); if (n != 2 && n != 3) { return luaL_error(L, "ngx.socket.udp setpeername: expecting 2 or 3 " "arguments (including the object), but seen %d", n); } lua_pushlightuserdata(L, &ngx_http_lua_request_key); lua_rawget(L, LUA_GLOBALSINDEX); r = lua_touserdata(L, -1); lua_pop(L, 1); if (r == NULL) { return luaL_error(L, "no request found"); } ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module); if (ctx == NULL) { return luaL_error(L, "no ctx found"); } ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE | NGX_HTTP_LUA_CONTEXT_ACCESS | NGX_HTTP_LUA_CONTEXT_CONTENT); luaL_checktype(L, 1, LUA_TTABLE); p = (u_char *) luaL_checklstring(L, 2, &len); host.data = ngx_palloc(r->pool, len + 1); if (host.data == NULL) { return luaL_error(L, "out of memory"); } host.len = len; ngx_memcpy(host.data, p, len); host.data[len] = '\0'; if (n == 3) { port = luaL_checkinteger(L, 3); if (port < 0 || port > 65536) { lua_pushnil(L); lua_pushfstring(L, "bad port number: %d", port); return 2; } } else { /* n == 2 */ port = 0; } lua_rawgeti(L, 1, SOCKET_CTX_INDEX); u = lua_touserdata(L, -1); lua_pop(L, 1); if (u) { if (u->waiting) { lua_pushnil(L); lua_pushliteral(L, "socket busy"); return 2; } if (u->udp_connection.connection) { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "lua udp socket reconnect without shutting down"); ngx_http_lua_socket_udp_finalize(r, u); } ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "lua reuse socket upstream ctx"); } else { u = lua_newuserdata(L, sizeof(ngx_http_lua_socket_udp_upstream_t)); if (u == NULL) { return luaL_error(L, "out of memory"); } #if 1 lua_createtable(L, 0 /* narr */, 1 /* nrec */); /* metatable */ lua_pushcfunction(L, ngx_http_lua_socket_udp_upstream_destroy); lua_setfield(L, -2, "__gc"); lua_setmetatable(L, -2); #endif lua_rawseti(L, 1, SOCKET_CTX_INDEX); } ngx_memzero(u, sizeof(ngx_http_lua_socket_udp_upstream_t)); u->request = r; /* set the controlling request */ llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module); u->conf = llcf; uc = &u->udp_connection; uc->log = *r->connection->log; dd("lua peer connection log: %p", &uc->log); lua_rawgeti(L, 1, SOCKET_TIMEOUT_INDEX); timeout = (ngx_int_t) lua_tointeger(L, -1); lua_pop(L, 1); if (timeout > 0) { u->read_timeout = (ngx_msec_t) timeout; } else { u->read_timeout = u->conf->read_timeout; } ngx_memzero(&url, sizeof(ngx_url_t)); url.url.len = host.len; url.url.data = host.data; url.default_port = port; url.no_resolve = 1; if (ngx_parse_url(r->pool, &url) != NGX_OK) { lua_pushnil(L); if (url.err) { lua_pushfstring(L, "failed to parse host name \"%s\": %s", host.data, url.err); } else { lua_pushfstring(L, "failed to parse host name \"%s\"", host.data); } return 2; } u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t)); if (u->resolved == NULL) { return luaL_error(L, "out of memory"); } if (url.addrs && url.addrs[0].sockaddr) { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "lua udp socket network address given directly"); u->resolved->sockaddr = url.addrs[0].sockaddr; u->resolved->socklen = url.addrs[0].socklen; u->resolved->naddrs = 1; u->resolved->host = url.addrs[0].name; } else { u->resolved->host = host; u->resolved->port = (in_port_t) port; } if (u->resolved->sockaddr) { rc = ngx_http_lua_socket_resolve_retval_handler(r, u, L); if (rc == NGX_AGAIN) { return lua_yield(L, 0); } return rc; } clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); temp.name = host; rctx = ngx_resolve_start(clcf->resolver, &temp); if (rctx == NULL) { u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER; lua_pushnil(L); lua_pushliteral(L, "failed to start the resolver"); return 2; } if (rctx == NGX_NO_RESOLVER) { u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER; lua_pushnil(L); lua_pushfstring(L, "no resolver defined to resolve \"%s\"", host.data); return 2; } rctx->name = host; rctx->type = NGX_RESOLVE_A; rctx->handler = ngx_http_lua_socket_resolve_handler; rctx->data = u; rctx->timeout = clcf->resolver_timeout; u->co_ctx = ctx->cur_co_ctx; u->resolved->ctx = rctx; saved_top = lua_gettop(L); coctx = ctx->cur_co_ctx; coctx->cleanup = ngx_http_lua_udp_resolve_cleanup; if (ngx_resolve_name(rctx) != NGX_OK) { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "lua udp socket fail to run resolver immediately"); u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER; u->resolved->ctx = NULL; lua_pushnil(L); lua_pushfstring(L, "%s could not be resolved", host.data); return 2; } if (u->waiting == 1) { /* resolved and already connecting */ return lua_yield(L, 0); } n = lua_gettop(L) - saved_top; if (n) { /* errors occurred during resolving or connecting * or already connected */ return n; } /* still resolving */ u->waiting = 1; u->prepare_retvals = ngx_http_lua_socket_resolve_retval_handler; coctx->data = u; if (ctx->entered_content_phase) { r->write_event_handler = ngx_http_lua_content_wev_handler; } else { r->write_event_handler = ngx_http_core_run_phases; } return lua_yield(L, 0); }
ngx_int_t ngx_http_php_socket_connect(ngx_http_request_t *r) { ngx_http_php_ctx_t *ctx; //ngx_http_php_loc_conf_t *plcf; //ngx_str_t host; //int port; ngx_resolver_ctx_t *rctx, temp; ngx_http_core_loc_conf_t *clcf; ngx_url_t url; ngx_int_t rc; ngx_peer_connection_t *peer; ngx_http_php_socket_upstream_t *u; ngx_connection_t *c; c = r->connection; ctx = ngx_http_get_module_ctx(r, ngx_http_php_module); if (ctx->upstream == NULL){ ctx->upstream = ngx_pcalloc(r->pool, sizeof(ngx_http_php_socket_upstream_t)); } if (c->read->timer_set) { ngx_del_timer(c->read); } //r->keepalive = 0; u = ctx->upstream; u->connect_timeout = 60000; u->read_timeout = 60000; u->write_timeout = 60000; u->enabled_receive = 0; u->request = r; peer = &u->peer; peer->log = r->connection->log; peer->log_error = NGX_ERROR_ERR; ngx_php_debug("php peer connection log: %p %p", peer->log, peer); ngx_memzero(&url, sizeof(ngx_url_t)); url.url.len = ctx->host.len; url.url.data = ctx->host.data; url.default_port = (in_port_t) ctx->port; url.no_resolve = 1; if (ngx_parse_url(r->pool, &url) != NGX_OK) { if (url.err) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "%s in upstream \"%V\"", url.err, &url.url); }else { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "failed to parse host name \"%s\"", ctx->host.data); } return NGX_ERROR; } u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t)); if (u->resolved == NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "ngx_pcalloc resolved error. %s.", strerror(errno)); return NGX_ERROR; } if (url.addrs && url.addrs[0].sockaddr) { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "php socket network address given directly"); u->resolved->sockaddr = url.addrs[0].sockaddr; u->resolved->socklen = url.addrs[0].socklen; u->resolved->naddrs = 1; u->resolved->host = url.addrs[0].name; } else { u->resolved->host = ctx->host; u->resolved->port = (in_port_t) ctx->port; } // Already real ip address, is not url and not resolve. if (u->resolved->sockaddr) { rc = ngx_http_php_socket_resolve_retval_handler(r, u); if (rc == NGX_AGAIN) { return NGX_AGAIN; } return rc; } clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); temp.name = ctx->host; rctx = ngx_resolve_start(clcf->resolver, &temp); if (rctx == NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "failed to start the resolver"); return NGX_ERROR; } if (rctx == NGX_NO_RESOLVER) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no resolver defined to resolve \"%s\"", ctx->host.data); return NGX_ERROR; } rctx->name = ctx->host; rctx->handler = ngx_http_php_socket_resolve_handler; rctx->data = u; rctx->timeout = clcf->resolver_timeout; u->resolved->ctx = rctx; if (ngx_resolve_name(rctx) != NGX_OK) { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "php tcp socket fail to run resolver immediately"); return NGX_ERROR; } return NGX_OK; }
static ngx_int_t ngx_http_upstream_get_dynamic_peer(ngx_peer_connection_t *pc, void *data) { ngx_http_upstream_dynamic_peer_data_t *bp = data; ngx_http_request_t *r; ngx_http_core_loc_conf_t *clcf; ngx_resolver_ctx_t *ctx, temp; ngx_http_upstream_t *u; ngx_int_t rc; ngx_http_upstream_dynamic_srv_conf_t *dscf; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "get dynamic peer"); /* The "get" function will be called twice if * one host is resolved into an IP address. * (via 'ngx_http_upstream_connect' if resolved successfully) * * So here we need to determine if it is the first * time call or the second time call. */ if (pc->resolved == NGX_HTTP_UPSTREAM_DR_OK) { return NGX_OK; } dscf = bp->conf; r = bp->request; u = r->upstream; if (pc->resolved == NGX_HTTP_UPSTREAM_DR_FAILED) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, "resolve failed! fallback: %ui", dscf->fallback); switch (dscf->fallback) { case NGX_HTTP_UPSTREAM_DYN_RESOLVE_STALE: return NGX_OK; case NGX_HTTP_UPSTREAM_DYN_RESOLVE_SHUTDOWN: ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY); return NGX_YIELD; default: /* default fallback action: check next upstream */ return NGX_DECLINED; } return NGX_DECLINED; } if (dscf->fail_check && (ngx_time() - dscf->fail_check < dscf->fail_timeout)) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, "in fail timeout period, fallback: %ui", dscf->fallback); switch (dscf->fallback) { case NGX_HTTP_UPSTREAM_DYN_RESOLVE_STALE: return bp->original_get_peer(pc, bp->data); case NGX_HTTP_UPSTREAM_DYN_RESOLVE_SHUTDOWN: ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY); return NGX_YIELD; default: /* default fallback action: check next upstream, still need * to get peer in fail timeout period */ return bp->original_get_peer(pc, bp->data); } return NGX_DECLINED; } /* NGX_HTTP_UPSTREAM_DYN_RESOLVE_INIT, ask balancer */ rc = bp->original_get_peer(pc, bp->data); if (rc != NGX_OK) { return rc; } /* resolve name */ if (pc->host == NULL) { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "load balancer doesn't support dyn resolve!"); return NGX_OK; } if (ngx_inet_addr(pc->host->data, pc->host->len) != INADDR_NONE) { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "host is an IP address, connect directly!"); return NGX_OK; } clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); if (clcf->resolver == NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "resolver has not been configured!"); return NGX_OK; } temp.name = *pc->host; ctx = ngx_resolve_start(clcf->resolver, &temp); if (ctx == NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "resolver start failed!"); return NGX_OK; } if (ctx == NGX_NO_RESOLVER) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "resolver started but no resolver!"); return NGX_OK; } ctx->name = *pc->host; /* TODO remove */ // ctx->type = NGX_RESOLVE_A; /* END */ ctx->handler = ngx_http_upstream_dynamic_handler; ctx->data = r; ctx->timeout = clcf->resolver_timeout; u->dyn_resolve_ctx = ctx; if (ngx_resolve_name(ctx) != NGX_OK) { ngx_log_error(NGX_LOG_ERR, pc->log, 0, "resolver name failed!\n"); u->dyn_resolve_ctx = NULL; return NGX_OK; } return NGX_YIELD; }
void ngx_http_upstream_dbd_init_request(ngx_http_request_t *r) { ngx_str_t *host; ngx_uint_t i; ngx_resolver_ctx_t *ctx, temp; ngx_http_cleanup_t *cln; ngx_http_upstream_t *u; ngx_http_core_loc_conf_t *clcf; ngx_http_upstream_srv_conf_t *uscf, **uscfp; ngx_http_upstream_main_conf_t *umcf; #if defined(nginx_version) && nginx_version >= 8011 if (r->aio) { return; } #endif u = r->upstream; #if 0 && (NGX_HTTP_CACHE) if (u->conf->cache) { ngx_int_t rc; rc = ngx_http_upstream_cache(r, u); if (rc == NGX_BUSY) { r->write_event_handler = ngx_http_upstream_init_request; return; } r->write_event_handler = ngx_http_request_empty_handler; if (rc == NGX_DONE) { return; } if (rc != NGX_DECLINED) { ngx_http_finalize_request(r, rc); return; } } #endif u->store = (u->conf->store || u->conf->store_lengths); if (!u->store && !r->post_action && !u->conf->ignore_client_abort) { r->read_event_handler = ngx_http_upstream_dbd_rd_check_broken_connection; r->write_event_handler = ngx_http_upstream_dbd_wr_check_broken_connection; } if (r->request_body) { u->request_bufs = r->request_body->bufs; } if (u->create_request(r) != NGX_OK) { ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } #if defined(nginx_version) && nginx_version >= 8022 u->peer.local = u->conf->local; #endif clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); #if defined(nginx_version) && nginx_version >= 8011 u->output.alignment = clcf->directio_alignment; #endif u->output.pool = r->pool; u->output.bufs.num = 1; u->output.bufs.size = clcf->client_body_buffer_size; u->output.output_filter = ngx_chain_writer; u->output.filter_ctx = &u->writer; u->writer.pool = r->pool; if (r->upstream_states == NULL) { r->upstream_states = ngx_array_create(r->pool, 1, sizeof(ngx_http_upstream_state_t)); if (r->upstream_states == NULL) { ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } } else { u->state = ngx_array_push(r->upstream_states); if (u->state == NULL) { ngx_http_upstream_drizzle_finalize_request(r, u, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t)); } cln = ngx_http_cleanup_add(r, 0); if (cln == NULL) { ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } cln->handler = ngx_http_upstream_dbd_cleanup; cln->data = r; u->cleanup = &cln->handler; if (u->resolved == NULL) { uscf = u->conf->upstream; } else { if (u->resolved->sockaddr) { if (ngx_http_upstream_create_round_robin_peer(r, u->resolved) != NGX_OK) { ngx_http_upstream_drizzle_finalize_request(r, u, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } ngx_http_upstream_dbd_connect(r, u); return; } host = &u->resolved->host; umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); uscfp = umcf->upstreams.elts; for (i = 0; i < umcf->upstreams.nelts; i++) { uscf = uscfp[i]; if (uscf->host.len == host->len && ((uscf->port == 0 && u->resolved->no_port) || uscf->port == u->resolved->port) && ngx_memcmp(uscf->host.data, host->data, host->len) == 0) { goto found; } } temp.name = *host; ctx = ngx_resolve_start(clcf->resolver, &temp); if (ctx == NULL) { ngx_http_upstream_drizzle_finalize_request(r, u, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } if (ctx == NGX_NO_RESOLVER) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no resolver defined to resolve %V", host); ngx_http_upstream_drizzle_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY); return; } #if 0 ctx->name = *host; ctx->type = NGX_RESOLVE_A; ctx->handler = ngx_http_upstream_resolve_handler; ctx->data = r; ctx->timeout = clcf->resolver_timeout; u->resolved->ctx = ctx; if (ngx_resolve_name(ctx) != NGX_OK) { u->resolved->ctx = NULL; ngx_http_upstream_drizzle_finalize_request(r, u, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } #endif return; } found: if (uscf->peer.init(r, uscf) != NGX_OK) { ngx_http_upstream_drizzle_finalize_request(r, u, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } ngx_http_upstream_dbd_connect(r, u); }
void ngx_tcp_upstream_init(ngx_tcp_session_t *s) { ngx_str_t *host; ngx_uint_t i; ngx_connection_t *c; ngx_tcp_cleanup_t *cln; ngx_resolver_ctx_t *ctx, temp; ngx_tcp_upstream_t *u; ngx_tcp_core_srv_conf_t *cscf; ngx_tcp_upstream_srv_conf_t *uscf, **uscfp; ngx_tcp_upstream_main_conf_t *umcf; c = s->connection; cscf = ngx_tcp_get_module_srv_conf(s, ngx_tcp_core_module); ngx_log_debug1(NGX_LOG_DEBUG_TCP, c->log, 0, "tcp init upstream, client timer: %d", c->read->timer_set); if (c->read->timer_set) { ngx_del_timer(c->read); } u = s->upstream; cln = ngx_tcp_cleanup_add(s, 0); cln->handler = ngx_tcp_upstream_cleanup; cln->data = s; u->cleanup = &cln->handler; if (u->resolved == NULL) { uscf = u->conf->upstream; } else { /*TODO: support variable in the proxy_pass*/ if (u->resolved->sockaddr) { if (ngx_tcp_upstream_create_round_robin_peer(s, u->resolved) != NGX_OK) { ngx_tcp_finalize_session(s); return; } ngx_tcp_upstream_connect(s, u); return; } host = &u->resolved->host; umcf = ngx_tcp_get_module_main_conf(s, ngx_tcp_upstream_module); uscfp = umcf->upstreams.elts; for (i = 0; i < umcf->upstreams.nelts; i++) { uscf = uscfp[i]; if (uscf->host.len == host->len && ((uscf->port == 0 && u->resolved->no_port) || uscf->port == u->resolved->port) && ngx_memcmp(uscf->host.data, host->data, host->len) == 0) { goto found; } } temp.name = *host; ctx = ngx_resolve_start(cscf->resolver, &temp); if (ctx == NULL) { ngx_tcp_finalize_session(s); return; } if (ctx == NGX_NO_RESOLVER) { ngx_log_error(NGX_LOG_ERR, c->log, 0, "no resolver defined to resolve %V", host); ngx_tcp_finalize_session(s); return; } ctx->name = *host; ctx->type = NGX_RESOLVE_A; ctx->handler = ngx_tcp_upstream_resolve_handler; ctx->data = s; ctx->timeout = cscf->resolver_timeout; u->resolved->ctx = ctx; if (ngx_resolve_name(ctx) != NGX_OK) { u->resolved->ctx = NULL; ngx_tcp_finalize_session(s); return; } return; } found: if (uscf->peer.init(s, uscf) != NGX_OK) { ngx_tcp_finalize_session(s); return; } ngx_tcp_upstream_connect(s, u); }
static void ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx) { ngx_connection_t *c; ngx_mail_session_t *s; ngx_mail_core_srv_conf_t *cscf; s = ctx->data; c = s->connection; if (ctx->state) { ngx_log_error(NGX_LOG_ERR, c->log, 0, "%V could not be resolved (%i: %s)", &c->addr_text, ctx->state, ngx_resolver_strerror(ctx->state)); if (ctx->state == NGX_RESOLVE_NXDOMAIN) { s->host = smtp_unavailable; } else { s->host = smtp_tempunavail; } ngx_resolve_addr_done(ctx); ngx_mail_smtp_greeting(s, s->connection); return; } c->log->action = "in resolving client hostname"; s->host.data = ngx_pstrdup(c->pool, &ctx->name); if (s->host.data == NULL) { ngx_resolve_addr_done(ctx); ngx_mail_close_connection(c); return; } s->host.len = ctx->name.len; ngx_resolve_addr_done(ctx); ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, "address resolved: %V", &s->host); cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); ctx = ngx_resolve_start(cscf->resolver, NULL); if (ctx == NULL) { ngx_mail_close_connection(c); return; } ctx->name = s->host; ctx->type = NGX_RESOLVE_A; ctx->handler = ngx_mail_smtp_resolve_name_handler; ctx->data = s; ctx->timeout = cscf->resolver_timeout; if (ngx_resolve_name(ctx) != NGX_OK) { ngx_mail_close_connection(c); } }