added QSE_HTRD_STRICT
added qse_perdechttpstr()
This commit is contained in:
parent
8ccc2698d6
commit
4488041fd3
@ -49,7 +49,8 @@ enum qse_htrd_option_t
|
||||
QSE_HTRD_PEEKONLY = (1 << 2), /**< trigger a peek callback after headers without processing contents */
|
||||
QSE_HTRD_REQUEST = (1 << 3), /**< parse input as a request */
|
||||
QSE_HTRD_RESPONSE = (1 << 4), /**< parse input as a response */
|
||||
QSE_HTRD_TRAILERS = (1 << 5) /**< store trailers in a separate table */
|
||||
QSE_HTRD_TRAILERS = (1 << 5), /**< store trailers in a separate table */
|
||||
QSE_HTRD_STRICT = (1 << 6) /**< be more picky */
|
||||
};
|
||||
|
||||
typedef enum qse_htrd_option_t qse_htrd_option_t;
|
||||
|
@ -187,6 +187,11 @@ int qse_parsehttpdatetime (
|
||||
);
|
||||
*/
|
||||
|
||||
qse_size_t qse_perdechttpstr (
|
||||
const qse_mchar_t* str,
|
||||
qse_mchar_t* buf
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -302,9 +302,7 @@ static qse_mchar_t* parse_initial_line (
|
||||
/* process the url part */
|
||||
tmp.ptr = p; /* remember the beginning of path*/
|
||||
param.ptr = QSE_NULL;
|
||||
|
||||
/* TODO: maintain undecode path....???? */
|
||||
|
||||
#if 0
|
||||
out = p;
|
||||
while (*p != QSE_MT('\0') && !is_space_octet(*p))
|
||||
{
|
||||
@ -333,7 +331,7 @@ static qse_mchar_t* parse_initial_line (
|
||||
}
|
||||
else if (*p == QSE_MT('?'))
|
||||
{
|
||||
if (!param.ptr)
|
||||
if (param.ptr == QSE_NULL)
|
||||
{
|
||||
/* ? must be explicit to be an argument instroducer.
|
||||
* %3f is just a literal. */
|
||||
@ -365,6 +363,32 @@ static qse_mchar_t* parse_initial_line (
|
||||
htrd->re.u.q.path = tmp.ptr;
|
||||
htrd->re.u.q.param = QSE_NULL;
|
||||
}
|
||||
#else
|
||||
while (*p != QSE_MT('\0') && !is_space_octet(*p))
|
||||
{
|
||||
if (*p == QSE_MT('?') && param.ptr == QSE_NULL)
|
||||
{
|
||||
*p++ = QSE_MT('\0'); /* null-terminate the path part */
|
||||
param.ptr = p;
|
||||
}
|
||||
else p++;
|
||||
}
|
||||
|
||||
/* the url must be followed by a space */
|
||||
if (!is_space_octet(*p)) goto badre;
|
||||
*p = QSE_MT('\0'); /* null-terminate the path or param part */
|
||||
|
||||
if (param.ptr)
|
||||
{
|
||||
htrd->re.u.q.path = tmp.ptr;
|
||||
htrd->re.u.q.param = param.ptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
htrd->re.u.q.path = tmp.ptr;
|
||||
htrd->re.u.q.param = QSE_NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* skip spaces after the url part */
|
||||
do { p++; } while (is_space_octet(*p));
|
||||
@ -763,7 +787,20 @@ qse_mchar_t* parse_header_field (
|
||||
}
|
||||
name.len = last - name.ptr;
|
||||
|
||||
if (*p != QSE_MT(':')) goto badhdr;
|
||||
if (*p != QSE_MT(':'))
|
||||
{
|
||||
if (!(htrd->option & QSE_HTRD_STRICT))
|
||||
{
|
||||
while (is_space_octet(*p)) p++;
|
||||
if (*p == QSE_MT('\n'))
|
||||
{
|
||||
/* ignore a line without a colon */
|
||||
p++;
|
||||
return p;
|
||||
}
|
||||
}
|
||||
goto badhdr;
|
||||
}
|
||||
*last = '\0';
|
||||
|
||||
/* skip the colon and spaces after it */
|
||||
|
@ -194,5 +194,33 @@ int qse_parsehttpdatetime (const qse_mchar_t* str, qse_ntime_t* t)
|
||||
}
|
||||
#endif
|
||||
|
||||
qse_size_t qse_perdechttpstr (const qse_mchar_t* str, qse_mchar_t* buf)
|
||||
{
|
||||
const qse_mchar_t* p = str;
|
||||
qse_mchar_t* out = buf;
|
||||
|
||||
while (*p != QSE_T('\0'))
|
||||
{
|
||||
if (*p == QSE_MT('%') && *(p+1) != QSE_MT('\0') && *(p+2) != QSE_MT('\0'))
|
||||
{
|
||||
int q = QSE_MXDIGITTONUM (*(p+1));
|
||||
if (q >= 0)
|
||||
{
|
||||
int w = QSE_MXDIGITTONUM (*(p+2));
|
||||
if (w >= 0)
|
||||
{
|
||||
/* unlike the path part, we don't care if it
|
||||
* contains a null character */
|
||||
*out++ = ((q << 4) + w);
|
||||
p += 3;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*out++ = *p++;
|
||||
}
|
||||
|
||||
*out = QSE_MT('\0');
|
||||
return out - buf;
|
||||
}
|
||||
|
@ -717,10 +717,6 @@ qse_printf (QSE_T(">>>>> Returning failure for client %d\n"), client->handle.i);
|
||||
}
|
||||
}
|
||||
|
||||
/* feed may have called the request callback multiple times...
|
||||
* that's because we don't know how many valid requests
|
||||
* are included in 'buf' */
|
||||
httpd->errnum = QSE_HTTPD_ENOERR;
|
||||
qse_printf (QSE_T("!!!!!FEEDING %d from %d ["), (int)m, (int)client->handle.i);
|
||||
{
|
||||
int i;
|
||||
@ -728,6 +724,10 @@ for (i = 0; i < m; i++) qse_printf (QSE_T("%hc"), buf[i]);
|
||||
}
|
||||
qse_printf (QSE_T("]\n"));
|
||||
|
||||
/* qse_htrd_feed() may call the request callback
|
||||
* multiple times. that's because we don't know
|
||||
* how many valid requests are included in 'buf'. */
|
||||
httpd->errnum = QSE_HTTPD_ENOERR;
|
||||
if (qse_htrd_feed (client->htrd, buf, m) <= -1)
|
||||
{
|
||||
if (httpd->errnum == QSE_HTTPD_ENOERR)
|
||||
@ -744,6 +744,8 @@ int i;
|
||||
for (i = 0; i < m; i++) qse_printf (QSE_T("%hc"), buf[i]);
|
||||
}
|
||||
qse_printf (QSE_T("]\n"));
|
||||
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -1038,6 +1038,11 @@ static int process_request (
|
||||
method = qse_htre_getqmethodtype(req);
|
||||
content_received = (qse_htre_getcontentlen(req) > 0);
|
||||
|
||||
/* percent-decode the query path to the original buffer
|
||||
* since i'm not gonna need it in the original form
|
||||
* any more */
|
||||
qse_perdechttpstr (qse_htre_getqpath(req), qse_htre_getqpath(req));
|
||||
|
||||
qse_printf (QSE_T("================================\n"));
|
||||
qse_printf (QSE_T("[%lu] %hs REQUEST ==> [%hs] version[%d.%d %hs] method[%hs]\n"),
|
||||
(unsigned long)time(NULL),
|
||||
|
Loading…
Reference in New Issue
Block a user