added dns preresolution
This commit is contained in:
		| @ -72,6 +72,7 @@ struct task_proxy_t | ||||
| 	qse_mchar_t* pseudonym; | ||||
| 	qse_htrd_t* peer_htrd; | ||||
|  | ||||
| 	qse_httpd_mod_t* dns_preresolve_mod; | ||||
| 	qse_mchar_t* peer_name; | ||||
| 	qse_uint16_t peer_port; | ||||
|  | ||||
| @ -948,9 +949,9 @@ static int task_init_proxy ( | ||||
| 		if (arg->rsrc->flags & QSE_HTTPD_RSRC_PROXY_ENABLE_DNS) | ||||
| 		{ | ||||
| 			proxy->peer_name = proxy->pseudonym + len + 1; | ||||
|  | ||||
| 			qse_mbscpy (proxy->peer_name, arg->rsrc->dst.str); | ||||
| 			adjust_peer_name_and_port (proxy); | ||||
| 			proxy->dns_preresolve_mod = arg->rsrc->dns_preresolve_mod; | ||||
|  | ||||
| 			proxy->flags |= PROXY_RESOLVE_PEER_NAME; | ||||
| 			if (arg->rsrc->flags & QSE_HTTPD_RSRC_PROXY_DNS_SERVER) | ||||
| @ -989,7 +990,7 @@ printf (">>>>>>>>>>>>>>>>>>>>>>>> [%s] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", proxy | ||||
| 		if (x == 0)  | ||||
| 		{ | ||||
| 			/* prerewrite() indicates that proxy->url_to_rewrite is the final | ||||
| 			 * rewriting result and no futher rewriting is required */ | ||||
| 			 * rewriting result and no further rewriting is required */ | ||||
| 			proxy->flags |= PROXY_URL_PREREWRITTEN; | ||||
| 		} | ||||
|  | ||||
| @ -2129,7 +2130,7 @@ static int task_main_proxy ( | ||||
| 		{ | ||||
| 			/* note that url_to_rewrite is URL + extra information. */ | ||||
| 			if (qse_httpd_rewriteurl (httpd, proxy->url_to_rewrite, on_url_rewritten,  | ||||
| 									  ((proxy->flags & PROXY_URS_SERVER)? &proxy->urs_server: QSE_NULL), task) <= -1) goto oops; | ||||
| 			                          ((proxy->flags & PROXY_URS_SERVER)? &proxy->urs_server: QSE_NULL), task) <= -1) goto oops; | ||||
|  | ||||
| 			if (proxy->flags & PROXY_INIT_FAILED) goto oops; | ||||
| 			 | ||||
| @ -2143,14 +2144,31 @@ static int task_main_proxy ( | ||||
| 	if (proxy->flags & PROXY_RESOLVE_PEER_NAME) | ||||
| 	{ | ||||
| 		/* arrange to resolve a host name and return */ | ||||
|  | ||||
| 		int x; | ||||
| 		QSE_ASSERT (proxy->peer_name != QSE_NULL); | ||||
|  | ||||
| 		if (qse_httpd_resolname (httpd, proxy->peer_name, on_peer_name_resolved,  | ||||
| 		                         ((proxy->flags & PROXY_DNS_SERVER)? &proxy->dns_server: QSE_NULL), task) <= -1) goto oops; | ||||
| 		if (proxy->dns_preresolve_mod && proxy->dns_preresolve_mod->dns_preresolve) | ||||
| 			x = proxy->dns_preresolve_mod->dns_preresolve (proxy->dns_preresolve_mod, client, proxy->peer_name, &proxy->peer.nwad); | ||||
| 		else | ||||
| 			x = httpd->opt.scb.dns.preresolve (httpd, client, proxy->peer_name, &proxy->peer.nwad); | ||||
| 		if (x <= -1) goto oops; | ||||
|  | ||||
| 		if (x == 0) | ||||
| 		{ | ||||
| 			/* preresolve() indicates that proxy->peer.nwad contains the | ||||
| 			 * final address. no actual dns resolution is required */ | ||||
| 			proxy->flags |= PROXY_PEER_NAME_RESOLVED; | ||||
| 			proxy->flags &= ~PROXY_RESOLVE_PEER_NAME; | ||||
| 			qse_setnwadport (&proxy->peer.nwad, qse_hton16(proxy->peer_port)); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			x = qse_httpd_resolvename (httpd, proxy->peer_name, on_peer_name_resolved, ((proxy->flags & PROXY_DNS_SERVER)? &proxy->dns_server: QSE_NULL), task); | ||||
| 			if (x <= -1) goto oops; | ||||
| 		} | ||||
|  | ||||
| 		/* if the name could be resolved without sending a request  | ||||
| 		 * in qse_httpd_resolname(), on_peer_name_resolve would be  | ||||
| 		 * in qse_httpd_resolvename(), on_peer_name_resolve would be  | ||||
| 		 * called. */ | ||||
| 		if (proxy->flags & PROXY_INIT_FAILED)  | ||||
| 		{ | ||||
|  | ||||
| @ -153,7 +153,7 @@ struct dns_req_t | ||||
| 	qse_uint8_t* dn; | ||||
| 	qse_size_t dnlen; | ||||
|  | ||||
| 	qse_httpd_resol_t resol; | ||||
| 	qse_httpd_resolve_t resol; | ||||
| 	void* ctx; | ||||
|  | ||||
| 	qse_uint8_t qa[DNS_MAX_DN_LEN + QSE_SIZEOF(dns_hdr_t) + QSE_SIZEOF(dns_qdtrail_t)]; | ||||
| @ -795,7 +795,7 @@ printf (">>tmr_dns_tmout_handle  req->>%p\n", req); | ||||
| 	dc->req_count--; | ||||
| } | ||||
|  | ||||
| static int dns_send (qse_httpd_t* httpd, qse_httpd_dns_t* dns, const qse_mchar_t* name, qse_httpd_resol_t resol, const qse_httpd_dns_server_t* dns_server, void* ctx) | ||||
| static int dns_send (qse_httpd_t* httpd, qse_httpd_dns_t* dns, const qse_mchar_t* name, qse_httpd_resolve_t resol, const qse_httpd_dns_server_t* dns_server, void* ctx) | ||||
| { | ||||
| 	dns_ctx_t* dc = (dns_ctx_t*)dns->ctx; | ||||
| 	httpd_xtn_t* httpd_xtn; | ||||
| @ -942,3 +942,11 @@ oops: | ||||
| 	} | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
|  | ||||
| static int dns_preresolve (qse_httpd_t* httpd, qse_httpd_client_t* client, const qse_mchar_t* host, qse_nwad_t* nwad) | ||||
| { | ||||
| 	/* do nothing */ | ||||
| 	return 1; /* unhandled */ | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -538,7 +538,6 @@ static int urs_prerewrite (qse_httpd_t* httpd, qse_httpd_client_t* client, qse_h | ||||
| 	url_to_rewrite = qse_httpd_allocmem (httpd, total_len); | ||||
| 	if (url_to_rewrite == QSE_NULL) return -1; | ||||
|  | ||||
| 	 | ||||
| 	if (mtype == QSE_HTTP_CONNECT || !host_ptr)  | ||||
| 	{ | ||||
| 		host_ptr = QSE_MT(""); | ||||
|  | ||||
| @ -2389,7 +2389,8 @@ static qse_httpd_scb_t httpd_system_callbacks = | ||||
| 		dns_open, | ||||
| 		dns_close, | ||||
| 		dns_recv, | ||||
| 		dns_send | ||||
| 		dns_send, | ||||
| 		dns_preresolve | ||||
| 	}, | ||||
|  | ||||
| 	/* urs */ | ||||
|  | ||||
| @ -1853,7 +1853,7 @@ qse_mchar_t* qse_httpd_escapehtml (qse_httpd_t* httpd, const qse_mchar_t* str) | ||||
|  | ||||
| /* ----------------------------------------------------------------------- */ | ||||
|  | ||||
| int qse_httpd_resolname (qse_httpd_t* httpd, const qse_mchar_t* name, qse_httpd_resol_t resol, const qse_httpd_dns_server_t* dns_server, void* ctx) | ||||
| int qse_httpd_resolvename (qse_httpd_t* httpd, const qse_mchar_t* name, qse_httpd_resolve_t resol, const qse_httpd_dns_server_t* dns_server, void* ctx) | ||||
| { | ||||
| printf ("DNS_SEND.........................\n"); | ||||
| 	if (!httpd->dnsactive)  | ||||
| @ -1862,7 +1862,6 @@ printf ("DNS_SEND.........................\n"); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	return httpd->opt.scb.dns.send (httpd, &httpd->dns, name, resol, dns_server, ctx); | ||||
| } | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user