diff --git a/qse/cmd/awk/awk.c b/qse/cmd/awk/awk.c index c5d2371d..52b0dae6 100644 --- a/qse/cmd/awk/awk.c +++ b/qse/cmd/awk/awk.c @@ -35,6 +35,7 @@ #include #include #include +#include #define ENABLE_CALLBACK #define ABORT(label) goto label diff --git a/qse/cmd/http/Makefile.am b/qse/cmd/http/Makefile.am index a5fe26a3..1cb49a15 100644 --- a/qse/cmd/http/Makefile.am +++ b/qse/cmd/http/Makefile.am @@ -5,6 +5,10 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/include \ -I$(includedir) + +qsecfgdir = $(sysconfdir)/qse +qsecfg_DATA = httpd.conf httpd-mime.conf + bin_PROGRAMS = qsehttpd qsehttpd_SOURCES = httpd.c diff --git a/qse/cmd/http/Makefile.in b/qse/cmd/http/Makefile.in index 6247462a..cb4d1f93 100644 --- a/qse/cmd/http/Makefile.in +++ b/qse/cmd/http/Makefile.in @@ -15,6 +15,7 @@ @SET_MAKE@ + VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ @@ -51,7 +52,7 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/qse/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(qsecfgdir)" PROGRAMS = $(bin_PROGRAMS) am_qsehttpd_OBJECTS = httpd.$(OBJEXT) qsehttpd_OBJECTS = $(am_qsehttpd_OBJECTS) @@ -92,6 +93,34 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(qsehttpd_SOURCES) DIST_SOURCES = $(qsehttpd_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +DATA = $(qsecfg_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -275,6 +304,8 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/include \ -I$(includedir) +qsecfgdir = $(sysconfdir)/qse +qsecfg_DATA = httpd.conf httpd-mime.conf qsehttpd_SOURCES = httpd.c qsehttpd_LDFLAGS = -L../../lib/xli -L../../lib/http -L../../lib/cmn -L$(libdir) qsehttpd_LDADD = -lqsexli -lqsehttp -lqsecmn $(am__append_1) @@ -393,6 +424,24 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs +install-qsecfgDATA: $(qsecfg_DATA) + @$(NORMAL_INSTALL) + test -z "$(qsecfgdir)" || $(MKDIR_P) "$(DESTDIR)$(qsecfgdir)" + @list='$(qsecfg_DATA)'; test -n "$(qsecfgdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(qsecfgdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(qsecfgdir)" || exit $$?; \ + done + +uninstall-qsecfgDATA: + @$(NORMAL_UNINSTALL) + @list='$(qsecfg_DATA)'; test -n "$(qsecfgdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(qsecfgdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ @@ -478,9 +527,9 @@ distdir: $(DISTFILES) done check-am: all-am check: check-am -all-am: Makefile $(PROGRAMS) +all-am: Makefile $(PROGRAMS) $(DATA) installdirs: - for dir in "$(DESTDIR)$(bindir)"; do \ + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(qsecfgdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -535,7 +584,7 @@ info: info-am info-am: -install-data-am: +install-data-am: install-qsecfgDATA install-dvi: install-dvi-am @@ -581,7 +630,7 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS +uninstall-am: uninstall-binPROGRAMS uninstall-qsecfgDATA .MAKE: install-am install-strip @@ -593,11 +642,11 @@ uninstall-am: uninstall-binPROGRAMS install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-binPROGRAMS + install-qsecfgDATA install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-qsecfgDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/qse/cmd/http/httpd.c b/qse/cmd/http/httpd.c index 3943270f..a7e0af6b 100644 --- a/qse/cmd/http/httpd.c +++ b/qse/cmd/http/httpd.c @@ -12,6 +12,7 @@ #include #include +#include #if defined(_WIN32) # include @@ -72,69 +73,57 @@ static void sig_reconf (int sig) } } +static void setup_signal_handler (int signum, void(*handler)(int)) +{ +#if defined(HAVE_SIGACTION) + struct sigaction act; + qse_memset (&act, 0, QSE_SIZEOF(act)); + act.sa_handler = handler; + sigaction (signum, &act, QSE_NULL); +#else + signal (signum, handler); +#endif +} + static void setup_signal_handlers () { - struct sigaction act; - #if defined(SIGINT) - qse_memset (&act, 0, QSE_SIZEOF(act)); - act.sa_handler = sig_stop; - sigaction (SIGINT, &act, QSE_NULL); + setup_signal_handler (SIGINT, sig_stop); #endif #if defined(SIGTERM) - qse_memset (&act, 0, QSE_SIZEOF(act)); - act.sa_handler = sig_stop; - sigaction (SIGTERM, &act, QSE_NULL); + setup_signal_handler (SIGTERM, sig_stop); #endif #if defined(SIGHUP) - qse_memset (&act, 0, QSE_SIZEOF(act)); - act.sa_handler = sig_reconf; - sigaction (SIGHUP, &act, QSE_NULL); + setup_signal_handler (SIGHUP, sig_reconf); #endif #if defined(SIGUSR1) - qse_memset (&act, 0, QSE_SIZEOF(act)); - act.sa_handler = sig_reconf; - sigaction (SIGUSR1, &act, QSE_NULL); + setup_signal_handler (SIGUSR1, sig_reconf); #endif #if defined(SIGPIPE) - qse_memset (&act, 0, QSE_SIZEOF(act)); - act.sa_handler = SIG_IGN; - sigaction (SIGPIPE, &act, QSE_NULL); + setup_signal_handler (SIGPIPE, SIG_IGN); #endif } static void restore_signal_handlers () { - struct sigaction act; - #if defined(SIGINT) - qse_memset (&act, 0, QSE_SIZEOF(act)); - act.sa_handler = SIG_DFL; - sigaction (SIGINT, &act, QSE_NULL); + setup_signal_handler (SIGINT, SIG_DFL); #endif #if defined(SIGTERM) - qse_memset (&act, 0, QSE_SIZEOF(act)); - act.sa_handler = SIG_DFL; - sigaction (SIGTERM, &act, QSE_NULL); + setup_signal_handler (SIGTERM, SIG_DFL); #endif #if defined(SIGHUP) - qse_memset (&act, 0, QSE_SIZEOF(act)); - act.sa_handler = SIG_DFL; - sigaction (SIGHUP, &act, QSE_NULL); + setup_signal_handler (SIGHUP, SIG_DFL); #endif #if defined(SIGUSR1) - qse_memset (&act, 0, QSE_SIZEOF(act)); - act.sa_handler = SIG_DFL; - sigaction (SIGUSR1, &act, QSE_NULL); + setup_signal_handler (SIGUSR1, SIG_DFL); #endif #if defined(SIGPIPE) - qse_memset (&act, 0, QSE_SIZEOF(act)); - act.sa_handler = SIG_DFL; - sigaction (SIGPIPE, &act, QSE_NULL); + setup_signal_handler (SIGPIPE, SIG_DFL); #endif } @@ -192,6 +181,7 @@ enum struct cgi_t { enum { + CGI_PREFIX, CGI_SUFFIX, CGI_NAME, CGI_MAX @@ -207,6 +197,7 @@ struct cgi_t struct mime_t { enum { + MIME_PREFIX, MIME_SUFFIX, MIME_NAME, MIME_OTHER, @@ -224,6 +215,7 @@ struct access_t /* TODO: support more types like ACCESS_GLOB not-only the base name, find a way to use query path or xpath */ enum { + ACCESS_PREFIX, ACCESS_SUFFIX, ACCESS_NAME, ACCESS_OTHER, @@ -490,7 +482,8 @@ static int query_server ( struct cgi_t* cgi; for (cgi = server_xtn->cgi[i].head; cgi; cgi = cgi->next) { - if ((cgi->type == CGI_SUFFIX && qse_mbsend (xpath_base, cgi->spec)) || + if ((cgi->type == CGI_PREFIX && qse_mbsbeg (xpath_base, cgi->spec)) || + (cgi->type == CGI_SUFFIX && qse_mbsend (xpath_base, cgi->spec)) || (cgi->type == CGI_NAME && qse_mbscmp (xpath_base, cgi->spec) == 0)) { scgi->cgi = 1; @@ -517,7 +510,8 @@ static int query_server ( struct mime_t* mime; for (mime = server_xtn->mime[i].head; mime; mime = mime->next) { - if ((mime->type == MIME_SUFFIX && qse_mbsend (xpath_base, mime->spec)) || + if ((mime->type == MIME_PREFIX && qse_mbsbeg (xpath_base, mime->spec)) || + (mime->type == MIME_SUFFIX && qse_mbsend (xpath_base, mime->spec)) || (mime->type == MIME_NAME && qse_mbscmp (xpath_base, mime->spec) == 0) || mime->type == MIME_OTHER) { @@ -546,7 +540,8 @@ static int query_server ( struct access_t* access; for (access = server_xtn->access[id][i].head; access; access = access->next) { - if ((access->type == ACCESS_SUFFIX && qse_mbsend (xpath_base, access->spec)) || + if ((access->type == ACCESS_PREFIX && qse_mbsbeg (xpath_base, access->spec)) || + (access->type == ACCESS_SUFFIX && qse_mbsend (xpath_base, access->spec)) || (access->type == ACCESS_NAME && qse_mbscmp (xpath_base, access->spec) == 0) || access->type == ACCESS_OTHER) { @@ -645,14 +640,9 @@ static int load_server_config ( struct cgi_t* cgi; int type; - if (qse_strcmp (pair->key, QSE_T("suffix")) == 0) - { - type = CGI_SUFFIX; - } - else if (qse_strcmp (pair->key, QSE_T("name")) == 0) - { - type = CGI_NAME; - } + if (qse_strcmp (pair->key, QSE_T("prefix")) == 0) type = CGI_PREFIX; + else if (qse_strcmp (pair->key, QSE_T("suffix")) == 0) type = CGI_SUFFIX; + else if (qse_strcmp (pair->key, QSE_T("name")) == 0) type = CGI_NAME; else continue; cgi = qse_httpd_callocmem (httpd, QSE_SIZEOF(*cgi)); @@ -726,7 +716,8 @@ static int load_server_config ( struct mime_t* mime; int type; - if (qse_strcmp (pair->key, QSE_T("suffix")) == 0 && pair->name) type = MIME_SUFFIX; + if (qse_strcmp (pair->key, QSE_T("prefix")) == 0 && pair->name) type = MIME_PREFIX; + else if (qse_strcmp (pair->key, QSE_T("suffix")) == 0 && pair->name) type = MIME_SUFFIX; else if (qse_strcmp (pair->key, QSE_T("name")) == 0 && pair->name) type = MIME_NAME; else if (qse_strcmp (pair->key, QSE_T("other")) == 0 && !pair->name) type = MIME_OTHER; else continue; @@ -793,7 +784,8 @@ static int load_server_config ( const qse_char_t* tmp; int type, value; - if (qse_strcmp (pair->key, QSE_T("suffix")) == 0 && pair->name) type = ACCESS_SUFFIX; + if (qse_strcmp (pair->key, QSE_T("prefix")) == 0 && pair->name) type = ACCESS_PREFIX; + else if (qse_strcmp (pair->key, QSE_T("suffix")) == 0 && pair->name) type = ACCESS_SUFFIX; else if (qse_strcmp (pair->key, QSE_T("name")) == 0 && pair->name) type = ACCESS_NAME; else if (qse_strcmp (pair->key, QSE_T("other")) == 0 && !pair->name) type = ACCESS_OTHER; else continue; diff --git a/qse/cmd/http/httpd.conf b/qse/cmd/http/httpd.conf index b1fd4fea..d3ba64a8 100644 --- a/qse/cmd/http/httpd.conf +++ b/qse/cmd/http/httpd.conf @@ -17,9 +17,9 @@ default { "index.cgi"; cgi { - name "t3.nph" = "nph"; + #name "t3.nph" = "nph"; suffix ".cgi"; - suffix ".ant" = "nph", ""; + suffix ".nph" = "nph"; suffix ".awk" = "cgi", "/usr/bin/qseawk -f"; # glob is not supported yet @@ -32,20 +32,22 @@ default { # control access to directories dir-access { - # suffix ".xxxx" = ok; - # name "xxxxx" = ok; - other = noent; + #prefix ".xxxx" = ok; + #suffix ".xxxx" = ok; + #name "xxxxx" = ok; + #other = noent; } # control access to normal files. # cgi scripts are not control by these. file-access { + #prefix "index.html." = ok; suffix ".html" = ok; suffix ".css" = ok; suffix ".js" = ok; suffix ".png" = ok; suffix ".jpg" = ok; - other = noent; + #other = noent; } dir-css = ""; diff --git a/qse/cmd/sed/sed.c b/qse/cmd/sed/sed.c index 7976fdbf..0f7314ec 100644 --- a/qse/cmd/sed/sed.c +++ b/qse/cmd/sed/sed.c @@ -33,6 +33,7 @@ #include #include +#include #if defined(_WIN32) # include diff --git a/qse/configure b/qse/configure index ecee4753..5a770843 100755 --- a/qse/configure +++ b/qse/configure @@ -17618,6 +17618,18 @@ _ACEOF fi done +for ac_func in _vsnprintf _vsnwprintf +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + OLDLIBS="$LIBS" LIBS="$LIBM $LIBS" diff --git a/qse/configure.ac b/qse/configure.ac index 0daa8f45..51dc7213 100644 --- a/qse/configure.ac +++ b/qse/configure.ac @@ -136,6 +136,7 @@ AC_CHECK_FUNCS([backtrace backtrace_symbols]) AC_CHECK_FUNCS([fdopendir]) AC_CHECK_FUNCS([fork vfork posix_spawn gettid nanosleep select]) AC_CHECK_FUNCS([makecontext swapcontext getcontext setcontext]) +AC_CHECK_FUNCS([_vsnprintf _vsnwprintf]) OLDLIBS="$LIBS" LIBS="$LIBM $LIBS" diff --git a/qse/include/qse/config.h.in b/qse/include/qse/config.h.in index 491ebf7d..13227a58 100644 --- a/qse/include/qse/config.h.in +++ b/qse/include/qse/config.h.in @@ -568,6 +568,12 @@ /* This value is set to 1 to indicate that the system argz facility works */ #undef HAVE_WORKING_ARGZ +/* Define to 1 if you have the `_vsnprintf' function. */ +#undef HAVE__VSNPRINTF + +/* Define to 1 if you have the `_vsnwprintf' function. */ +#undef HAVE__VSNWPRINTF + /* Define if the OS needs help to load dependent libraries for dlopen(). */ #undef LTDL_DLOPEN_DEPLIBS diff --git a/qse/include/qse/xli/xli.h b/qse/include/qse/xli/xli.h index ff2e6e9c..87b55b00 100644 --- a/qse/include/qse/xli/xli.h +++ b/qse/include/qse/xli/xli.h @@ -106,7 +106,7 @@ enum qse_xli_atom_type_t typedef enum qse_xli_atom_type_t qse_xli_atom_type_t; #define QSE_XLI_VAL_HDR \ - qse_xli_val_type_t type; + qse_xli_val_type_t type struct qse_xli_val_t { @@ -500,7 +500,7 @@ QSE_EXPORT qse_xli_pair_t* qse_xli_insertpairwithstr ( ); -qse_xli_pair_t* qse_xli_findpairbyname ( +QSE_EXPORT qse_xli_pair_t* qse_xli_findpairbyname ( qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* name diff --git a/qse/lib/cmn/stdio.c b/qse/lib/cmn/stdio.c index 93043861..2619dff5 100644 --- a/qse/lib/cmn/stdio.c +++ b/qse/lib/cmn/stdio.c @@ -161,13 +161,13 @@ int qse_vsprintf (qse_char_t* buf, qse_size_t size, const qse_char_t* fmt, va_li if (nf == NULL) return -1; #if defined(QSE_CHAR_IS_MCHAR) - #if defined(_MSC_VER) || defined(__BORLANDC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200)) + #if defined(_MSC_VER) || defined(__BORLANDC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200)) || defined(HAVE__VSNPRINTF) n = _vsnprintf (buf, size, nf, ap); #else n = vsnprintf (buf, size, nf, ap); #endif #else - #if defined(_MSC_VER) || defined(__BORLANDC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200)) + #if defined(_MSC_VER) || defined(__BORLANDC__) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200)) || defined(HAVE__VSNWPRINTF) n = _vsnwprintf (buf, size, nf, ap); #else n = vswprintf (buf, size, nf, ap); diff --git a/qse/lib/http/httpd-proxy.c b/qse/lib/http/httpd-proxy.c index 6efa08f0..71024ef1 100644 --- a/qse/lib/http/httpd-proxy.c +++ b/qse/lib/http/httpd-proxy.c @@ -24,8 +24,6 @@ #include #include -#include /* TODO: remove this.*/ - typedef struct task_proxy_arg_t task_proxy_arg_t; struct task_proxy_arg_t { @@ -96,6 +94,17 @@ struct proxy_peer_htrd_xtn_t qse_httpd_task_t* task; }; +static void log_proxy_error (task_proxy_t* proxy, const qse_mchar_t* shortmsg) +{ + qse_httpd_act_t msg; + qse_size_t pos = 0; + + msg.code = QSE_HTTPD_CATCH_MERRMSG; + pos += qse_mbsxcpy (&msg.u.merrmsg[pos], QSE_COUNTOF(msg.u.merrmsg) - pos, shortmsg); + pos += qse_nwadtombs (&proxy->peer.nwad, &msg.u.merrmsg[pos], QSE_COUNTOF(msg.u.merrmsg) - pos, QSE_NWADTOMBS_ALL); + proxy->httpd->opt.rcb.logact (proxy->httpd, &msg); +} + static int proxy_add_header_to_buffer ( task_proxy_t* proxy, qse_mbs_t* buf, const qse_mchar_t* key, const qse_htre_hdrval_t* val) { @@ -182,8 +191,10 @@ static int proxy_snatch_client_input ( task = (qse_httpd_task_t*)ctx; proxy = (task_proxy_t*)task->ctx; +#if 0 if (ptr) qse_printf (QSE_T("!!!PROXY SNATCHING [%.*hs]\n"), len, ptr); else qse_printf (QSE_T("!!!PROXY SNATCHING DONE\n")); +#endif if (ptr == QSE_NULL) { @@ -260,7 +271,9 @@ else qse_printf (QSE_T("!!!PROXY SNATCHING DONE\n")); } task->trigger[0].mask |= QSE_HTTPD_TASK_TRIGGER_WRITE; +#if 0 qse_printf (QSE_T("!!!PROXY SNATCHED [%.*hs]\n"), len, ptr); +#endif } return 0; @@ -295,7 +308,9 @@ static int proxy_snatch_peer_output ( QSE_ASSERT (len == 0); +#if 0 qse_printf (QSE_T("PROXY GOT ALL RESPONSE>>>>>>>\n")); +#endif if (qse_mbs_cat (proxy->res, QSE_MT("0\r\n")) == (qse_size_t)-1 || qse_htre_walktrailers (req, proxy_capture_peer_trailer, proxy) <= -1 || @@ -352,8 +367,9 @@ static int proxy_htrd_peek_peer_output (qse_htrd_t* htrd, qse_htre_t* res) if ((proxy->resflags & PROXY_RES_AWAIT_100) && qse_htre_getscodeval(res) == 100) { -/* TODO: check if the request contained Expect... */ -qse_printf (QSE_T("10000000000000000000000000000 CONTINUE 10000000000000000000000000000000\n")); + /* TODO: check if the request contained Expect... */ + + /* 100 continue */ proxy->resflags &= ~PROXY_RES_AWAIT_100; proxy->resflags |= PROXY_RES_RECEIVED_100; @@ -381,7 +397,9 @@ qse_printf (QSE_T("10000000000000000000000000000 CONTINUE 1000000000000000000000 proxy->resflags &= ~PROXY_RES_AWAIT_RESHDR; proxy->resflags |= PROXY_RES_RECEIVED_RESHDR; +#if 0 qse_printf (QSE_T("NORMAL REPLY 222222222222222222222 NORMAL REPLY\n")); +#endif keepalive = proxy->keepalive; if (res->attr.flags & QSE_HTRE_ATTR_LENGTH) @@ -521,8 +539,9 @@ qse_printf (QSE_T("NORMAL REPLY 222222222222222222222 NORMAL REPLY\n")); if ((proxy->resflags & PROXY_RES_PEER_LENGTH) && proxy->peer_output_received > proxy->peer_output_length) { - /* TODO: logging?? */ -qse_printf (QSE_T("PROXY PEER FUCKED - RETURNING TOO MUCH...\n")); + if (proxy->httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy redundant output - "); + proxy->httpd->errnum = QSE_HTTPD_EINVAL; /* TODO: change it to a better error code */ return -1; } @@ -565,7 +584,9 @@ qse_printf (QSE_T("PROXY PEER FUCKED - RETURNING TOO MUCH...\n")); /* arrange to store further contents received to proxy->res */ qse_htre_setconcb (res, proxy_snatch_peer_output, xtn->task); } +#if 0 qse_printf (QSE_T("NORMAL REPLY 222222222222222222222 NORMAL REPLY OK\n")); +#endif } proxy->res_pending = QSE_MBS_LEN(proxy->res) - proxy->res_consumed; @@ -574,7 +595,7 @@ qse_printf (QSE_T("NORMAL REPLY 222222222222222222222 NORMAL REPLY OK\n")); static int proxy_htrd_handle_peer_output (qse_htrd_t* htrd, qse_htre_t* req) { -qse_printf (QSE_T("FINISHED READING RESPONSE...\n")); + /* finished reading response from the peer */ return 0; } @@ -599,7 +620,6 @@ static void proxy_forward_client_input_to_peer ( { /* a forwarding error has occurred previously. * clear the forwarding buffer */ -qse_printf (QSE_T("FORWARD: CLEARING REQCON FOR ERROR\n")); qse_mbs_clear (proxy->reqfwdbuf); } else @@ -610,14 +630,18 @@ qse_printf (QSE_T("FORWARD: CLEARING REQCON FOR ERROR\n")); if (writable) goto forward; n = httpd->opt.scb.mux.writable (httpd, proxy->peer.handle, 0); +#if 0 if (n == 0) qse_printf (QSE_T("PROXY FORWARD: @@@@@@@@@NOT WRITABLE\n")); +#endif if (n >= 1) { forward: /* writable */ +#if 0 qse_printf (QSE_T("PROXY FORWARD: @@@@@@@@@@WRITING[%.*hs]\n"), (int)QSE_MBS_LEN(proxy->reqfwdbuf), QSE_MBS_PTR(proxy->reqfwdbuf)); +#endif n = httpd->opt.scb.peer.send ( httpd, &proxy->peer, QSE_MBS_PTR(proxy->reqfwdbuf), @@ -639,8 +663,9 @@ to the head all the time.. grow the buffer to a certain limit. */ if (n <= -1) { -qse_printf (QSE_T("PROXY FORWARD: @@@@@@@@WRITE TO PROXY FAILED\n")); -/* TODO: logging ... */ + if (httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy send-to-peer error - "); + proxy->reqflags |= PROXY_REQ_FWDERR; qse_mbs_clear (proxy->reqfwdbuf); if (proxy->req) @@ -662,7 +687,6 @@ qse_printf (QSE_T("PROXY FORWARD: @@@@@@@@WRITE TO PROXY FAILED\n")); * there is nothing more to forward in the forwarding buffer. * clear the read and write triggers. */ -qse_printf (QSE_T("FORWARD: @@@@@@@@NOTHING MORE TO WRITE TO PROXY\n")); task->trigger[0].mask &= ~QSE_HTTPD_TASK_TRIGGER_WRITE; /* peer */ task->trigger[2].mask = 0; /* client-side */ } @@ -696,8 +720,8 @@ static int task_init_proxy ( * TODO: also change the content length check logic below... * -------------------------------------------------------------------- */ -/* TODO: DETERMINE THIS SIZE */ -len = 1024; + /* TODO: DETERMINE THIS SIZE */ + len = 2048; proxy->reqfwdbuf = qse_mbs_open (httpd->mmgr, 0, (len < 512? 512: len)); if (proxy->reqfwdbuf == QSE_NULL) goto oops; @@ -845,7 +869,9 @@ len = 1024; * triggers in the task initializer. however the main task handler * will be invoked so long as the client handle is writable by * the main loop. */ +#if 0 qse_printf (QSE_T("GOING TO PROXY [%hs]\n"), QSE_MBS_PTR(proxy->reqfwdbuf)); +#endif task->ctx = proxy; return 0; @@ -885,8 +911,10 @@ static int task_main_proxy_5 ( task_proxy_t* proxy = (task_proxy_t*)task->ctx; qse_ssize_t n; +#if 0 qse_printf (QSE_T("task_main_proxy_5 trigger[0].mask=%d trigger[1].mask=%d trigger[2].mask=%d\n"), task->trigger[0].mask, task->trigger[1].mask, task->trigger[2].mask); +#endif if (task->trigger[2].mask & QSE_HTTPD_TASK_TRIGGER_READABLE) { @@ -904,13 +932,14 @@ qse_printf (QSE_T("task_main_proxy_5 trigger[0].mask=%d trigger[1].mask=%d trigg { if (proxy->buflen > 0) { -/* TODO: check if proxy outputs more than content-length if it is set... */ - httpd->errnum = QSE_HTTPD_ENOERR; + /* TODO: check if proxy outputs more than content-length if it is set... */ + n = httpd->opt.scb.client.send (httpd, client, proxy->buf, proxy->buflen); if (n <= -1) { - /* can't return internal server error any more... */ -/* TODO: logging ... */ + /* can't return internal server error any more... */ + if (proxy->httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy send-to-client error - "); return -1; } @@ -931,8 +960,10 @@ static int task_main_proxy_4 ( { task_proxy_t* proxy = (task_proxy_t*)task->ctx; +#if 0 qse_printf (QSE_T("task_main_proxy_4 trigger[0].mask=%d trigger[1].mask=%d trigger[2].mask=%d\n"), task->trigger[0].mask, task->trigger[1].mask, task->trigger[2].mask); +#endif if (task->trigger[2].mask & QSE_HTTPD_TASK_TRIGGER_READABLE) { @@ -943,25 +974,25 @@ qse_printf (QSE_T("task_main_proxy_4 trigger[0].mask=%d trigger[1].mask=%d trigg proxy_forward_client_input_to_peer (httpd, task, 1); } -qse_printf (QSE_T("task_main_proxy_4 about to read from PEER...\n")); if (task->trigger[0].mask & QSE_HTTPD_TASK_TRIGGER_READABLE) { qse_ssize_t n; if (proxy->buflen < QSE_SIZEOF(proxy->buf)) { -qse_printf (QSE_T("task_main_proxy_4 reading from PEER... %d %d\n"), (int)proxy->peer_output_length, (int)proxy->peer_output_received); + /* reading from the peer */ + httpd->errnum = QSE_HTTPD_ENOERR; n = httpd->opt.scb.peer.recv ( httpd, &proxy->peer, &proxy->buf[proxy->buflen], QSE_SIZEOF(proxy->buf) - proxy->buflen ); -qse_printf (QSE_T("task_main_proxy_4 read from PEER...%d\n"), (int)n); if (n <= -1) { /* can't return internal server error any more... */ - /* TODO: loggig ... */ + if (httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy recv-from-peer error - "); return -1; } if (n == 0) @@ -970,7 +1001,8 @@ qse_printf (QSE_T("task_main_proxy_4 read from PEER...%d\n"), (int)n); { if (proxy->peer_output_received < proxy->peer_output_length) { - qse_printf (QSE_T("PROXY FUCKED UP...PEER CLOSING PREMATURELY\n")); + if (httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy premature eof - "); return -1; } } @@ -988,13 +1020,14 @@ qse_printf (QSE_T("task_main_proxy_4 read from PEER...%d\n"), (int)n); { if (proxy->peer_output_received > proxy->peer_output_length) { - /* TODO: proxy returning too much data... something is wrong in PROXY */ - qse_printf (QSE_T("PROXY FUCKED UP...RETURNING TOO MUCH DATA\n")); + /* proxy returning too much data... something is wrong in PROXY */ + if (proxy->httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy redundant output - "); return -1; } else if (proxy->peer_output_received == proxy->peer_output_length) { - qse_printf (QSE_T("PROXY DONE READING\n")); + /* proxy has finished reading all */ task->main = task_main_proxy_5; task->trigger[0].mask = 0; task->trigger[2].mask |= QSE_HTTPD_TASK_TRIGGER_WRITE; @@ -1006,13 +1039,12 @@ qse_printf (QSE_T("task_main_proxy_4 read from PEER...%d\n"), (int)n); /* the main loop invokes the task function only if the client * side is writable. it should be safe to write whenever * this task function is called. */ - httpd->errnum = QSE_HTTPD_ENOERR; n = httpd->opt.scb.client.send (httpd, client, proxy->buf, proxy->buflen); if (n <= -1) { /* can't return internal server error any more... */ - /* TODO: logging ... */ - qse_printf (QSE_T("CGI SEND FAILURE\n")); + if (proxy->httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy send-to-client error - "); return -1; } @@ -1033,8 +1065,10 @@ static int task_main_proxy_3 ( task_proxy_t* proxy = (task_proxy_t*)task->ctx; +#if 0 qse_printf (QSE_T("task_main_proxy_3 trigger[0].mask=%d trigger[1].mask=%d trigger[2].mask=%d\n"), task->trigger[0].mask, task->trigger[1].mask, task->trigger[2].mask); +#endif if (task->trigger[2].mask & QSE_HTTPD_TASK_TRIGGER_READABLE) { @@ -1051,23 +1085,20 @@ qse_printf (QSE_T("task_main_proxy_3 trigger[0].mask=%d trigger[1].mask=%d trigg qse_ssize_t n; qse_size_t count; -qse_printf (QSE_T("[PROXY-----3 SENDING XXXXX]\n")); count = proxy->res_pending; if (count > MAX_SEND_SIZE) count = MAX_SEND_SIZE; if (count > 0) { -qse_printf (QSE_T("[proxy_3 sending %d bytes]\n"), (int)count); - httpd->errnum = QSE_HTTPD_ENOERR; n = httpd->opt.scb.client.send ( httpd, client, &QSE_MBS_CHAR(proxy->res,proxy->res_consumed), count ); - if (n <= -1) { -qse_printf (QSE_T("[proxy-3 send failure....\n")); + if (httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy send-to-client error - "); return -1; } @@ -1084,15 +1115,19 @@ qse_printf (QSE_T("[proxy-3 send failure....\n")); if ((proxy->resflags & PROXY_RES_CLIENT_CHUNK) || ((proxy->resflags & PROXY_RES_PEER_LENGTH) && proxy->peer_output_received >= proxy->peer_output_length)) { +#if 0 qse_printf (QSE_T("SWITINCG TO 55555555555555555555555555 %d %d %d %d\n"), (proxy->resflags & PROXY_RES_CLIENT_CHUNK), (proxy->resflags & PROXY_RES_PEER_LENGTH), (int)proxy->peer_output_received, (int)proxy->peer_output_length); +#endif task->main = task_main_proxy_5; task->trigger[2].mask |= QSE_HTTPD_TASK_TRIGGER_WRITE; } else { +#if 0 qse_printf (QSE_T("SWITICHING TO 4444444444444444444444444444\n")); +#endif task->main = task_main_proxy_4; task->trigger[2].mask &= ~QSE_HTTPD_TASK_TRIGGER_WRITE; } @@ -1109,8 +1144,10 @@ static int task_main_proxy_2 ( task_proxy_t* proxy = (task_proxy_t*)task->ctx; int http_errnum = 500; +#if 0 qse_printf (QSE_T("task_main_proxy_2 trigger[0].mask=%d trigger[1].mask=%d trigger[2].mask=%d\n"), task->trigger[0].mask, task->trigger[1].mask, task->trigger[2].mask); +#endif if (task->trigger[2].mask & QSE_HTTPD_TASK_TRIGGER_READABLE) { @@ -1143,6 +1180,7 @@ qse_printf (QSE_T("task_main_proxy_2 trigger[0].mask=%d trigger[1].mask=%d trigg count = proxy->res_pending; if (count > MAX_SEND_SIZE) count = MAX_SEND_SIZE; +#if 0 qse_printf (QSE_T("[proxy_2 sending %d bytes (index %d)] ["), (int)count, (int)proxy->res_consumed); { @@ -1150,8 +1188,8 @@ int i; for (i = 0; i < count; i++) qse_printf (QSE_T("%hc"), QSE_MBS_CHAR(proxy->res,proxy->res_consumed+i)); } qse_printf (QSE_T("]\n")); +#endif - httpd->errnum = QSE_HTTPD_ENOERR; n = httpd->opt.scb.client.send ( httpd, client, QSE_MBS_CPTR(proxy->res,proxy->res_consumed), @@ -1159,7 +1197,8 @@ qse_printf (QSE_T("]\n")); ); if (n <= -1) { -qse_printf (QSE_T("[proxy-2 send failure....\n")); + if (httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy send-to-client error - "); goto oops; } @@ -1190,7 +1229,8 @@ qse_printf (QSE_T("[proxy-2 send failure....\n")); ); if (n <= -1) { -/* TODO: logging ... */ + if (httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy recv-from-peer error - "); goto oops; } if (n == 0) @@ -1198,9 +1238,11 @@ qse_printf (QSE_T("[proxy-2 send failure....\n")); if (!(proxy->resflags & PROXY_RES_RECEIVED_RESHDR)) { /* end of output from peer before it has seen a header. - * the proxy script must be crooked. */ -/* TODO: logging */ -qse_printf (QSE_T("#####PREMATURE EOF FROM PEER\n")); + * the proxy peer must be crooked. */ + + if (httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy premature eof - "); + if (!(proxy->resflags & PROXY_RES_RECEIVED_100)) http_errnum = 502; goto oops; } @@ -1219,24 +1261,28 @@ qse_printf (QSE_T("#####PREMATURE EOF FROM PEER\n")); return 1; } -qse_printf (QSE_T("#####PREMATURE EOF FROM PEER CLIENT CHUNK\n")); + /* premature eof from the peer */ + if (httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy premature eof - "); goto oops; } } proxy->buflen += n; +#if 0 qse_printf (QSE_T("#####PROXY FEEDING %d [\n"), (int)proxy->buflen); { int i; for (i = 0; i < proxy->buflen; i++) qse_printf (QSE_T("%hc"), proxy->buf[i]); } qse_printf (QSE_T("]\n")); +#endif if (qse_htrd_feed (proxy->peer_htrd, proxy->buf, proxy->buflen) <= -1) { -/* TODO: logging */ -qse_printf (QSE_T("#####INVALID HEADER FROM PEER [%.*hs]\n"), (int)proxy->buflen, proxy->buf); + if (httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy feed error - "); goto oops; } @@ -1267,7 +1313,9 @@ qse_printf (QSE_T("#####INVALID HEADER FROM PEER [%.*hs]\n"), (int)proxy->buflen } else { +#if 0 qse_printf (QSE_T("TRAILING DATA=%d, [%hs]\n"), (int)QSE_MBS_LEN(proxy->res), QSE_MBS_CPTR(proxy->res,proxy->res_consumed)); +#endif /* switch to the next phase */ task->main = task_main_proxy_3; task->trigger[2].mask |= QSE_HTTPD_TASK_TRIGGER_WRITE; @@ -1301,7 +1349,6 @@ static int task_main_proxy_1 ( int http_errnum = 500; /* wait for peer to get connected */ -qse_printf (QSE_T("task_main_proxy_1....\n")); if (task->trigger[0].mask & QSE_HTTPD_TASK_TRIGGER_READABLE || task->trigger[0].mask & QSE_HTTPD_TASK_TRIGGER_WRITABLE) @@ -1312,18 +1359,23 @@ qse_printf (QSE_T("task_main_proxy_1....\n")); n = httpd->opt.scb.peer.connected (httpd, &proxy->peer); if (n <= -1) { - /* improve error conversion */ + /* TODO: translate more error codes to http error codes... */ + if (httpd->errnum == QSE_HTTPD_ENOENT) http_errnum = 404; else if (httpd->errnum == QSE_HTTPD_EACCES || httpd->errnum == QSE_HTTPD_ECONN) http_errnum = 403; -qse_printf (QSE_T("task_main_proxy_1.... ERROR \n")); + + if (httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy connect error - "); + goto oops; } if (n >= 1) { + /* connected to the peer now */ + proxy->peer_status |= PROXY_PEER_CONNECTED; -qse_printf (QSE_T("FINALLY connected to peer ...............................\n")); if (proxy->req) { @@ -1360,7 +1412,6 @@ static int task_main_proxy ( proxy_peer_htrd_xtn_t* xtn; int http_errnum = 500; int n; -qse_printf (QSE_T("task_main_proxy....\n")); if (proxy->init_failed) goto oops; @@ -1384,11 +1435,13 @@ qse_printf (QSE_T("task_main_proxy....\n")); n = httpd->opt.scb.peer.open (httpd, &proxy->peer); if (n <= -1) { -/* TODO: translate error code to http error... */ + /* TODO: translate more error codes to http error codes... */ if (httpd->errnum == QSE_HTTPD_ENOENT) http_errnum = 404; else if (httpd->errnum == QSE_HTTPD_EACCES || httpd->errnum == QSE_HTTPD_ECONN) http_errnum = 403; -qse_printf (QSE_T("caanot open peer....\n")); + + if (httpd->opt.trait & QSE_HTTPD_LOGACT) + log_proxy_error (proxy, "proxy connect error - "); goto oops; } diff --git a/qse/lib/http/httpd-resol.c b/qse/lib/http/httpd-resol.c index 2f327350..45dd7921 100644 --- a/qse/lib/http/httpd-resol.c +++ b/qse/lib/http/httpd-resol.c @@ -63,7 +63,6 @@ static void task_fini_resol ( qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task) { task_resol_t* resol = (task_resol_t*)task->ctx; -qse_printf (QSE_T("task_fini_resol\n")); } static int task_main_resol ( diff --git a/qse/lib/http/httpd-task.c b/qse/lib/http/httpd-task.c index 2fc34dbd..cb928766 100644 --- a/qse/lib/http/httpd-task.c +++ b/qse/lib/http/httpd-task.c @@ -183,7 +183,6 @@ qse_httpd_task_t* qse_httpd_entaskformat ( task.main = task_main_format; task.ctx = &data; -qse_printf (QSE_T("SEND: [%.*hs]\n"), (int)l, buf); return qse_httpd_entask ( httpd, client, pred, &task, QSE_SIZEOF(data)); } diff --git a/qse/lib/http/httpd.c b/qse/lib/http/httpd.c index b648e2bb..9dfcbeac 100644 --- a/qse/lib/http/httpd.c +++ b/qse/lib/http/httpd.c @@ -431,7 +431,9 @@ static void free_client ( qse_htrd_close (client->htrd); +#if 0 qse_printf (QSE_T("Debug: CLOSING SOCKET %d\n"), client->handle.i); +#endif if (client->status & CLIENT_HANDLE_IN_MUX) { @@ -518,10 +520,12 @@ static int accept_client ( if (httpd->opt.scb.server.accept (httpd, server, &clibuf) <= -1) { +#if 0 /* TODO: proper logging */ qse_char_t tmp[128]; qse_nwadtostr (&server->dope.nwad, tmp, QSE_COUNTOF(tmp), QSE_NWADTOSTR_ALL); qse_printf (QSE_T("failed to accept from server [%s] [%d]\n"), tmp, server->handle.i); +#endif return -1; } @@ -538,7 +542,9 @@ qse_printf (QSE_T("failed to accept from server [%s] [%d]\n"), tmp, server->hand return -1; } +#if 0 qse_printf (QSE_T("MUX ADDHND CLIENT READ %d\n"), client->handle.i); +#endif if (httpd->opt.scb.mux.addhnd ( httpd, mux, client->handle, QSE_HTTPD_MUX_READ, client) <= -1) { @@ -605,7 +611,9 @@ static int activate_servers (qse_httpd_t* httpd) /* httpd->opt.rcb.log (httpd, 0, QSE_T("cannot activate %s"), buf); */ +#if 0 qse_printf(QSE_T("cannot activate [%s]\n"), buf); +#endif continue; } @@ -617,7 +625,9 @@ qse_printf(QSE_T("cannot activate [%s]\n"), buf); /* httpd->opt.rcb.log (httpd, 0, QSE_T("cannot activate %s - "), buf); */ +#if 0 qse_printf(QSE_T("cannot add handle [%s]\n"), buf); +#endif httpd->opt.scb.server.close (httpd, server); continue; @@ -1202,7 +1212,9 @@ qse_httpd_task_t* qse_httpd_entask ( httpd->opt.scb.mux.delhnd (httpd, httpd->mux, client->handle); client->status &= ~CLIENT_HANDLE_IN_MUX; +#if 0 qse_printf (QSE_T("MUX ADDHND CLIENT RW(ENTASK) %d\n"), client->handle.i); +#endif if (httpd->opt.scb.mux.addhnd ( httpd, httpd->mux, client->handle, QSE_HTTPD_MUX_READ | QSE_HTTPD_MUX_WRITE,