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_PEEKONLY = (1 << 2), /**< trigger a peek callback after headers without processing contents */
|
||||||
QSE_HTRD_REQUEST = (1 << 3), /**< parse input as a request */
|
QSE_HTRD_REQUEST = (1 << 3), /**< parse input as a request */
|
||||||
QSE_HTRD_RESPONSE = (1 << 4), /**< parse input as a response */
|
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;
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -302,9 +302,7 @@ static qse_mchar_t* parse_initial_line (
|
|||||||
/* process the url part */
|
/* process the url part */
|
||||||
tmp.ptr = p; /* remember the beginning of path*/
|
tmp.ptr = p; /* remember the beginning of path*/
|
||||||
param.ptr = QSE_NULL;
|
param.ptr = QSE_NULL;
|
||||||
|
#if 0
|
||||||
/* TODO: maintain undecode path....???? */
|
|
||||||
|
|
||||||
out = p;
|
out = p;
|
||||||
while (*p != QSE_MT('\0') && !is_space_octet(*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('?'))
|
else if (*p == QSE_MT('?'))
|
||||||
{
|
{
|
||||||
if (!param.ptr)
|
if (param.ptr == QSE_NULL)
|
||||||
{
|
{
|
||||||
/* ? must be explicit to be an argument instroducer.
|
/* ? must be explicit to be an argument instroducer.
|
||||||
* %3f is just a literal. */
|
* %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.path = tmp.ptr;
|
||||||
htrd->re.u.q.param = QSE_NULL;
|
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 */
|
/* skip spaces after the url part */
|
||||||
do { p++; } while (is_space_octet(*p));
|
do { p++; } while (is_space_octet(*p));
|
||||||
@ -763,7 +787,20 @@ qse_mchar_t* parse_header_field (
|
|||||||
}
|
}
|
||||||
name.len = last - name.ptr;
|
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';
|
*last = '\0';
|
||||||
|
|
||||||
/* skip the colon and spaces after it */
|
/* skip the colon and spaces after it */
|
||||||
|
@ -194,5 +194,33 @@ int qse_parsehttpdatetime (const qse_mchar_t* str, qse_ntime_t* t)
|
|||||||
}
|
}
|
||||||
#endif
|
#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);
|
qse_printf (QSE_T("!!!!!FEEDING %d from %d ["), (int)m, (int)client->handle.i);
|
||||||
{
|
{
|
||||||
int 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_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 (qse_htrd_feed (client->htrd, buf, m) <= -1)
|
||||||
{
|
{
|
||||||
if (httpd->errnum == QSE_HTTPD_ENOERR)
|
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]);
|
for (i = 0; i < m; i++) qse_printf (QSE_T("%hc"), buf[i]);
|
||||||
}
|
}
|
||||||
qse_printf (QSE_T("]\n"));
|
qse_printf (QSE_T("]\n"));
|
||||||
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1038,6 +1038,11 @@ static int process_request (
|
|||||||
method = qse_htre_getqmethodtype(req);
|
method = qse_htre_getqmethodtype(req);
|
||||||
content_received = (qse_htre_getcontentlen(req) > 0);
|
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("================================\n"));
|
||||||
qse_printf (QSE_T("[%lu] %hs REQUEST ==> [%hs] version[%d.%d %hs] method[%hs]\n"),
|
qse_printf (QSE_T("[%lu] %hs REQUEST ==> [%hs] version[%d.%d %hs] method[%hs]\n"),
|
||||||
(unsigned long)time(NULL),
|
(unsigned long)time(NULL),
|
||||||
|
Loading…
Reference in New Issue
Block a user