From cc2aeb50ab3a1c47c43816e0d2f94728982dbd37 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Fri, 31 Oct 2014 10:06:24 +0000 Subject: [PATCH] added qse_httpd_entasktextwithmvk() --- qse/include/qse/http/httpd.h | 23 ++++++++---- qse/lib/http/httpd-text.c | 70 +++++++++++++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 7 deletions(-) diff --git a/qse/include/qse/http/httpd.h b/qse/include/qse/http/httpd.h index 4a7e77b0..a72d87ae 100644 --- a/qse/include/qse/http/httpd.h +++ b/qse/include/qse/http/httpd.h @@ -1173,12 +1173,23 @@ QSE_EXPORT qse_httpd_task_t* qse_httpd_entaskformat ( /* -------------------------------------------- */ QSE_EXPORT qse_httpd_task_t* qse_httpd_entasktext ( - qse_httpd_t* httpd, - qse_httpd_client_t* client, - qse_httpd_task_t* pred, - const qse_mchar_t* text, - const qse_mchar_t* mime, - qse_htre_t* req + qse_httpd_t* httpd, + qse_httpd_client_t* client, + qse_httpd_task_t* pred, + const qse_mchar_t* text, + const qse_mchar_t* mime, + qse_htre_t* req +); + +QSE_EXPORT qse_httpd_task_t* qse_httpd_entasktextwithmvk ( + qse_httpd_t* httpd, + qse_httpd_client_t* client, + qse_httpd_task_t* pred, + const qse_mchar_t* text, + const qse_mchar_t* mime, + qse_http_method_t method, + const qse_http_version_t* version, + int keepalive ); QSE_EXPORT qse_httpd_task_t* qse_httpd_entaskerror ( diff --git a/qse/lib/http/httpd-text.c b/qse/lib/http/httpd-text.c index 625579c7..3b9517e2 100644 --- a/qse/lib/http/httpd-text.c +++ b/qse/lib/http/httpd-text.c @@ -69,14 +69,81 @@ static int task_main_text ( return 1; /* more work to do */ } +qse_httpd_task_t* qse_httpd_entasktextwithmvk ( + qse_httpd_t* httpd, + qse_httpd_client_t* client, + qse_httpd_task_t* pred, + const qse_mchar_t* text, + const qse_mchar_t* mime, + qse_http_method_t method, + const qse_http_version_t* version, + int keepalive) +{ + qse_size_t tlen; + qse_mchar_t b_tlen[64]; + + qse_httpd_task_t task; + task_text_t data; + + switch (method) + { + case QSE_HTTP_HEAD: + tlen = 0; + break; + + case QSE_HTTP_GET: + case QSE_HTTP_POST: + tlen = qse_mbslen(text); + break; + + default: + /* Method not allowed */ + return qse_httpd_entaskerrorwithmvk (httpd, client, pred, 405, method, version, keepalive); + } + + qse_fmtuintmaxtombs (b_tlen, QSE_COUNTOF(b_tlen), tlen, 10, -1, QSE_MT('\0'), QSE_NULL); + pred = qse_httpd_entaskformat ( + httpd, client, pred, + QSE_MT("HTTP/%d.%d 200 OK\r\nServer: %s\r\nDate: %s\r\nConnection: %s\r\nContent-Type: %s\r\nContent-Length: %s\r\n\r\n"), + version->major, version->minor, + qse_httpd_getname (httpd), + qse_httpd_fmtgmtimetobb (httpd, QSE_NULL, 0), + (keepalive? QSE_MT("keep-alive"): QSE_MT("close")), + mime, b_tlen + ); + if (pred == QSE_NULL) return QSE_NULL; + + QSE_MEMSET (&data, 0, QSE_SIZEOF(data)); + data.ptr = text; + data.left = tlen; + + QSE_MEMSET (&task, 0, QSE_SIZEOF(task)); + task.init = task_init_text; + task.main = task_main_text; + task.ctx = &data; + + return qse_httpd_entask (httpd, client, pred, &task, QSE_SIZEOF(data) + data.left); +} + qse_httpd_task_t* qse_httpd_entasktext ( - qse_httpd_t* httpd, + qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* pred, const qse_mchar_t* text, const qse_mchar_t* mime, qse_htre_t* req) { + qse_http_method_t method; + qse_http_version_t* version; + + + method = qse_htre_getqmethodtype (req); + version = qse_htre_getversion (req); + + qse_htre_discardcontent (req); + return qse_httpd_entasktextwithmvk (httpd, client, pred, text, mime, method, version, (req->flags & QSE_HTRE_ATTR_KEEPALIVE)); + +#if 0 qse_size_t tlen; qse_mchar_t b_tlen[64]; qse_http_method_t method; @@ -127,4 +194,5 @@ qse_httpd_task_t* qse_httpd_entasktext ( task.ctx = &data; return qse_httpd_entask (httpd, client, pred, &task, QSE_SIZEOF(data) + data.left); +#endif }