added QSE_HTTPD_SERVERSTD_PSEUDONYM

This commit is contained in:
2014-07-30 16:42:25 +00:00
parent ae759f21e3
commit 019475149c
6 changed files with 100 additions and 13 deletions

View File

@ -51,6 +51,7 @@ struct task_proxy_t
int keepalive; /* taken from the request */
int raw;
qse_mchar_t* pseudonym;
qse_htrd_t* peer_htrd;
qse_mchar_t* peer_name;
@ -180,16 +181,26 @@ static int proxy_capture_peer_header (qse_htre_t* req, const qse_mchar_t* key, c
if (qse_mbscasecmp (key, QSE_MT("Via")) == 0)
{
qse_mchar_t extra[128];
const qse_mchar_t* pseudonym;
proxy->flags |= PROXY_VIA_RETURNING;
qse_nwadtombs (&proxy->client->local_addr, extra, QSE_COUNTOF(extra), QSE_NWADTOMBS_ALL);
if (proxy->pseudonym[0])
{
pseudonym = proxy->pseudonym;
}
else
{
qse_nwadtombs (&proxy->client->local_addr, extra, QSE_COUNTOF(extra), QSE_NWADTOMBS_ALL);
pseudonym = extra;
}
return proxy_add_header_to_buffer_with_extra_data (
proxy, proxy->res, key, val,
QSE_MT(", %d.%d %hs (%hs)"),
(int)proxy->version.major,
(int)proxy->version.minor,
extra,
pseudonym,
qse_httpd_getname(proxy->httpd));
}
}
@ -245,16 +256,25 @@ static int proxy_capture_client_header (qse_htre_t* req, const qse_mchar_t* key,
if (qse_mbscasecmp (key, QSE_MT("Via")) == 0)
{
qse_mchar_t extra[128];
const qse_mchar_t* pseudonym;
proxy->flags |= PROXY_VIA;
qse_nwadtombs (&proxy->client->local_addr, extra, QSE_COUNTOF(extra), QSE_NWADTOMBS_ALL);
if (proxy->pseudonym[0])
{
pseudonym = proxy->pseudonym;
}
else
{
qse_nwadtombs (&proxy->client->local_addr, extra, QSE_COUNTOF(extra), QSE_NWADTOMBS_ALL);
pseudonym = extra;
}
return proxy_add_header_to_buffer_with_extra_data (
proxy, proxy->reqfwdbuf, key, val,
QSE_MT(", %d.%d %hs (%hs)"),
(int)proxy->version.major,
(int)proxy->version.minor,
extra,
pseudonym,
qse_httpd_getname(proxy->httpd));
}
}
@ -673,16 +693,26 @@ static int proxy_htrd_peek_peer_output (qse_htrd_t* htrd, qse_htre_t* res)
/* add the Via: header into the response if it is not 100. */
qse_size_t tmp;
qse_mchar_t extra[128];
const qse_mchar_t* pseudonym;
qse_http_version_t v;
proxy->flags |= PROXY_VIA_RETURNING;
v = *qse_htre_getversion(res);
qse_nwadtombs (&proxy->client->local_addr, extra, QSE_COUNTOF(extra), QSE_NWADTOMBS_ALL);
if (proxy->pseudonym[0])
{
pseudonym = proxy->pseudonym;
}
else
{
qse_nwadtombs (&proxy->client->local_addr, extra, QSE_COUNTOF(extra), QSE_NWADTOMBS_ALL);
pseudonym = extra;
}
tmp = qse_mbs_fcat (
proxy->res, QSE_MT("Via: %d.%d %hs (%hs)\r\n"),
(int)v.major, (int)v.minor,
extra, qse_httpd_getname(httpd));
pseudonym, qse_httpd_getname(httpd));
if (tmp == (qse_size_t)-1)
{
httpd->errnum = QSE_HTTPD_ENOMEM;
@ -860,6 +890,17 @@ static int task_init_proxy (
proxy->version = *qse_htre_getversion(arg->req);
proxy->keepalive = (arg->req->attr.flags & QSE_HTRE_ATTR_KEEPALIVE);
proxy->pseudonym = (qse_mchar_t*)(proxy + 1);
if (arg->rsrc->pseudonym)
{
len = qse_mbscpy (proxy->pseudonym, arg->rsrc->pseudonym);
}
else
{
proxy->pseudonym[0] = QSE_MT('\0');
len = 0;
}
if (arg->rsrc->flags & QSE_HTTPD_RSRC_PROXY_RAW) proxy->flags |= PROXY_RAW;
proxy->peer.local = arg->rsrc->src.nwad;
if (arg->rsrc->flags & QSE_HTTPD_RSRC_PROXY_DST_STR)
@ -867,7 +908,7 @@ static int task_init_proxy (
qse_mchar_t* colon;
proxy->flags |= PROXY_RESOL_PEER_NAME;
proxy->peer_name = (qse_mchar_t*)(proxy + 1);
proxy->peer_name = proxy->pseudonym + len + 1;
qse_mbscpy (proxy->peer_name, arg->rsrc->dst.str);
colon = qse_mbschr (proxy->peer_name, QSE_MT(':'));
@ -970,14 +1011,23 @@ static int task_init_proxy (
/* add the Via: header into the request */
qse_size_t tmp;
qse_mchar_t extra[128];
const qse_mchar_t* pseudonym;
proxy->flags |= PROXY_VIA;
qse_nwadtombs (&proxy->client->local_addr, extra, QSE_COUNTOF(extra), QSE_NWADTOMBS_ALL);
if (proxy->pseudonym[0])
{
pseudonym = proxy->pseudonym;
}
else
{
qse_nwadtombs (&proxy->client->local_addr, extra, QSE_COUNTOF(extra), QSE_NWADTOMBS_ALL);
pseudonym = extra;
}
tmp = qse_mbs_fcat (
proxy->reqfwdbuf, QSE_MT("Via: %d.%d %hs (%hs)\r\n"),
(int)proxy->version.major, (int)proxy->version.minor,
extra, qse_httpd_getname(httpd));
pseudonym, qse_httpd_getname(httpd));
if (tmp == (qse_size_t)-1) goto oops;
}
@ -1931,8 +1981,14 @@ qse_httpd_task_t* qse_httpd_entaskproxy (
arg.rsrc = proxy;
arg.req = req;
if (proxy->pseudonym)
xtnsize += qse_mbslen (proxy->pseudonym) + 1;
else
xtnsize += 1;
if (proxy->flags & QSE_HTTPD_RSRC_PROXY_DST_STR)
xtnsize = qse_mbslen (proxy->dst.str) + 1;
xtnsize += qse_mbslen (proxy->dst.str) + 1;
QSE_MEMSET (&task, 0, QSE_SIZEOF(task));
task.init = task_init_proxy;

View File

@ -3354,6 +3354,10 @@ static int make_resource (
target->u.proxy.src.nwad.type = target->u.proxy.dst.nwad.type;
}
/* pseudonym for raw proxying should not be useful. set it for consistency */
if (server_xtn->query (httpd, client->server, QSE_NULL, QSE_NULL, QSE_HTTPD_SERVERSTD_PSEUDONYM, &target->u.proxy.pseudonym) <= -1)
target->u.proxy.pseudonym = QSE_NULL;
/* mark that this request is going to be proxied. */
req->attr.flags |= QSE_HTRE_ATTR_PROXIED;
return 0;
@ -3394,6 +3398,9 @@ static int make_resource (
target->u.proxy.src.nwad.type = target->u.proxy.dst.nwad.type;
}
if (server_xtn->query (httpd, client->server, QSE_NULL, QSE_NULL, QSE_HTTPD_SERVERSTD_PSEUDONYM, &target->u.proxy.pseudonym) <= -1)
target->u.proxy.pseudonym = QSE_NULL;
/* TODO: refrain from manipulating the request like this */
req->u.q.path = slash; /* TODO: use setqpath or something... */
@ -3418,6 +3425,9 @@ static int make_resource (
target->u.proxy.dst.nwad = tmp.root.u.nwad;
target->u.proxy.src.nwad.type = target->u.proxy.dst.nwad.type;
if (server_xtn->query (httpd, client->server, QSE_NULL, QSE_NULL, QSE_HTTPD_SERVERSTD_PSEUDONYM, &target->u.proxy.pseudonym) <= -1)
target->u.proxy.pseudonym = QSE_NULL;
/* mark that this request is going to be proxied. */
req->attr.flags |= QSE_HTRE_ATTR_PROXIED;
return 0;
@ -3809,6 +3819,10 @@ static int query_server (
}
return 0;
}
case QSE_HTTPD_SERVERSTD_PSEUDONYM:
*(const qse_mchar_t**)result = QSE_NULL;
return 0;
}
qse_httpd_seterrnum (httpd, QSE_HTTPD_EINVAL);