fixed a memory leak bug caused when the duplicated host name is an address.
fixed wrong redirection code processing bug in rewriting handler. fixed a bug of not setting the default port when no port is specfied in rewritten url address
This commit is contained in:
		@ -1947,13 +1947,20 @@ printf ("XXXXXXXXXXXXXXXXXXXXXXXXXX URL REWRITTEN TO [%s].....\n", new_url);
 | 
			
		||||
		{
 | 
			
		||||
			/* if a network address is returned, change the peer address only */
 | 
			
		||||
			/* TODO: prevent proxying to self */
 | 
			
		||||
 | 
			
		||||
			if (qse_getnwadport(&nwad) == 0) 
 | 
			
		||||
			{
 | 
			
		||||
				/* i don't care if new_url is X.X.X.X:0 or just X.X.X.X */
 | 
			
		||||
				qse_setnwadport (&nwad, qse_hton16(QSE_HTTPD_DEFAULT_PORT));
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			proxy->peer.nwad = nwad;
 | 
			
		||||
			proxy->flags |= PROXY_URL_REWRITTEN;
 | 
			
		||||
			proxy->flags &= ~PROXY_RESOLVE_PEER_NAME; /* skip dns */
 | 
			
		||||
		}
 | 
			
		||||
		else if (new_url[0] >= QSE_MT('0') && new_url[0] <= QSE_MT('9'))
 | 
			
		||||
		{
 | 
			
		||||
			/* redirection */
 | 
			
		||||
			/* check if it begins with redirection code followed by a colon */
 | 
			
		||||
			int redir_code = 0;
 | 
			
		||||
			qse_httpd_status_reloc_t reloc;
 | 
			
		||||
			const qse_mchar_t* nuptr = new_url;
 | 
			
		||||
@ -1963,7 +1970,11 @@ printf ("XXXXXXXXXXXXXXXXXXXXXXXXXX URL REWRITTEN TO [%s].....\n", new_url);
 | 
			
		||||
				nuptr++;
 | 
			
		||||
			} 
 | 
			
		||||
			while (*nuptr >= QSE_MT('0') && *nuptr <= QSE_MT('9'));
 | 
			
		||||
			if (*nuptr != QSE_MT(':'))  goto fail;
 | 
			
		||||
			if (*nuptr != QSE_MT(':'))  
 | 
			
		||||
			{
 | 
			
		||||
				/* no colon is found after digits. it's probably a normal url */
 | 
			
		||||
				goto normal_url;
 | 
			
		||||
			}
 | 
			
		||||
			if (redir_code != 301 && redir_code != 302 && redir_code != 307) redir_code = 301;
 | 
			
		||||
			nuptr++;
 | 
			
		||||
 | 
			
		||||
@ -1981,6 +1992,7 @@ printf ("XXXXXXXXXXXXXXXXXXXXXXXXXX URL REWRITTEN TO [%s].....\n", new_url);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
		normal_url:
 | 
			
		||||
			if (proxy->flags & PROXY_RAW)
 | 
			
		||||
			{
 | 
			
		||||
				qse_mchar_t* tmp;
 | 
			
		||||
@ -2042,6 +2054,12 @@ printf ("XXXXXXXXXXXXXXXXXXXXXXXXXX URL REWRITTEN TO [%s].....\n", new_url);
 | 
			
		||||
						}
 | 
			
		||||
						else
 | 
			
		||||
						{
 | 
			
		||||
							if (qse_getnwadport(&nwad) == 0) 
 | 
			
		||||
							{
 | 
			
		||||
								/* i don't care if tmp is X.X.X.X:0 or just X.X.X.X */
 | 
			
		||||
								qse_setnwadport (&nwad, qse_hton16(QSE_HTTPD_DEFAULT_PORT));
 | 
			
		||||
							}
 | 
			
		||||
 | 
			
		||||
							proxy->peer.nwad = nwad;
 | 
			
		||||
							proxy->flags |= PROXY_URL_REWRITTEN;
 | 
			
		||||
							proxy->flags &= ~PROXY_RESOLVE_PEER_NAME; /* skip dns */
 | 
			
		||||
@ -2050,6 +2068,9 @@ qse_mchar_t xxxx[128];
 | 
			
		||||
qse_nwadtombs (&proxy->peer.nwad, xxxx, 128, QSE_NWADTOMBS_ALL);
 | 
			
		||||
printf ("XXXXXXXXXXXXXXXXXXXXXXXXXX PEER NAME RESOLVED.....TO [%s] IN URLREWRITING NEW_URL[%s] %d %d\n", xxxx, new_url, (int)proxy->qpath_pos_in_reqfwdbuf, (int)proxy->qpath_len_in_reqfwdbuf);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							/* the temporary string is not used. kill it */
 | 
			
		||||
							qse_httpd_freemem (httpd, tmp);
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
@ -491,7 +491,8 @@ static qse_httpd_client_t* new_client (qse_httpd_t* httpd, qse_httpd_client_t* t
 | 
			
		||||
	/* copy the public fields, 
 | 
			
		||||
	 * keep the private fields initialized at 0 */
 | 
			
		||||
	client->status = tmpl->status;
 | 
			
		||||
	if (httpd->opt.scb.client.accepted == QSE_NULL) client->status |= QSE_HTTPD_CLIENT_READY;
 | 
			
		||||
	if (httpd->opt.scb.client.accepted == QSE_NULL) 
 | 
			
		||||
		client->status |= QSE_HTTPD_CLIENT_READY;
 | 
			
		||||
	client->handle = tmpl->handle;
 | 
			
		||||
	client->handle2 = tmpl->handle2;
 | 
			
		||||
	client->remote_addr = tmpl->remote_addr;
 | 
			
		||||
@ -610,6 +611,21 @@ static void move_client_to_tail (qse_httpd_t* httpd, qse_httpd_client_t* client)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
static int is_client_allowed (qse_httpd_t* httpd, qse_httpd_client_t* client)
 | 
			
		||||
{
 | 
			
		||||
	qse_httpd_mod_t* mod;
 | 
			
		||||
 | 
			
		||||
/* TODO: no sequential search. speed up */
 | 
			
		||||
	for (mod = httpd->modlist; mod;  mod = mod->next)
 | 
			
		||||
	{
 | 
			
		||||
		if (mod->new_client) mod->new_client (httpd, client);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static int accept_client (
 | 
			
		||||
	qse_httpd_t* httpd, void* mux, qse_ubi_t handle, int mask, void* cbarg)
 | 
			
		||||
{
 | 
			
		||||
@ -642,6 +658,14 @@ qse_printf (QSE_T("failed to accept from server [%s] [%d]\n"), tmp, server->hand
 | 
			
		||||
		if (server->dope.flags & QSE_HTTPD_SERVER_SECURE) clibuf.status |= QSE_HTTPD_CLIENT_SECURE;
 | 
			
		||||
		clibuf.server = server;
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
		if (is_client_allowed (httpd, &clibuf) <= -1)
 | 
			
		||||
		{
 | 
			
		||||
			httpd->opt.scb.client.close (httpd, &clibuf);
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		client = new_client (httpd, &clibuf);
 | 
			
		||||
		if (client == QSE_NULL)
 | 
			
		||||
		{
 | 
			
		||||
@ -649,9 +673,6 @@ qse_printf (QSE_T("failed to accept from server [%s] [%d]\n"), tmp, server->hand
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
printf ("MUX ADDHND CLIENT READ %d\n", client->handle.i);
 | 
			
		||||
#endif
 | 
			
		||||
		if (httpd->opt.scb.mux.addhnd (httpd, mux, client->handle, QSE_HTTPD_MUX_READ, client) <= -1)
 | 
			
		||||
		{
 | 
			
		||||
			free_client (httpd, client);
 | 
			
		||||
@ -682,6 +703,7 @@ printf ("MUX ADDHND CLIENT READ %d\n", client->handle.i);
 | 
			
		||||
			httpd->opt.rcb.logact (httpd, &msg);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user