replaced a few calls to snprintf() with qse_fmtuintmaxtombs().
changed the behavior when handling a query path without a slash
This commit is contained in:
		| @ -21,6 +21,10 @@ | ||||
| #ifndef _QSE_LIB_CMN_SYSCALL_H_ | ||||
| #define _QSE_LIB_CMN_SYSCALL_H_ | ||||
|  | ||||
| #if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) | ||||
| #	error Do not include this file | ||||
| #endif | ||||
|  | ||||
| /* This file defines unix/linux system calls */ | ||||
|  | ||||
| #if defined(HAVE_SYS_TYPES_H) | ||||
|  | ||||
| @ -1049,20 +1049,21 @@ qse_printf (QSE_T("TASK_MAIN_CGI_4\n")); | ||||
| 		if (cgi->resflags & CGI_RES_CLIENT_CHUNK) | ||||
| 		{ | ||||
| 			qse_size_t count, extra; | ||||
| 			qse_mchar_t chunklen[7]; | ||||
|  | ||||
| 			/* this function assumes that the chunk length does not  | ||||
| 			 * exceed 4 hexadecimal digits. */ | ||||
| 			QSE_ASSERT (QSE_SIZEOF(cgi->buf) <= 0xFFFF); | ||||
| 	 | ||||
| #define CHLEN_RESERVE 6  | ||||
|  | ||||
| 	qse_printf (QSE_T("READING CHUNKED MODE...\n")); | ||||
| 			extra = (QSE_SIZEOF(chunklen) - 1) + 2; | ||||
| 			extra = CHLEN_RESERVE + 2; | ||||
| 			count = QSE_SIZEOF(cgi->buf) - cgi->buflen; | ||||
| 			if (count > extra) | ||||
| 			{ | ||||
| 				n = qse_pio_read ( | ||||
| 					&cgi->pio, QSE_PIO_OUT, | ||||
| 					&cgi->buf[cgi->buflen + QSE_SIZEOF(chunklen) - 1],  | ||||
| 					&cgi->buf[cgi->buflen + CHLEN_RESERVE],  | ||||
| 					count - extra | ||||
| 				); | ||||
| 				if (n <= -1) | ||||
| @ -1085,14 +1086,20 @@ qse_printf (QSE_T("TASK_MAIN_CGI_4\n")); | ||||
| 					return 1; | ||||
| 				} | ||||
| 	 | ||||
| 				/* set the chunk length */ | ||||
| /* TODO: chagne snprintf to qse_fmtuintmaxtombs() */ | ||||
| 				snprintf (chunklen, QSE_COUNTOF(chunklen),  | ||||
| 					QSE_MT("%-4lX\r\n"), (unsigned long)n); | ||||
| 				QSE_MEMCPY (&cgi->buf[cgi->buflen], | ||||
| 					chunklen, QSE_SIZEOF(chunklen) - 1); | ||||
| 				cgi->buflen += QSE_SIZEOF(chunklen) - 1 + n; | ||||
| 		 | ||||
| 				/* set the chunk length. if the length string is less  | ||||
| 				 * than 4 digits, the right side of the string is filled | ||||
| 				 * with space letters. for example, the chunk length line | ||||
| 				 * for the length 10 will be "A   \r\n". */ | ||||
| 				cgi->buflen += qse_fmtuintmaxtombs ( | ||||
| 					&cgi->buf[cgi->buflen], CHLEN_RESERVE - 2 + 1, | ||||
| 					n, 16 | QSE_FMTUINTMAXTOMBS_UPPERCASE | QSE_FMTUINTMAXTOMBS_FILLRIGHT,  | ||||
| 					-1, QSE_MT(' '), QSE_NULL | ||||
| 				);  | ||||
| 				cgi->buf[cgi->buflen++] = QSE_MT('\r'); | ||||
| 				cgi->buf[cgi->buflen++] = QSE_MT('\n'); | ||||
|  | ||||
| 				cgi->buflen += n; /* +n for the data read above */ | ||||
|  | ||||
| 				/* set the trailing CR & LF for a chunk */ | ||||
| 				cgi->buf[cgi->buflen++] = QSE_MT('\r'); | ||||
| 				cgi->buf[cgi->buflen++] = QSE_MT('\n'); | ||||
|  | ||||
| @ -20,9 +20,20 @@ | ||||
|  | ||||
| #include "httpd.h" | ||||
| #include "../cmn/mem.h" | ||||
| #include "../cmn/syscall.h" | ||||
| #include <qse/cmn/str.h> | ||||
| #include <qse/cmn/fmt.h> | ||||
| #include <qse/cmn/path.h> | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| 	/* TODO: */ | ||||
| #elif defined(__OS2__) | ||||
| 	/* TODO: */ | ||||
| #elif defined(__DOS__) | ||||
| 	/* TODO: */ | ||||
| #else | ||||
| #	include "../cmn/syscall.h" | ||||
| #endif | ||||
|  | ||||
| #include <qse/cmn/stdio.h> /* TODO: remove this */ | ||||
|  | ||||
| typedef struct task_dir_t task_dir_t; | ||||
| @ -106,13 +117,15 @@ static void fill_chunk_length (task_dseg_t* ctx) | ||||
| 	int x; | ||||
|  | ||||
| 	/* right alignment with space padding on the left */ | ||||
| /* TODO: change snprintf to qse_fmtuintmaxtombs() */ | ||||
| 	x = snprintf ( | ||||
| 	x = qse_fmtuintmaxtombs ( | ||||
| 		ctx->buf, (SIZE_CHLEN + SIZE_CHLENCRLF) - 1,  | ||||
| 		QSE_MT("%*lX"), (int)(SIZE_CHLEN + SIZE_CHLENCRLF - 2),  | ||||
| 		(unsigned long)(ctx->chunklen - (SIZE_CHLEN + SIZE_CHLENCRLF)));	 | ||||
|  | ||||
| 	/* i don't check the error of snprintf because i've secured the  | ||||
| 		(ctx->chunklen - (SIZE_CHLEN + SIZE_CHLENCRLF)), /* value to convert */ | ||||
| 		16 | QSE_FMTUINTMAXTOMBS_UPPERCASE, /* uppercase hexadecimal letters */ | ||||
| 		-1, /* no particular precision - want space filled if less than 4 digits */ | ||||
| 		QSE_MT(' '),  /* fill with space */ | ||||
| 		QSE_NULL | ||||
| 	); | ||||
| 	/* i don't check the buffer size error because i've secured the  | ||||
| 	 * suffient space for the chunk length at the beginning of the buffer */ | ||||
| 	 | ||||
| 	/* CHLENCRLF */ | ||||
| @ -380,7 +393,6 @@ static qse_httpd_task_t* entask_directory_segment ( | ||||
| 	task.fini = task_fini_dseg; | ||||
| 	task.ctx = &data; | ||||
|  | ||||
| qse_printf (QSE_T("Debug: entasking directory segment (%d)\n"), client->handle.i); | ||||
| 	return qse_httpd_entask (httpd, client, pred, &task, QSE_SIZEOF(data) + data.path.len + 1 + data.qpath.len + 1); | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -20,11 +20,21 @@ | ||||
|  | ||||
| #include "httpd.h" | ||||
| #include "../cmn/mem.h" | ||||
| #include "../cmn/syscall.h" | ||||
| #include <qse/cmn/str.h> | ||||
| #include <qse/cmn/fmt.h> | ||||
| #include <qse/cmn/path.h> | ||||
| #include <qse/cmn/time.h> | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| 	/* TODO: */ | ||||
| #elif defined(__OS2__) | ||||
| 	/* TODO: */ | ||||
| #elif defined(__DOS__) | ||||
| 	/* TODO: */ | ||||
| #else | ||||
| #	include "../cmn/syscall.h" | ||||
| #endif | ||||
|  | ||||
| #include <qse/cmn/stdio.h> /* TODO: remove this */ | ||||
|  | ||||
| #define ETAG_LEN_MAX 127 | ||||
| @ -120,7 +130,6 @@ static qse_httpd_task_t* entask_file_segment ( | ||||
| 	task.fini = task_fini_fseg; | ||||
| 	task.ctx = &data; | ||||
|  | ||||
| qse_printf (QSE_T("Debug: entasking file segment (%d)\n"), client->handle.i); | ||||
| 	return qse_httpd_entask (httpd, client, pred, &task, QSE_SIZEOF(data)); | ||||
| } | ||||
|  | ||||
| @ -162,8 +171,6 @@ static QSE_INLINE int task_main_file ( | ||||
| /* TODO: if you should deal with files on a network-mounted drive, | ||||
|          setting a trigger or non-blocking I/O are needed. */ | ||||
|  | ||||
| qse_printf (QSE_T("opening file %hs\n"), file->path); | ||||
| 		 | ||||
| 	httpd->errnum = QSE_HTTPD_ENOERR; | ||||
| 	if (httpd->scb->file.stat (httpd, file->path.ptr, &st) <= -1) | ||||
| 	{ | ||||
|  | ||||
| @ -18,10 +18,6 @@ | ||||
|     License along with QSE. If not, see <htrd://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #if defined(_WIN32) || defined(__DOS__) || defined(__OS2__) | ||||
| /* UNSUPPORTED YET..  */ | ||||
| /* TODO: IMPLEMENT THIS */ | ||||
| #else | ||||
|  | ||||
| #include "httpd.h" | ||||
| #include "../cmn/mem.h" | ||||
| @ -447,10 +443,15 @@ qse_printf (QSE_T("NORMAL REPLY 222222222222222222222 NORMAL REPLY\n")); | ||||
| 		if (proxy->resflags & PROXY_RES_CLIENT_CHUNK && | ||||
| 		    qse_comparehttpversions (&res->version, &qse_http_v11) < 0) | ||||
| 		{ | ||||
| 			qse_mchar_t vbuf[64]; | ||||
| 			snprintf (vbuf, QSE_COUNTOF(vbuf), QSE_MT("HTTP/%d.%d"),  | ||||
| 				(int)proxy->version.major, (int)proxy->version.minor); | ||||
| 			if (qse_mbs_cat (proxy->res, vbuf) == (qse_size_t)-1)  | ||||
| 			qse_mchar_t major[32], minor[32]; | ||||
|  | ||||
| 			qse_fmtuintmaxtombs (major, QSE_COUNTOF(major), proxy->version.major, 10, -1, QSE_MT('\0'), QSE_NULL); | ||||
| 			qse_fmtuintmaxtombs (minor, QSE_COUNTOF(minor), proxy->version.minor, 10, -1, QSE_MT('\0'), QSE_NULL); | ||||
|  | ||||
| 			if (qse_mbs_cat (proxy->res, QSE_MT("HTTP/")) == (qse_size_t)-1 || | ||||
| 			    qse_mbs_cat (proxy->res, major) == (qse_size_t)-1 || | ||||
| 			    qse_mbs_cat (proxy->res, QSE_MT(".")) == (qse_size_t)-1 || | ||||
| 			    qse_mbs_cat (proxy->res, minor) == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				proxy->httpd->errnum = QSE_HTTPD_ENOMEM; | ||||
| 				return -1; | ||||
| @ -1468,4 +1469,3 @@ qse_httpd_task_t* qse_httpd_entaskproxy ( | ||||
| 	); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @ -1675,34 +1675,7 @@ qse_printf (QSE_T("Host not included....\n")); | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #if 0 | ||||
| 	if (peek) | ||||
| 	{ | ||||
| 		if (req->attr.expect && | ||||
| 		    (req->version.major > 1 || | ||||
| 		     (req->version.major == 1 && req->version.minor >= 1)) && | ||||
| 		    !content_received) | ||||
| 		{ | ||||
| /* TODO: check method.... */ | ||||
| 			/* "expect" in the header, version 1.1 or higher, | ||||
| 			 * and no content received yet */ | ||||
|  | ||||
| 			if (qse_mbscasecmp(req->attr.expect, QSE_MT("100-continue")) != 0) | ||||
| 			{ | ||||
| 				if (qse_httpd_entaskerror ( | ||||
| 					httpd, client, QSE_NULL, 417, req) == QSE_NULL) return -1; | ||||
| 				if (qse_httpd_entaskdisconnect ( | ||||
| 					httpd, client, QSE_NULL) == QSE_NULL) return -1; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				/* TODO: determine if to return 100-continue or other errors */ | ||||
| 				if (qse_httpd_entaskcontinue ( | ||||
| 					httpd, client, QSE_NULL, req) == QSE_NULL) return -1; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| #endif | ||||
| 	/* TODO: investigate if the proxy need to handle 100-continue */ | ||||
|  | ||||
| 	if (peek) | ||||
| 	{ | ||||
| @ -1893,12 +1866,15 @@ target->u.proxy.src.u.in4.port = 0; | ||||
| return 0; | ||||
| #endif | ||||
|  | ||||
| 	if (server_xtn->docroot.ptr) | ||||
| 	if (server_xtn->docroot.ptr || qpath[0] != QSE_MT('/')) | ||||
| 	{ | ||||
| 		const qse_mchar_t* ta[3]; | ||||
| 		ta[0] = server_xtn->docroot.ptr; | ||||
| 		ta[1] = qpath; | ||||
| 		ta[2] = QSE_NULL; | ||||
| 		const qse_mchar_t* ta[4]; | ||||
| 		qse_size_t idx = 0; | ||||
| 		 | ||||
| 		if (server_xtn->docroot.ptr) ta[idx++] = server_xtn->docroot.ptr; | ||||
| 		if (qpath[0] != QSE_MT('/')) ta[idx++] = QSE_MT("/");	 | ||||
| 		ta[idx++] = qpath; | ||||
| 		ta[idx++] = QSE_NULL; | ||||
| 		xpath = qse_mbsadup (ta, httpd->mmgr); | ||||
| 		if (xpath == QSE_NULL) | ||||
| 		{ | ||||
| @ -1985,6 +1961,7 @@ return 0; | ||||
| 		target->u.file.mime = | ||||
| 			qse_mbsend (qpath, QSE_MT(".html"))? QSE_MT("text/html"): | ||||
| 			qse_mbsend (qpath, QSE_MT(".txt"))?  QSE_MT("text/plain"): | ||||
| 			qse_mbsend (qpath, QSE_MT(".log"))?  QSE_MT("text/plain"): | ||||
| 			qse_mbsend (qpath, QSE_MT(".css"))?  QSE_MT("text/css"): | ||||
| 			qse_mbsend (qpath, QSE_MT(".xml"))?  QSE_MT("text/xml"): | ||||
| 			qse_mbsend (qpath, QSE_MT(".js"))?   QSE_MT("application/javascript"): | ||||
|  | ||||
| @ -19,19 +19,10 @@ | ||||
|  */ | ||||
|  | ||||
| #include "httpd.h" | ||||
| #include "../cmn/mem.h" | ||||
| #include <qse/cmn/str.h> | ||||
| #include <qse/cmn/fmt.h> | ||||
| #include "../cmn/mem.h" | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| 	/* TODO */ | ||||
| #elif defined(__DOS__) | ||||
| 	/* TODO */ | ||||
| #elif defined(__OS2__) | ||||
| 	/* TODO */ | ||||
| #else | ||||
| #	include "../cmn/syscall.h" | ||||
| #endif | ||||
|  | ||||
| #include <stdarg.h> | ||||
| #include <qse/cmn/stdio.h> /* TODO: remove this */ | ||||
|  | ||||
| @ -20,8 +20,6 @@ | ||||
|  | ||||
| #include "httpd.h" | ||||
| #include "../cmn/mem.h" | ||||
| #include "../cmn/syscall.h" | ||||
|  | ||||
| #include <qse/cmn/chr.h> | ||||
| #include <qse/cmn/str.h> | ||||
| #include <qse/cmn/mbwc.h> | ||||
| @ -661,7 +659,7 @@ qse_printf (QSE_T("Error: failed to read from a client %d\n"), client->handle.i) | ||||
| 	} | ||||
| 	else if (m == 0) | ||||
| 	{ | ||||
| qse_printf (QSE_T("Debug: connection closed %d - errno %d\n"), client->handle.i, errno); | ||||
| qse_printf (QSE_T("Debug: connection closed %d\n"), client->handle.i); | ||||
| 		/* reading from the client returned 0. this typically | ||||
| 		 * happens when the client closes the connection or | ||||
| 		 * shutdown the writing half of the socket. it's | ||||
|  | ||||
		Reference in New Issue
	
	Block a user