tidied up code a bit
This commit is contained in:
parent
578080e071
commit
1d41b3fb2a
28
qse/configure
vendored
28
qse/configure
vendored
@ -17047,6 +17047,34 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t in sys/socket.h" >&5
|
||||||
|
$as_echo_n "checking for socklen_t in sys/socket.h... " >&6; }
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
#define _POSIX_PII_SOCKET
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
socklen_t x = 5;
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
|
||||||
|
$as_echo "#define HAVE_SOCKLEN_T 1" >>confdefs.h
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
|
$as_echo "yes" >&6; }
|
||||||
|
else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
|
||||||
QSE_SIZEOF_WCHAR_T=$ac_cv_sizeof_wchar_t
|
QSE_SIZEOF_WCHAR_T=$ac_cv_sizeof_wchar_t
|
||||||
|
|
||||||
QSE_SIZEOF_LONG_LONG=$ac_cv_sizeof_long_long
|
QSE_SIZEOF_LONG_LONG=$ac_cv_sizeof_long_long
|
||||||
|
@ -214,6 +214,15 @@ fi
|
|||||||
|
|
||||||
AX_PTHREAD()
|
AX_PTHREAD()
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for socklen_t in sys/socket.h])
|
||||||
|
AC_TRY_COMPILE([#define _POSIX_PII_SOCKET
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>], [socklen_t x = 5;],
|
||||||
|
[AC_DEFINE(HAVE_SOCKLEN_T, 1, [Define it socklen_t typedef is in sys/socket.h.])
|
||||||
|
AC_MSG_RESULT(yes)],
|
||||||
|
[AC_MSG_RESULT(no)]
|
||||||
|
)
|
||||||
|
|
||||||
AC_SUBST(QSE_SIZEOF_WCHAR_T, $ac_cv_sizeof_wchar_t)
|
AC_SUBST(QSE_SIZEOF_WCHAR_T, $ac_cv_sizeof_wchar_t)
|
||||||
AC_SUBST(QSE_SIZEOF_LONG_LONG, $ac_cv_sizeof_long_long)
|
AC_SUBST(QSE_SIZEOF_LONG_LONG, $ac_cv_sizeof_long_long)
|
||||||
AC_SUBST(QSE_SIZEOF_LONG, $ac_cv_sizeof_long)
|
AC_SUBST(QSE_SIZEOF_LONG, $ac_cv_sizeof_long)
|
||||||
|
@ -126,6 +126,9 @@
|
|||||||
/* Define to 1 if you have the `sinl' function. */
|
/* Define to 1 if you have the `sinl' function. */
|
||||||
#undef HAVE_SINL
|
#undef HAVE_SINL
|
||||||
|
|
||||||
|
/* Define it socklen_t typedef is in sys/socket.h. */
|
||||||
|
#undef HAVE_SOCKLEN_T
|
||||||
|
|
||||||
/* Define to 1 if you have the `sqrt' function. */
|
/* Define to 1 if you have the `sqrt' function. */
|
||||||
#undef HAVE_SQRT
|
#undef HAVE_SQRT
|
||||||
|
|
||||||
|
@ -53,7 +53,6 @@ struct qse_htrd_recbs_t
|
|||||||
int (*request) (qse_htrd_t* htrd, qse_htre_t* req);
|
int (*request) (qse_htrd_t* htrd, qse_htre_t* req);
|
||||||
int (*expect_continue) (qse_htrd_t* htrd, qse_htre_t* req);
|
int (*expect_continue) (qse_htrd_t* htrd, qse_htre_t* req);
|
||||||
int (*response) (qse_htrd_t* htrd, qse_htre_t* res);
|
int (*response) (qse_htrd_t* htrd, qse_htre_t* res);
|
||||||
int (*qparamstr) (qse_htrd_t* htrd, const qse_mcstr_t* key, const qse_mcstr_t* val);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct qse_htrd_t
|
struct qse_htrd_t
|
||||||
@ -92,12 +91,14 @@ struct qse_htrd_t
|
|||||||
void* chl;
|
void* chl;
|
||||||
} fed;
|
} fed;
|
||||||
|
|
||||||
|
#if 0
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
/* temporary space to store a key and value pair
|
/* temporary space to store a key and value pair
|
||||||
* during the call to qse_http_scanqparamstr() */
|
* during the call to qse_http_scanqparamstr() */
|
||||||
qse_htob_t qparam;
|
qse_htob_t qparam;
|
||||||
} tmp;
|
} tmp;
|
||||||
|
#endif
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -46,6 +46,15 @@ typedef enum qse_httpd_errnum_t qse_httpd_errnum_t;
|
|||||||
typedef struct qse_httpd_cbs_t qse_httpd_cbs_t;
|
typedef struct qse_httpd_cbs_t qse_httpd_cbs_t;
|
||||||
struct qse_httpd_cbs_t
|
struct qse_httpd_cbs_t
|
||||||
{
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
const qse_mchar_t* (*getmimetype) (qse_httpd_t* httpd, const qse_mchar_t* path);
|
||||||
|
|
||||||
|
qse_ubi_t (*open) (qse_httpd_t* httpd, const qse_mchar_t* path);
|
||||||
|
void (*close) (qse_httpd_t* httpd, qse_ubi_t handle);
|
||||||
|
int (*getsize) (qse_httpd_t* httpd, qse_ubi_t handle, qse_foff_t* size);
|
||||||
|
} file;
|
||||||
|
|
||||||
int (*handle_request) (
|
int (*handle_request) (
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_htre_t* req);
|
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_htre_t* req);
|
||||||
int (*handle_expect_continue) (
|
int (*handle_expect_continue) (
|
||||||
|
@ -173,7 +173,9 @@ qse_htrd_t* qse_htrd_init (qse_htrd_t* htrd, qse_mmgr_t* mmgr)
|
|||||||
htrd->mmgr = mmgr;
|
htrd->mmgr = mmgr;
|
||||||
htrd->option = QSE_HTRD_REQUEST | QSE_HTRD_RESPONSE;
|
htrd->option = QSE_HTRD_REQUEST | QSE_HTRD_RESPONSE;
|
||||||
|
|
||||||
|
#if 0
|
||||||
qse_mbs_init (&htrd->tmp.qparam, htrd->mmgr, 0);
|
qse_mbs_init (&htrd->tmp.qparam, htrd->mmgr, 0);
|
||||||
|
#endif
|
||||||
qse_mbs_init (&htrd->fed.b.raw, htrd->mmgr, 0);
|
qse_mbs_init (&htrd->fed.b.raw, htrd->mmgr, 0);
|
||||||
qse_mbs_init (&htrd->fed.b.tra, htrd->mmgr, 0);
|
qse_mbs_init (&htrd->fed.b.tra, htrd->mmgr, 0);
|
||||||
|
|
||||||
@ -181,7 +183,9 @@ qse_htrd_t* qse_htrd_init (qse_htrd_t* htrd, qse_mmgr_t* mmgr)
|
|||||||
{
|
{
|
||||||
qse_mbs_fini (&htrd->fed.b.tra);
|
qse_mbs_fini (&htrd->fed.b.tra);
|
||||||
qse_mbs_fini (&htrd->fed.b.raw);
|
qse_mbs_fini (&htrd->fed.b.raw);
|
||||||
|
#if 0
|
||||||
qse_mbs_fini (&htrd->tmp.qparam);
|
qse_mbs_fini (&htrd->tmp.qparam);
|
||||||
|
#endif
|
||||||
return QSE_NULL;
|
return QSE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,7 +199,9 @@ void qse_htrd_fini (qse_htrd_t* htrd)
|
|||||||
clear_combined_headers (htrd);
|
clear_combined_headers (htrd);
|
||||||
qse_mbs_fini (&htrd->fed.b.tra);
|
qse_mbs_fini (&htrd->fed.b.tra);
|
||||||
qse_mbs_fini (&htrd->fed.b.raw);
|
qse_mbs_fini (&htrd->fed.b.raw);
|
||||||
|
#if 0
|
||||||
qse_mbs_fini (&htrd->tmp.qparam);
|
qse_mbs_fini (&htrd->tmp.qparam);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static qse_mchar_t* parse_initial_line (
|
static qse_mchar_t* parse_initial_line (
|
||||||
@ -1307,6 +1313,7 @@ feedme_more:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
int qse_htrd_scanqparam (qse_htrd_t* htrd, const qse_mcstr_t* cstr)
|
int qse_htrd_scanqparam (qse_htrd_t* htrd, const qse_mcstr_t* cstr)
|
||||||
{
|
{
|
||||||
qse_mcstr_t key, val;
|
qse_mcstr_t key, val;
|
||||||
@ -1412,3 +1419,4 @@ int qse_htrd_scanqparam (qse_htrd_t* htrd, const qse_mcstr_t* cstr)
|
|||||||
qse_mbs_clear (&htrd->tmp.qparam);
|
qse_mbs_clear (&htrd->tmp.qparam);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
@ -53,18 +53,6 @@ QSE_IMPLEMENT_COMMON_FUNCTIONS (httpd)
|
|||||||
|
|
||||||
static void free_listener_list (qse_httpd_t* httpd, listener_t* l);
|
static void free_listener_list (qse_httpd_t* httpd, listener_t* l);
|
||||||
|
|
||||||
static int handle_request (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_htre_t* req);
|
|
||||||
static int handle_expect_continue (
|
|
||||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_htre_t* req);
|
|
||||||
|
|
||||||
static qse_httpd_cbs_t default_cbs =
|
|
||||||
{
|
|
||||||
handle_request,
|
|
||||||
handle_expect_continue
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
qse_httpd_t* qse_httpd_open (qse_mmgr_t* mmgr, qse_size_t xtnsize)
|
qse_httpd_t* qse_httpd_open (qse_mmgr_t* mmgr, qse_size_t xtnsize)
|
||||||
{
|
{
|
||||||
qse_httpd_t* httpd;
|
qse_httpd_t* httpd;
|
||||||
@ -104,7 +92,6 @@ qse_httpd_t* qse_httpd_init (qse_httpd_t* httpd, qse_mmgr_t* mmgr)
|
|||||||
QSE_MEMSET (httpd, 0, QSE_SIZEOF(*httpd));
|
QSE_MEMSET (httpd, 0, QSE_SIZEOF(*httpd));
|
||||||
httpd->mmgr = mmgr;
|
httpd->mmgr = mmgr;
|
||||||
httpd->listener.max = -1;
|
httpd->listener.max = -1;
|
||||||
httpd->cbs = &default_cbs;
|
|
||||||
|
|
||||||
#if defined(HAVE_PTHREAD)
|
#if defined(HAVE_PTHREAD)
|
||||||
pthread_mutex_init (&httpd->listener.mutex, QSE_NULL);
|
pthread_mutex_init (&httpd->listener.mutex, QSE_NULL);
|
||||||
@ -283,186 +270,6 @@ static void purge_tasks_locked (qse_httpd_t* httpd, qse_httpd_client_t* client)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int capture_param (qse_htrd_t* http, const qse_mcstr_t* key, const qse_mcstr_t* val)
|
|
||||||
{
|
|
||||||
qse_printf (QSE_T("PARAM %d[%S] => %d[%S] \n"), (int)key->len, key->ptr, (int)val->len, val->ptr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int handle_request (qse_httpd_t* httpd, qse_httpd_client_t* client, qse_htre_t* req)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
int method;
|
|
||||||
|
|
||||||
method = qse_htre_getqmethod (req);
|
|
||||||
|
|
||||||
if (method == QSE_HTTP_GET || method == QSE_HTTP_POST)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/*if (qse_htrd_scanqparam (http, qse_htre_getqparamcstr(req)) <= -1) */
|
|
||||||
if (qse_htrd_scanqparam (http, QSE_NULL) <= -1)
|
|
||||||
{
|
|
||||||
const char* msg = "<html><head><title>INTERNAL SERVER ERROR</title></head><body><b>INTERNAL SERVER ERROR</b></body></html>";
|
|
||||||
char* text = format_textdup (xtn->httpd,
|
|
||||||
"HTTP/%d.%d 500 Internal Server Error\r\nContent-Length: %d\r\n\r\n%s\r\n\r\n",
|
|
||||||
req->version.major,
|
|
||||||
req->version.minor,
|
|
||||||
(int)strlen(msg) + 4, msg);
|
|
||||||
if (text == QSE_NULL || enqueue_sendduptext_locked (httpd, client, text) <= -1)
|
|
||||||
{
|
|
||||||
if (text) httpd_free (xtn->httpd, text);
|
|
||||||
qse_printf (QSE_T("failed to format text push task....\n"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (method == QSE_HTTP_POST)
|
|
||||||
{
|
|
||||||
if (qse_htrd_scanqparam (http, qse_htre_getcontentcstr(req)) <= -1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fd = open (qse_htre_getqpathptr(req), O_RDONLY);
|
|
||||||
if (fd <= -1)
|
|
||||||
{
|
|
||||||
const char* msg = "<html><head><title>NOT FOUND</title></head><body><b>REQUESTD FILE NOT FOUND</b></body></html>";
|
|
||||||
char* text = format_textdup (
|
|
||||||
httpd,
|
|
||||||
"HTTP/%d.%d 404 Not found\r\nContent-Length: %d\r\n\r\n%s\r\n\r\n",
|
|
||||||
req->version.major,
|
|
||||||
req->version.minor,
|
|
||||||
(int)strlen(msg) + 4, msg
|
|
||||||
);
|
|
||||||
|
|
||||||
if (text == QSE_NULL || enqueue_sendduptext_locked (httpd, client, text) <= -1)
|
|
||||||
{
|
|
||||||
if (text) httpd_free (httpd, text);
|
|
||||||
qse_printf (QSE_T("failed to push task....\n"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
struct stat st;
|
|
||||||
if (fstat (fd, &st) <= -1)
|
|
||||||
{
|
|
||||||
close (fd);
|
|
||||||
|
|
||||||
qse_printf (QSE_T("fstat failure....\n"));
|
|
||||||
}
|
|
||||||
else if (st.st_size <= 0)
|
|
||||||
{
|
|
||||||
close (fd);
|
|
||||||
qse_printf (QSE_T("empty file....\n"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
char text[128];
|
|
||||||
snprintf (text, QSE_SIZEOF(text),
|
|
||||||
"HTTP/%d.%d 200 OK\r\nContent-Length: %llu\r\nContent-Location: %s\r\n\r\n",
|
|
||||||
qse_htre_getmajorversion(req),
|
|
||||||
qse_htre_getminorversion(req),
|
|
||||||
(unsigned long long)st.st_size,
|
|
||||||
qse_htre_getqpathptr(req)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (enqueue_sendtextdup_locked (httpd, client, text) <= -1)
|
|
||||||
{
|
|
||||||
qse_printf (QSE_T("failed to push task....\n"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (enqueue_sendfile_locked (httpd, client, fd) <= -1)
|
|
||||||
{
|
|
||||||
/* TODO: close??? just close....??? */
|
|
||||||
qse_printf (QSE_T("failed to push task....\n"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char text[256];
|
|
||||||
const char* msg = "<html><head><title>Method not allowed</title></head><body><b>METHOD NOT ALLOWED</b></body></html>";
|
|
||||||
snprintf (text, QSE_SIZEOF(text),
|
|
||||||
"HTTP/%d.%d 405 Method not allowed\r\nContent-Length: %d\r\n\r\n%s\r\n\r\n",
|
|
||||||
qse_htre_getmajorversion(req),
|
|
||||||
qse_htre_getminorversion(req),
|
|
||||||
(int)strlen(msg)+4, msg);
|
|
||||||
if (enqueue_sendtextdup_locked (httpd, client, text) <= -1)
|
|
||||||
{
|
|
||||||
qse_printf (QSE_T("failed to push task....\n"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (req->attr.connection_close)
|
|
||||||
{
|
|
||||||
if (enqueue_disconnect (httpd, client) <= -1)
|
|
||||||
{
|
|
||||||
qse_printf (QSE_T("failed to push task....\n"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int handle_expect_continue (qse_httpd_t* httpd, qse_httpd_client_t* client, qse_htre_t* req)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
/*
|
|
||||||
htrd_xtn_t* xtn = (htrd_xtn_t*) qse_htrd_getxtn (http);
|
|
||||||
qse_httpd_client_t* client = &xtn->array->data[xtn->index];
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* TODO: change this whole callback */
|
|
||||||
if (qse_htre_getqmethod(req) == QSE_HTTP_POST)
|
|
||||||
{
|
|
||||||
qse_mchar_t text[32];
|
|
||||||
|
|
||||||
snprintf (text, QSE_SIZEOF(text),
|
|
||||||
QSE_MT("HTTP/%d.%d 100 OK\r\n\r\n"),
|
|
||||||
req->version.major, req->version.minor);
|
|
||||||
|
|
||||||
if (enqueue_sendtextdup_locked (httpd, client, text) <= -1)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qse_mchar_t text[32];
|
|
||||||
|
|
||||||
qse_htre_setdiscard (req, 1);
|
|
||||||
|
|
||||||
snprintf (text, QSE_SIZEOF(text),
|
|
||||||
QSE_MT("HTTP/%d.%d 404 Not found\r\n\r\n"),
|
|
||||||
req->version.major, req->version.minor);
|
|
||||||
|
|
||||||
if (enqueue_sendtextdup_locked (httpd, client, text) <= -1)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int htrd_handle_request (qse_htrd_t* htrd, qse_htre_t* req)
|
static int htrd_handle_request (qse_htrd_t* htrd, qse_htre_t* req)
|
||||||
{
|
{
|
||||||
htrd_xtn_t* xtn = (htrd_xtn_t*) qse_htrd_getxtn (htrd);
|
htrd_xtn_t* xtn = (htrd_xtn_t*) qse_htrd_getxtn (htrd);
|
||||||
@ -477,31 +284,13 @@ static int htrd_handle_expect_continue (qse_htrd_t* htrd, qse_htre_t* req)
|
|||||||
return xtn->httpd->cbs->handle_expect_continue (xtn->httpd, client, req);
|
return xtn->httpd->cbs->handle_expect_continue (xtn->httpd, client, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int htrd_handle_response (qse_htrd_t* htrd, qse_htre_t* res)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
htrd_xtn_t* xtn = (htrd_xtn_t*) qse_htrd_getxtn (htrd);
|
|
||||||
qse_httpd_client_t* client = &xtn->httpd->client.array.data[xtn->client_index];
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* directly send some response saying stupid request... */
|
|
||||||
qse_printf (QSE_T("response received... HTTP/%d.%d %d %.*S\n"),
|
|
||||||
qse_htre_getmajorversion(res),
|
|
||||||
qse_htre_getminorversion(res),
|
|
||||||
qse_htre_getsstatus(res),
|
|
||||||
(int)qse_htre_getsmessagelen(res),
|
|
||||||
qse_htre_getsmessageptr(res)
|
|
||||||
);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static qse_htrd_recbs_t htrd_recbs =
|
static qse_htrd_recbs_t htrd_recbs =
|
||||||
{
|
{
|
||||||
htrd_handle_request,
|
htrd_handle_request,
|
||||||
htrd_handle_expect_continue,
|
htrd_handle_expect_continue,
|
||||||
htrd_handle_response,
|
|
||||||
capture_param
|
/* The response handler is not needed as QSE_HTRD_RESPONSE is truned off */
|
||||||
|
QSE_NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static void deactivate_listener (qse_httpd_t* httpd, listener_t* l)
|
static void deactivate_listener (qse_httpd_t* httpd, listener_t* l)
|
||||||
@ -997,6 +786,10 @@ int qse_httpd_loop (qse_httpd_t* httpd, int threaded)
|
|||||||
"Add listeners before calling qse_httpd_loop()"
|
"Add listeners before calling qse_httpd_loop()"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
QSE_ASSERTX (httpd->cbs != QSE_NULL,
|
||||||
|
"Set httpd callbacks before calling qse_httpd_loop()"
|
||||||
|
);
|
||||||
|
|
||||||
if (httpd->listener.list == QSE_NULL)
|
if (httpd->listener.list == QSE_NULL)
|
||||||
{
|
{
|
||||||
/* no listener specified */
|
/* no listener specified */
|
||||||
|
@ -459,8 +459,9 @@ static int task_main_path (
|
|||||||
data->version.major, data->version.minor,
|
data->version.major, data->version.minor,
|
||||||
(int)qse_mbslen(msg) + 4, msg
|
(int)qse_mbslen(msg) + 4, msg
|
||||||
);
|
);
|
||||||
if (x <= -1) return -1;
|
goto done;
|
||||||
}
|
}
|
||||||
|
fcntl (handle.i, F_SETFD, FD_CLOEXEC);
|
||||||
|
|
||||||
if (fstat (handle.i, &st) <= -1)
|
if (fstat (handle.i, &st) <= -1)
|
||||||
{
|
{
|
||||||
@ -471,13 +472,15 @@ static int task_main_path (
|
|||||||
data->version.major, data->version.minor,
|
data->version.major, data->version.minor,
|
||||||
(int)qse_mbslen(msg) + 4, msg
|
(int)qse_mbslen(msg) + 4, msg
|
||||||
);
|
);
|
||||||
if (x <= -1) goto oops;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (st.st_size < 0) st.st_size = 0; /* can this happen? */
|
if (st.st_size < 0) st.st_size = 0; /* can this happen? */
|
||||||
|
|
||||||
if (data->range.type != QSE_HTTP_RANGE_NONE)
|
if (data->range.type != QSE_HTTP_RANGE_NONE)
|
||||||
{
|
{
|
||||||
|
const qse_mchar_t* mime_type = QSE_NULL;
|
||||||
|
|
||||||
if (data->range.type == QSE_HTTP_RANGE_SUFFIX)
|
if (data->range.type == QSE_HTTP_RANGE_SUFFIX)
|
||||||
{
|
{
|
||||||
if (data->range.to > st.st_size) data->range.to = st.st_size;
|
if (data->range.to > st.st_size) data->range.to = st.st_size;
|
||||||
@ -496,16 +499,25 @@ static int task_main_path (
|
|||||||
data->version.major, data->version.minor,
|
data->version.major, data->version.minor,
|
||||||
(int)qse_mbslen(msg) + 4, msg
|
(int)qse_mbslen(msg) + 4, msg
|
||||||
);
|
);
|
||||||
if (x <= -1) goto oops;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->range.to >= st.st_size) data->range.to = st.st_size - 1;
|
if (data->range.to >= st.st_size) data->range.to = st.st_size - 1;
|
||||||
|
|
||||||
|
if (httpd->cbs->file.getmimetype)
|
||||||
|
{
|
||||||
|
httpd->errnum = QSE_HTTPD_ENOERR;
|
||||||
|
mime_type = httpd->cbs->file.getmimetype (httpd, data->name);
|
||||||
|
/*TODO: how to handle an error... */
|
||||||
|
}
|
||||||
|
|
||||||
#if (QSE_SIZEOF_LONG_LONG > 0)
|
#if (QSE_SIZEOF_LONG_LONG > 0)
|
||||||
x = qse_httpd_entaskformat (httpd, client,
|
x = qse_httpd_entaskformat (httpd, client,
|
||||||
QSE_MT("HTTP/%d.%d 206 Partial content\r\nContent-Length: %llu\r\nContent-Location: %s\r\nContent-Range: bytes %llu-%llu/%llu\r\n\r\n"),
|
QSE_MT("HTTP/%d.%d 206 Partial content\r\n%s%sContent-Length: %llu\r\nContent-Location: %s\r\nContent-Range: bytes %llu-%llu/%llu\r\n\r\n"),
|
||||||
data->version.major,
|
data->version.major,
|
||||||
data->version.minor,
|
data->version.minor,
|
||||||
|
(mime_type? QSE_MT("\r\nContent-Type: "): QSE_MT("")),
|
||||||
|
(mime_type? mime_type: QSE_MT("")),
|
||||||
(unsigned long long)(data->range.to - data->range.from + 1),
|
(unsigned long long)(data->range.to - data->range.from + 1),
|
||||||
data->name,
|
data->name,
|
||||||
(unsigned long long)data->range.from,
|
(unsigned long long)data->range.from,
|
||||||
@ -514,9 +526,11 @@ static int task_main_path (
|
|||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
x = qse_httpd_entaskformat (httpd, client,
|
x = qse_httpd_entaskformat (httpd, client,
|
||||||
QSE_MT("HTTP/%d.%d 206 Partial content\r\nContent-Length: %lu\r\nContent-Location: %s\r\nContent-Range: bytes %lu-%lu/%lu\r\n\r\n"),
|
QSE_MT("HTTP/%d.%d 206 Partial content\r\n%s%sContent-Length: %lu\r\nContent-Location: %s\r\nContent-Range: bytes %lu-%lu/%lu\r\n\r\n"),
|
||||||
data->version.major,
|
data->version.major,
|
||||||
data->version.minor,
|
data->version.minor,
|
||||||
|
(mime_type? QSE_MT("\r\nContent-Type: "): QSE_MT("")),
|
||||||
|
(mime_type? mime_type: QSE_MT("")),
|
||||||
(unsigned long)(data->range.to - data->range.from + 1),
|
(unsigned long)(data->range.to - data->range.from + 1),
|
||||||
data->name,
|
data->name,
|
||||||
(unsigned long)data->range.from,
|
(unsigned long)data->range.from,
|
||||||
@ -524,47 +538,59 @@ static int task_main_path (
|
|||||||
(unsigned long)st.st_size
|
(unsigned long)st.st_size
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
if (x <= -1) goto oops;
|
if (x <= -1) goto done;
|
||||||
|
|
||||||
x = qse_httpd_entaskfile (
|
x = qse_httpd_entaskfile (
|
||||||
httpd, client, handle,
|
httpd, client, handle,
|
||||||
data->range.from,
|
data->range.from,
|
||||||
(data->range.to - data->range.from + 1)
|
(data->range.to - data->range.from + 1)
|
||||||
);
|
);
|
||||||
if (x <= -1) goto oops;
|
if (x <= -1) goto done;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* TODO: int64 format.... don't hard code it llu */
|
/* TODO: int64 format.... don't hard code it llu */
|
||||||
|
const qse_mchar_t* mime_type = QSE_NULL;
|
||||||
|
|
||||||
|
if (httpd->cbs->file.getmimetype)
|
||||||
|
{
|
||||||
|
httpd->errnum = QSE_HTTPD_ENOERR;
|
||||||
|
mime_type = httpd->cbs->file.getmimetype (httpd, data->name);
|
||||||
|
/*TODO: how to handle an error... */
|
||||||
|
}
|
||||||
|
|
||||||
#if (QSE_SIZEOF_LONG_LONG > 0)
|
#if (QSE_SIZEOF_LONG_LONG > 0)
|
||||||
x = qse_httpd_entaskformat (httpd, client,
|
x = qse_httpd_entaskformat (httpd, client,
|
||||||
QSE_MT("HTTP/%d.%d 200 OK\r\nContent-Length: %llu\r\nContent-Location: %s\r\n\r\n"),
|
QSE_MT("HTTP/%d.%d 200 OK\r\n%s%sContent-Length: %llu\r\nContent-Location: %s\r\n\r\n"),
|
||||||
data->version.major,
|
data->version.major,
|
||||||
data->version.minor,
|
data->version.minor,
|
||||||
|
(mime_type? QSE_MT("\r\nContent-Type: "): QSE_MT("")),
|
||||||
|
(mime_type? mime_type: QSE_MT("")),
|
||||||
(unsigned long long)st.st_size,
|
(unsigned long long)st.st_size,
|
||||||
data->name
|
data->name
|
||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
x = qse_httpd_entaskformat (httpd, client,
|
x = qse_httpd_entaskformat (httpd, client,
|
||||||
QSE_MT("HTTP/%d.%d 200 OK\r\nContent-Length: %lu\r\nContent-Location: %s\r\n\r\n"),
|
QSE_MT("HTTP/%d.%d 200 OK\r\n%s%sContent-Length: %lu\r\nContent-Location: %s\r\n\r\n"),
|
||||||
data->version.major,
|
data->version.major,
|
||||||
data->version.minor,
|
data->version.minor,
|
||||||
|
(mime_type? QSE_MT("\r\nContent-Type: "): QSE_MT("")),
|
||||||
|
(mime_type? mime_type: QSE_MT("")),
|
||||||
(unsigned long)st.st_size,
|
(unsigned long)st.st_size,
|
||||||
data->name
|
data->name
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
if (x <= -1) goto oops;
|
if (x <= -1) goto done;
|
||||||
|
|
||||||
x = qse_httpd_entaskfile (httpd, client, handle, 0, st.st_size);
|
x = qse_httpd_entaskfile (httpd, client, handle, 0, st.st_size);
|
||||||
if (x <= -1) goto oops;
|
if (x <= -1) goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
oops:
|
done:
|
||||||
close (handle.i);
|
if (handle.i >= 0) close (handle.i);
|
||||||
return -1;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
int qse_httpd_entaskpath (
|
int qse_httpd_entaskpath (
|
||||||
|
@ -118,6 +118,7 @@ static void sigint (int sig)
|
|||||||
|
|
||||||
static qse_httpd_cbs_t httpd_cbs =
|
static qse_httpd_cbs_t httpd_cbs =
|
||||||
{
|
{
|
||||||
|
{ QSE_NULL },
|
||||||
handle_request,
|
handle_request,
|
||||||
handle_expect_continue
|
handle_expect_continue
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user