From 583d61ee2e6342ecf263ffd36e23fb68fc746b74 Mon Sep 17 00:00:00 2001 From: stefanocasazza Date: Tue, 4 Aug 2015 19:41:35 +0200 Subject: [PATCH] PHP script fix --- configure | 58 +++++-- configure.ac | 4 +- include/ulib/command.h | 26 +-- include/ulib/log.h | 2 + include/ulib/net/server/plugin/mod_fcgi.h | 3 +- include/ulib/utility/http2.h | 3 +- include/ulib/utility/uhttp.h | 7 +- m4/ac_compilation_options.m4 | 54 +++++-- src/ulib/net/server/plugin/mod_fcgi.cpp | 10 +- src/ulib/net/server/plugin/mod_http.cpp | 2 +- src/ulib/net/server/plugin/mod_proxy.cpp | 2 +- src/ulib/net/server/plugin/php/mod_php.cpp | 111 ++++++------- src/ulib/utility/http2.cpp | 180 +++++++++++++++------ src/ulib/utility/uhttp.cpp | 125 +++++++------- tests/examples/Makefile.am | 2 +- tests/examples/Makefile.in | 2 +- tests/examples/php.sh | 93 +++++++++++ tests/examples/web_server.test | 5 +- 18 files changed, 470 insertions(+), 219 deletions(-) create mode 100755 tests/examples/php.sh diff --git a/configure b/configure index 71e4b05b..83098cf9 100755 --- a/configure +++ b/configure @@ -23093,7 +23093,11 @@ if test "${enable_CRPWS+set}" = set; then : fi if test -z "$enable_CRPWS"; then - enable_CRPWS="no" + if test "$enable_debug" = "yes"; then + enable_CRPWS="yes" + else + enable_CRPWS="no" + fi fi if test "$enable_CRPWS" = "yes"; then @@ -23111,7 +23115,11 @@ if test "${enable_check_time+set}" = set; then : fi if test -z "$enable_check_time"; then - enable_check_time="no" + if test "$enable_debug" = "yes"; then + enable_check_time="yes" + else + enable_check_time="no" + fi fi if test "$enable_check_time" = "yes"; then @@ -23165,7 +23173,11 @@ if test "${enable_HIS+set}" = set; then : fi if test -z "$enable_HIS" ; then - enable_HIS="no" + if test "$enable_debug" = "yes"; then + enable_HIS="yes" + else + enable_HIS="no" + fi fi if test "$enable_HIS" = "yes"; then @@ -23183,7 +23195,11 @@ if test "${enable_log+set}" = set; then : fi if test -z "$enable_log"; then - enable_log="no" + if test "$enable_debug" = "yes"; then + enable_log="yes" + else + enable_log="no" + fi fi if test "$enable_log" != "yes"; then @@ -23201,7 +23217,11 @@ if test "${enable_GSDS+set}" = set; then : fi if test -z "$enable_GSDS"; then - enable_GSDS="$enable_debug" + if test "$enable_debug" = "yes"; then + enable_GSDS="yes" + else + enable_GSDS="no" + fi fi if test "$enable_GSDS" = "yes"; then @@ -23219,7 +23239,11 @@ if test "${enable_HCRS+set}" = set; then : fi if test -z "$enable_HCRS"; then - enable_HCRS="yes" + if test "$enable_debug" = "yes"; then + enable_HCRS="no" + else + enable_HCRS="yes" + fi fi if test "$enable_HCRS" != "yes"; then @@ -23237,7 +23261,11 @@ if test "${enable_HPRS+set}" = set; then : fi if test -z "$enable_HPRS"; then - enable_HPRS="yes" + if test "$enable_debug" = "yes"; then + enable_HPRS="no" + else + enable_HPRS="yes" + fi fi if test "$enable_HPRS" != "yes"; then @@ -23291,7 +23319,11 @@ if test "${enable_alias+set}" = set; then : fi if test -z "$enable_alias"; then - enable_alias="no" + if test "$enable_debug" = "yes"; then + enable_alias="yes" + else + enable_alias="no" + fi fi if test "$enable_alias" = "yes"; then @@ -23363,7 +23395,11 @@ if test "${enable_HSTS+set}" = set; then : fi if test -z "$enable_HSTS"; then - enable_HSTS="no" + if test "$enable_debug" = "yes"; then + enable_HSTS="yes" + else + enable_HSTS="no" + fi fi if test "$enable_HSTS" = "yes"; then @@ -25798,7 +25834,7 @@ fi if test -z "$PHPCONFIGINCLUDES"; then - PHPCONFIGINCLUDES="-I${php_prefix}/include/php/sapi/embed `$PHPCONFIG --includes`" + PHPCONFIGINCLUDES="-I${php_prefix}/include/php5/sapi/embed `$PHPCONFIG --includes`" fi @@ -25862,7 +25898,7 @@ fi if test -z "$PHPCONFIGLIBS"; then - PHPCONFIGLIBS="-L`$PHPCONFIG --ldflags`/lib -lphp5 `$PHPCONFIG --libs`" + PHPCONFIGLIBS="-lphp5 `$PHPCONFIG --libs`" fi diff --git a/configure.ac b/configure.ac index cc87fc88..826cc182 100644 --- a/configure.ac +++ b/configure.ac @@ -1275,7 +1275,7 @@ if test "$use_php" = "yes" ; then [PHPCONFIGINCLUDES=""]) if test -z "$PHPCONFIGINCLUDES"; then - PHPCONFIGINCLUDES="-I${php_prefix}/include/php/sapi/embed `$PHPCONFIG --includes`" + PHPCONFIGINCLUDES="-I${php_prefix}/include/php5/sapi/embed `$PHPCONFIG --includes`" fi AC_SUBST(PHPCONFIGINCLUDES) @@ -1312,7 +1312,7 @@ if test "$use_php" = "yes" ; then [PHPCONFIGLIBS=""]) if test -z "$PHPCONFIGLIBS"; then - PHPCONFIGLIBS="-L`$PHPCONFIG --ldflags`/lib -lphp5 `$PHPCONFIG --libs`" + PHPCONFIGLIBS="-lphp5 `$PHPCONFIG --libs`" fi AC_SUBST(PHPCONFIGLIBS) diff --git a/include/ulib/command.h b/include/ulib/command.h index 3c8425f8..9ee27e7f 100644 --- a/include/ulib/command.h +++ b/include/ulib/command.h @@ -19,6 +19,7 @@ #include class UFile; +class UHTTP; class UDialog; class UFileConfig; class UServer_Base; @@ -147,6 +148,17 @@ public: argv_exec[ncmd] = (char*) argument; } + char* getArgument(int n) const __pure + { + U_TRACE(0, "UCommand::getArgument(%d)", n) + + char* result = (argv_exec ? argv_exec[n] : 0); + + U_INTERNAL_ASSERT(result == 0 || u_isText((const unsigned char*)result, u__strlen(result, __PRETTY_FUNCTION__))) + + U_RETURN(result); + } + void setNumArgument(int32_t n = 1, bool bfree = false); // MANAGE FILE ARGUMENT @@ -210,16 +222,7 @@ public: U_RETURN(result); } - char* getCommand() const __pure - { - U_TRACE(0, "UCommand::getCommand()") - - char* result = (argv_exec ? argv_exec[(isShellScript() ? 2 : 0)] : 0); - - U_INTERNAL_ASSERT(result == 0 || u_isText((const unsigned char*)result, u__strlen(result, __PRETTY_FUNCTION__))) - - U_RETURN(result); - } + char* getCommand() const __pure { return getArgument(isShellScript() ? 2 : 0); } // SERVICES @@ -302,7 +305,7 @@ protected: int32_t ncmd, nenv, nfile; UString command, environment; - void setCommand(); + void setCommand(); void freeCommand(); void freeEnvironment(); @@ -322,6 +325,7 @@ private: UCommand& operator=(const UCommand&) { return *this; } #endif + friend class UHTTP; friend class UDialog; friend class UServer_Base; friend class UProxyPlugIn; diff --git a/include/ulib/log.h b/include/ulib/log.h index a3617250..bed24a8f 100644 --- a/include/ulib/log.h +++ b/include/ulib/log.h @@ -18,6 +18,7 @@ #include class UHTTP; +class UHTTP2; class Application; class UTimeThread; class UProxyPlugIn; @@ -166,6 +167,7 @@ private: #endif friend class UHTTP; + friend class UHTTP2; friend class Application; friend class UTimeThread; friend class UProxyPlugIn; diff --git a/include/ulib/net/server/plugin/mod_fcgi.h b/include/ulib/net/server/plugin/mod_fcgi.h index ddb5db68..85c187bd 100644 --- a/include/ulib/net/server/plugin/mod_fcgi.h +++ b/include/ulib/net/server/plugin/mod_fcgi.h @@ -48,8 +48,9 @@ public: #endif protected: + static bool fcgi_keep_conn; + static char environment_type; static UClient_Base* connection; - static bool fcgi_keep_conn, bphp; void set_FCGIBeginRequest(); static void fill_FCGIBeginRequest(u_char type, u_short content_length); diff --git a/include/ulib/utility/http2.h b/include/ulib/utility/http2.h index 4bf99403..bb9aa52f 100644 --- a/include/ulib/utility/http2.h +++ b/include/ulib/utility/http2.h @@ -242,12 +242,13 @@ protected: static void sendError(); static void manageData(); static void manageHeaders(); + static void handlerResponse(); static bool readBodyRequest(); static bool updateSetting(const char* ptr, uint32_t len); static void decodeHeaders(const char* ptr, const char* endptr); #ifdef DEBUG - static const char* getFrameTypeDescription(); + static const char* getFrameTypeDescription(char type); #endif static bool setIndexStaticTable(UHashMap* ptable, const char* key, uint32_t length) diff --git a/include/ulib/utility/uhttp.h b/include/ulib/utility/uhttp.h index 8ec5894e..175bad5a 100644 --- a/include/ulib/utility/uhttp.h +++ b/include/ulib/utility/uhttp.h @@ -531,11 +531,12 @@ public: // CGI typedef struct ucgi { - char sh_script; - char dir[503]; const char* interpreter; + char environment_type; + char dir[503]; } ucgi; + static UCommand* pcmd; static UString* geoip; static UString* fcgi_uri_mask; static UString* scgi_uri_mask; @@ -546,7 +547,7 @@ public: static bool runCGI(bool set_environment); static bool getCGIEnvironment(UString& environment, int mask); static bool processCGIOutput(bool cgi_sh_script, bool bheaders); - static bool processCGIRequest(UCommand& cmd, const char* cgi_dir); + static bool processCGIRequest(UCommand* cmd, UHTTP::ucgi* cgi = 0); // USP (ULib Servlet Page) diff --git a/m4/ac_compilation_options.m4 b/m4/ac_compilation_options.m4 index bbdfbc8d..117bddd4 100644 --- a/m4/ac_compilation_options.m4 +++ b/m4/ac_compilation_options.m4 @@ -91,7 +91,11 @@ AC_DEFUN([AC_COMPILATION_OPTIONS],[ AC_ARG_ENABLE(CRPWS, [ --enable-CRPWS enable Client Response Partial Write Support [[default=no]]]) if test -z "$enable_CRPWS"; then - enable_CRPWS="no" + if test "$enable_debug" = "yes"; then + enable_CRPWS="yes" + else + enable_CRPWS="no" + fi fi if test "$enable_CRPWS" = "yes"; then AC_DEFINE(U_CLIENT_RESPONSE_PARTIAL_WRITE_SUPPORT, 1, [enable client response partial write support]) @@ -102,7 +106,11 @@ AC_DEFUN([AC_COMPILATION_OPTIONS],[ AC_ARG_ENABLE(check-time, [ --enable-check-time enable server check time between request for parallelization [[default=no]]]) if test -z "$enable_check_time"; then - enable_check_time="no" + if test "$enable_debug" = "yes"; then + enable_check_time="yes" + else + enable_check_time="no" + fi fi if test "$enable_check_time" = "yes"; then AC_DEFINE(U_SERVER_CHECK_TIME_BETWEEN_REQUEST, 1, [enable server check time between request for parallelization]) @@ -135,7 +143,11 @@ AC_DEFUN([AC_COMPILATION_OPTIONS],[ AC_ARG_ENABLE(HIS, [ --enable-HIS enable HTTP Inotify Support [[default=no]]]) if test -z "$enable_HIS" ; then - enable_HIS="no" + if test "$enable_debug" = "yes"; then + enable_HIS="yes" + else + enable_HIS="no" + fi fi if test "$enable_HIS" = "yes"; then AC_DEFINE(U_HTTP_INOTIFY_SUPPORT, 1, [enable HTTP inotify support]) @@ -146,7 +158,11 @@ AC_DEFUN([AC_COMPILATION_OPTIONS],[ AC_ARG_ENABLE(log, [ --enable-log enable client and server log support [[default=no]]]) if test -z "$enable_log"; then - enable_log="no" + if test "$enable_debug" = "yes"; then + enable_log="yes" + else + enable_log="no" + fi fi if test "$enable_log" != "yes"; then AC_DEFINE(U_LOG_DISABLE, 1, [disable client and server log support]) @@ -157,7 +173,11 @@ AC_DEFUN([AC_COMPILATION_OPTIONS],[ AC_ARG_ENABLE(GSDS, [ --enable-GSDS enable GDB Stack Dump Support [[default=no]]]) if test -z "$enable_GSDS"; then - enable_GSDS="$enable_debug" + if test "$enable_debug" = "yes"; then + enable_GSDS="yes" + else + enable_GSDS="no" + fi fi if test "$enable_GSDS" = "yes"; then AC_DEFINE(U_GDB_STACK_DUMP_ENABLE, 1, [enable GDB stack dump support]) @@ -168,7 +188,11 @@ AC_DEFUN([AC_COMPILATION_OPTIONS],[ AC_ARG_ENABLE(HCRS, [ --enable-HCRS enable Cache Request Support [[default=no]]]) if test -z "$enable_HCRS"; then - enable_HCRS="yes" + if test "$enable_debug" = "yes"; then + enable_HCRS="no" + else + enable_HCRS="yes" + fi fi if test "$enable_HCRS" != "yes"; then AC_DEFINE(U_CACHE_REQUEST_DISABLE, 1, [disable cache request support]) @@ -179,7 +203,11 @@ AC_DEFUN([AC_COMPILATION_OPTIONS],[ AC_ARG_ENABLE(HPRS, [ --enable-HPRS enable Homogeneous Pipeline Request Support [[default=yes]]]) if test -z "$enable_HPRS"; then - enable_HPRS="yes" + if test "$enable_debug" = "yes"; then + enable_HPRS="no" + else + enable_HPRS="yes" + fi fi if test "$enable_HPRS" != "yes"; then AC_DEFINE(U_PIPELINE_HOMOGENEOUS_DISABLE, 1, [disable homogeneous pipeline request support]) @@ -212,7 +240,11 @@ AC_DEFUN([AC_COMPILATION_OPTIONS],[ AC_ARG_ENABLE(alias, [ --enable-alias enable alias URI support [[default=no]]]) if test -z "$enable_alias"; then - enable_alias="no" + if test "$enable_debug" = "yes"; then + enable_alias="yes" + else + enable_alias="no" + fi fi if test "$enable_alias" = "yes"; then AC_DEFINE(U_ALIAS, 1, [enable alias URI support]) @@ -256,7 +288,11 @@ AC_DEFUN([AC_COMPILATION_OPTIONS],[ AC_ARG_ENABLE(HSTS, [ --enable-HSTS enable HTTP Strict Transport Security support [[default=no]]]) if test -z "$enable_HSTS"; then - enable_HSTS="no" + if test "$enable_debug" = "yes"; then + enable_HSTS="yes" + else + enable_HSTS="no" + fi fi if test "$enable_HSTS" = "yes"; then AC_DEFINE(U_HTTP_STRICT_TRANSPORT_SECURITY, 1, [enable HTTP Strict Transport Security support]) diff --git a/src/ulib/net/server/plugin/mod_fcgi.cpp b/src/ulib/net/server/plugin/mod_fcgi.cpp index f8ff273d..7e91e59d 100644 --- a/src/ulib/net/server/plugin/mod_fcgi.cpp +++ b/src/ulib/net/server/plugin/mod_fcgi.cpp @@ -146,8 +146,8 @@ void UFCGIPlugIn::fill_FCGIBeginRequest(u_char type, u_short content_length) U_CREAT_FUNC(server_plugin_fcgi, UFCGIPlugIn) -bool UFCGIPlugIn::bphp; bool UFCGIPlugIn::fcgi_keep_conn; +char UFCGIPlugIn::environment_type; UClient_Base* UFCGIPlugIn::connection; UFCGIPlugIn::UFCGIPlugIn() @@ -235,7 +235,7 @@ int UFCGIPlugIn::handlerInit() UHTTP::valias->push_back(*UHTTP::fcgi_uri_mask); UHTTP::valias->push_back(U_STRING_FROM_CONSTANT("/nostat")); - bphp = UHTTP::fcgi_uri_mask->equal(U_CONSTANT_TO_PARAM("*.php")); + environment_type = (UHTTP::fcgi_uri_mask->equal(U_CONSTANT_TO_PARAM("*.php")) ? U_PHP : U_CGI); U_RETURN(U_PLUGIN_HANDLER_PROCESSED | U_PLUGIN_HANDLER_GO_ON); # endif @@ -274,7 +274,7 @@ int UFCGIPlugIn::handlerRequest() UString environment(U_CAPACITY); - if (UHTTP::getCGIEnvironment(environment, bphp ? U_PHP : U_CGI) == false) U_RETURN(U_PLUGIN_HANDLER_ERROR); + if (UHTTP::getCGIEnvironment(environment, environment_type) == false) U_RETURN(U_PLUGIN_HANDLER_ERROR); n = u_split(U_STRING_TO_PARAM(environment), envp, 0); @@ -396,7 +396,7 @@ int UFCGIPlugIn::handlerRequest() U_INTERNAL_ASSERT((connection->response.size() - pos) >= FCGI_HEADER_LEN) - h = (FCGI_Header*) connection->response.c_pointer(pos); + h = (FCGI_Header*)connection->response.c_pointer(pos); U_INTERNAL_DUMP("version = %C request_id = %u", h->version, ntohs(h->request_id)) @@ -418,7 +418,7 @@ int UFCGIPlugIn::handlerRequest() // NB: connection->response can be resized... - h = (FCGI_Header*) connection->response.c_pointer(pos); + h = (FCGI_Header*)connection->response.c_pointer(pos); // Record fully read diff --git a/src/ulib/net/server/plugin/mod_http.cpp b/src/ulib/net/server/plugin/mod_http.cpp index 30627c94..a11670b5 100644 --- a/src/ulib/net/server/plugin/mod_http.cpp +++ b/src/ulib/net/server/plugin/mod_http.cpp @@ -450,7 +450,7 @@ int UHttpPlugIn::handlerRun() // NB: we use this method because now we have the UServer_Base::update_date = UServer_Base::update_date3 = true; - UClientImage_Base::iov_vec[1].iov_base = (caddr_t)ULog::date.date3; // Date: Wed, 20 Jun 2012 11:43:17 GMT\r\nServer: ULib\r\n... + UClientImage_Base::iov_vec[1].iov_base = (caddr_t)ULog::date.date3; // Date: Wed, 20 Jun 2012 11:43:17 GMT\r\nServer: ULib\r\nConnection: close\r\n UClientImage_Base::iov_vec[1].iov_len = 6+29+2+12+2+17+2; # if defined(ENABLE_THREAD) && !defined(U_LOG_ENABLE) && !defined(USE_LIBZ) diff --git a/src/ulib/net/server/plugin/mod_proxy.cpp b/src/ulib/net/server/plugin/mod_proxy.cpp index 56ccffd1..158fcb4a 100644 --- a/src/ulib/net/server/plugin/mod_proxy.cpp +++ b/src/ulib/net/server/plugin/mod_proxy.cpp @@ -92,7 +92,7 @@ int UProxyPlugIn::handlerRequest() { if (UHTTP::service->environment) UClientImage_Base::environment->append(UHTTP::service->environment); - if (UHTTP::processCGIRequest(*(UHTTP::service->command), "") && + if (UHTTP::processCGIRequest(UHTTP::service->command) && UHTTP::processCGIOutput(false, false)) { if (UHTTP::service->isResponseForClient()) output_to_client = true; // send output as response to client... diff --git a/src/ulib/net/server/plugin/php/mod_php.cpp b/src/ulib/net/server/plugin/php/mod_php.cpp index 6183d400..3cdf80e2 100644 --- a/src/ulib/net/server/plugin/php/mod_php.cpp +++ b/src/ulib/net/server/plugin/php/mod_php.cpp @@ -45,7 +45,6 @@ static void register_server_variables(zval* track_vars_array TSRMLS_DC) if (UHTTP::getCGIEnvironment(*UClientImage_Base::environment, U_PHP)) { char** envp; - int32_t nenv = UCommand::setEnvironment(*UClientImage_Base::environment, envp); php_import_environment_variables(track_vars_array TSRMLS_CC); @@ -91,6 +90,10 @@ static int send_headers(sapi_headers_struct* sapi_headers) U_http_info.nResponseCode = SG(sapi_headers).http_response_code; + if (U_IS_HTTP_VALID_RESPONSE(U_http_info.nResponseCode) == false) U_http_info.nResponseCode = HTTP_OK; + + U_DUMP("HTTP status = (%d %S)", U_http_info.nResponseCode, UHTTP::getStatusDescription()) + return SAPI_HEADER_SENT_SUCCESSFULLY; } @@ -124,31 +127,23 @@ extern U_EXPORT bool runPHP(const char* script); { U_TRACE(0, "::runPHP(%S)", script) - /* - char str[512]; - zval ret_value; - int exit_status; - - zend_first_try - { - PG(during_request_startup) = 0; - - // run the specified PHP script file - - snprintf(str, sizeof(str), "include (\"%s\");", script); - - zend_eval_string(str, &ret_value, str TSRMLS_CC); - - exit_status = Z_LVAL(ret_value); - } zend_catch - { - exit_status = EG(exit_status); - } - - zend_end_try(); - - return exit_status; - */ + /** + * char str[512]; + * zval ret_value; + * int exit_status; + * zend_first_try + * { + * PG(during_request_startup) = 0; + * snprintf(str, sizeof(str), "include (\"%s\");", script); + * zend_eval_string(str, &ret_value, str TSRMLS_CC); + * exit_status = Z_LVAL(ret_value); + * } zend_catch + * { + * exit_status = EG(exit_status); + * } + * zend_end_try(); + * return exit_status; + */ bool esito = true; @@ -270,40 +265,32 @@ extern U_EXPORT void UPHP_end(); php_embed_module.ini_entries = 0; } } -/* -extern U_EXPORT void UPHP_set_var(const char* varname, const char* varval); - U_EXPORT void UPHP_set_var(const char* varname, const char* varval) -{ - zval* var; - MAKE_STD_ZVAL(var); - ZVAL_STRING(var, varval, 1); - - zend_hash_update(&EG(symbol_table), varname, strlen(varname) + 1, &var, sizeof(zval*), 0); -} - -extern U_EXPORT const char* UPHP_get_var(const char* varname); - U_EXPORT const char* UPHP_get_var(const char* varname) -{ - zval** data = 0; - const char* ret = NULL; - - if (zend_hash_find(&EG(symbol_table), varname, strlen(varname) + 1, (void**)&data) == FAILURE) - { - printf("Name not found in $GLOBALS\n"); - - return ""; - } - - if (data == 0) - { - printf("Value is NULL (not possible for symbol_table?)\n"); - - return ""; - } - - ret = Z_STRVAL_PP(data); - - return ret; -} -*/ +/** + * extern U_EXPORT void UPHP_set_var(const char* varname, const char* varval); + * U_EXPORT void UPHP_set_var(const char* varname, const char* varval) + * { + * zval* var; + * MAKE_STD_ZVAL(var); + * ZVAL_STRING(var, varval, 1); + * zend_hash_update(&EG(symbol_table), varname, strlen(varname) + 1, &var, sizeof(zval*), 0); + * } + * extern U_EXPORT const char* UPHP_get_var(const char* varname); + * U_EXPORT const char* UPHP_get_var(const char* varname) + * { + * zval** data = 0; + * const char* ret = NULL; + * if (zend_hash_find(&EG(symbol_table), varname, strlen(varname) + 1, (void**)&data) == FAILURE) + * { + * printf("Name not found in $GLOBALS\n"); + * return ""; + * } + * if (data == 0) + * { + * printf("Value is NULL (not possible for symbol_table?)\n"); + * return ""; + * } + * ret = Z_STRVAL_PP(data); + * return ret; + * } + */ } diff --git a/src/ulib/utility/http2.cpp b/src/ulib/utility/http2.cpp index 9b97fdca..8d3766ee 100644 --- a/src/ulib/utility/http2.cpp +++ b/src/ulib/utility/http2.cpp @@ -432,44 +432,6 @@ void UHTTP2::dtor() U_TRACE(0, "UHTTP2::dtor()") } -void UHTTP2::sendError() -{ - U_TRACE(0, "UHTTP2::sendError()") - - U_INTERNAL_ASSERT_DIFFERS(nerror, NO_ERROR) - - char buffer[HTTP2_FRAME_HEADER_SIZE+8] = { 0, 0, 4, // frame size - RST_STREAM, // header frame - 0, // end header flags - 0, 0, 0, 0, // stream id - 0, 0, 0, 0, - 0, 0, 0, 0 }; - char* ptr = buffer; - - if (frame.stream_id) - { - *(uint32_t*)(ptr+5) = htonl(frame.stream_id); - *(uint32_t*)(ptr+9) = htonl(nerror); - - if (USocketExt::write(UServer_Base::csocket, buffer, HTTP2_FRAME_HEADER_SIZE+4, UServer_Base::timeoutMS) != HTTP2_FRAME_HEADER_SIZE+4) U_ClientImage_state = U_PLUGIN_HANDLER_ERROR; - } - else - { - ptr[2] = 8; - ptr[3] = GOAWAY; - - U_INTERNAL_ASSERT_POINTER(pConnection) - - pConnection->state = CONN_STATE_IS_CLOSING; - - *(uint32_t*)(ptr+ 5) = 0; - *(uint32_t*)(ptr+ 9) = htonl(pConnection->max_processed_stream_id); - *(uint32_t*)(ptr+13) = htonl(nerror); - - if (USocketExt::write(UServer_Base::csocket, buffer, HTTP2_FRAME_HEADER_SIZE+8, UServer_Base::timeoutMS) != HTTP2_FRAME_HEADER_SIZE+8) U_ClientImage_state = U_PLUGIN_HANDLER_ERROR; - } -} - bool UHTTP2::updateSetting(const char* ptr, uint32_t len) { U_TRACE(0, "UHTTP2::updateSetting(%#.*S,%u)", len, ptr, len) @@ -893,7 +855,13 @@ case_4_5: // / - /index.html // determine the value (if necessary) - if (value_is_indexed) value = *(index == 4 ? str_path_root : str_path_index); + if (value_is_indexed) + { + value = *(index == 4 ? str_path_root : str_path_index); + + U_http_info.uri = value.data(); + U_http_info.uri_len = value.size(); + } else { ptr += hpackDecodeString((const unsigned char*)ptr, (const unsigned char*)endptr, &value); @@ -912,10 +880,10 @@ case_4_5: // / - /index.html U_INTERNAL_DUMP("query = %.*S", U_HTTP_QUERY_TO_TRACE) } - - U_INTERNAL_DUMP("URI = %.*S", U_HTTP_URI_TO_TRACE) } + U_INTERNAL_DUMP("URI = %.*S", U_HTTP_URI_TO_TRACE) + goto insert; case_6: // http @@ -1191,8 +1159,8 @@ insert: } char buffer[HTTP2_FRAME_HEADER_SIZE+5] = { 0, 0, 5, // frame size - 1, // header frame - 4, // end header flags + HEADERS, // header frame + FLAG_END_HEADERS, // end header flags 0, 0, 0, 0, // stream id 8, 3, '1', '0', '0' }; // use literal header field without indexing - indexed name @@ -1267,7 +1235,7 @@ loop: frame.stream_id = ntohl(*(uint32_t*)(ptr+5) & 0x7fffffff); U_DUMP("frame { length = %d stream_id = %d type = (%d, %s) flags = %d } = %#.*S", frame.length, - frame.stream_id, frame.type, getFrameTypeDescription(), frame.flags, frame.length, ptr + HTTP2_FRAME_HEADER_SIZE) + frame.stream_id, frame.type, getFrameTypeDescription(frame.type), frame.flags, frame.length, ptr + HTTP2_FRAME_HEADER_SIZE) U_INTERNAL_ASSERT_MINOR(frame.length, (int32_t)settings.max_frame_size) @@ -1319,6 +1287,8 @@ loop: # endif settings_ack = true; + + if (UClientImage_Base::rbuffer->size() == UClientImage_Base::rstart) goto end; } else { @@ -1639,19 +1609,135 @@ loop: U_RETURN(false); } +void UHTTP2::sendError() +{ + U_TRACE(0, "UHTTP2::sendError()") + + U_INTERNAL_ASSERT_DIFFERS(nerror, NO_ERROR) + + char buffer[HTTP2_FRAME_HEADER_SIZE+8] = { 0, 0, 4, // frame size + RST_STREAM, // header frame + FLAG_NONE, // flags + 0, 0, 0, 0, // stream id + 0, 0, 0, 0, + 0, 0, 0, 0 }; + char* ptr = buffer; + + if (frame.stream_id) + { + *(uint32_t*)(ptr+5) = htonl(frame.stream_id); + *(uint32_t*)(ptr+9) = htonl(nerror); + + if (USocketExt::write(UServer_Base::csocket, buffer, HTTP2_FRAME_HEADER_SIZE+4, UServer_Base::timeoutMS) != HTTP2_FRAME_HEADER_SIZE+4) U_ClientImage_state = U_PLUGIN_HANDLER_ERROR; + } + else + { + ptr[2] = 8; + ptr[3] = GOAWAY; + + U_INTERNAL_ASSERT_POINTER(pConnection) + + pConnection->state = CONN_STATE_IS_CLOSING; + + // *(uint32_t*)(ptr+ 5) = 0; + *(uint32_t*)(ptr+ 9) = htonl(pConnection->max_processed_stream_id); + *(uint32_t*)(ptr+13) = htonl(nerror); + + if (USocketExt::write(UServer_Base::csocket, buffer, HTTP2_FRAME_HEADER_SIZE+8, UServer_Base::timeoutMS) != HTTP2_FRAME_HEADER_SIZE+8) U_ClientImage_state = U_PLUGIN_HANDLER_ERROR; + } +} + +void UHTTP2::handlerResponse() +{ + U_TRACE(0, "UHTTP2::handlerResponse()") + + unsigned char buffer[8192] = { 0, 0, 0, // frame size + HEADERS, // header frame + FLAG_END_HEADERS, // end header flags + 0, 0, 0, 0, // stream id + 8, 3, '0', '0', '0' }; // use literal header field without indexing - indexed name + + // \000\000# + // \001 + // \004 + // \000\000\000\001 + // \b\003403 + // v\004\000UHTa + + char* ptr = (char*)buffer; + int32_t sz = HTTP2_FRAME_HEADER_SIZE+1; + + switch (U_http_info.nResponseCode) + { + case HTTP_OK: ptr[HTTP2_FRAME_HEADER_SIZE] = 0x80 | 8; break; + case HTTP_NO_CONTENT: ptr[HTTP2_FRAME_HEADER_SIZE] = 0x80 | 9; break; + case HTTP_PARTIAL: ptr[HTTP2_FRAME_HEADER_SIZE] = 0x80 | 10; break; + case HTTP_NOT_MODIFIED: ptr[HTTP2_FRAME_HEADER_SIZE] = 0x80 | 11; break; + case HTTP_BAD_REQUEST: ptr[HTTP2_FRAME_HEADER_SIZE] = 0x80 | 12; break; + case HTTP_NOT_FOUND: ptr[HTTP2_FRAME_HEADER_SIZE] = 0x80 | 13; break; + case HTTP_INTERNAL_ERROR: ptr[HTTP2_FRAME_HEADER_SIZE] = 0x80 | 14; break; + + default: // use literal header field without indexing - indexed name + { + sz += 4; + + ptr[HTTP2_FRAME_HEADER_SIZE+2] = (U_http_info.nResponseCode / 100) + '0'; + U_NUM2STR16(ptr+HTTP2_FRAME_HEADER_SIZE+3, U_http_info.nResponseCode % 100); + } + } + + // literal header field with indexing (indexed name) + + unsigned char* dst = buffer+sz; + + // server: ULib + // date: Wed, 20 Jun 2012 11:43:17 GMT + + *dst = 0x40; + dst = hpackEncodeInt(dst, 54, (1<<6)-1); + dst += hpackEncodeString(dst, U_CONSTANT_TO_PARAM("ULib")); + *dst = 0x40; + dst = hpackEncodeInt(dst, 33, (1<<6)-1); + +// u__memcpy(dst, "v\004\000UHTa", U_CONSTANT_SIZE("v\004\000UHTa"), __PRETTY_FUNCTION__); +// dst += U_CONSTANT_SIZE("v\004\000UHTa"); + +#if defined(ENABLE_THREAD) && !defined(U_LOG_ENABLE) && !defined(USE_LIBZ) + U_INTERNAL_ASSERT_POINTER(u_pthread_time) + U_INTERNAL_ASSERT_EQUALS(UClientImage_Base::iov_vec[1].iov_base, ULog::ptr_shared_date->date3) +#else + U_INTERNAL_ASSERT_EQUALS(UClientImage_Base::iov_vec[1].iov_base, ULog::date.date3) + + ULog::updateDate3(); +#endif + + dst += hpackEncodeString(dst, ((char*)UClientImage_Base::iov_vec[1].iov_base)+6, 29); // Date: Wed, 20 Jun 2012 11:43:17 GMT\r\nServer: ULib\r\nConnection: close\r\n + + sz = dst - buffer; + + *(uint32_t*) ptr = htonl((sz-HTTP2_FRAME_HEADER_SIZE) << 8); + ptr[3] = HEADERS; + *(uint32_t*)(ptr+5) = htonl(pStream->id); + + U_DUMP("frame response { length = %d stream_id = %d type = (%d, %s) flags = %d } = %#.*S", ntohl(*(uint32_t*)ptr & 0x00ffffff) >> 8, + ntohl(*(uint32_t*)(ptr+5) & 0x7fffffff), ptr[3], getFrameTypeDescription(ptr[3]), ptr[4], ntohl(*(uint32_t*)ptr & 0x00ffffff) >> 8, ptr + HTTP2_FRAME_HEADER_SIZE) + + if (USocketExt::write(UServer_Base::csocket, ptr, sz, UServer_Base::timeoutMS) != sz) nerror = FLOW_CONTROL_ERROR; +} + #ifdef ENTRY #undef ENTRY #endif #define ENTRY(n) n: descr = #n; break #ifdef DEBUG -const char* UHTTP2::getFrameTypeDescription() +const char* UHTTP2::getFrameTypeDescription(char type) { - U_TRACE(0, "UHTTP2::getFrameTypeDescription()") + U_TRACE(0, "UHTTP2::getFrameTypeDescription(%d)", type) const char* descr; - switch (frame.type) + switch (type) { case ENTRY(DATA); case ENTRY(HEADERS); diff --git a/src/ulib/utility/uhttp.cpp b/src/ulib/utility/uhttp.cpp index cacfe716..6025eb79 100644 --- a/src/ulib/utility/uhttp.cpp +++ b/src/ulib/utility/uhttp.cpp @@ -109,6 +109,7 @@ uint32_t UHTTP::limit_request_body = U_STRING_MAX_SIZE; uint32_t UHTTP::request_read_timeout; const char* UHTTP::usp_page_key; +UCommand* UHTTP::pcmd; UDataSession* UHTTP::data_session; UDataSession* UHTTP::data_storage; UMimeMultipart* UHTTP::formMulti; @@ -764,6 +765,7 @@ void UHTTP::ctor() U_INTERNAL_ASSERT_EQUALS(ext, 0) U_INTERNAL_ASSERT_EQUALS(etag, 0) U_INTERNAL_ASSERT_EQUALS(file, 0) + U_INTERNAL_ASSERT_EQUALS(pcmd, 0) U_INTERNAL_ASSERT_EQUALS(geoip, 0) U_INTERNAL_ASSERT_EQUALS(tmpdir, 0) U_INTERNAL_ASSERT_EQUALS(request, 0) @@ -780,6 +782,7 @@ void UHTTP::ctor() UWebSocket::str_allocate(); file = U_NEW(UFile); + pcmd = U_NEW(UCommand); ext = U_NEW(UString); etag = U_NEW(UString); geoip = U_NEW(UString(U_CAPACITY)); @@ -1382,6 +1385,7 @@ void UHTTP::dtor() delete ext; delete etag; delete file; + delete pcmd; delete geoip; delete suffix; delete tmpdir; @@ -1666,14 +1670,10 @@ int UHTTP::handlerDataPending() (void) manageRequest(); - /* - return 1 // child of parallelization - return -1 // parent of parallelization - */ + U_ClientImage_state = U_PLUGIN_HANDLER_ERROR; - U_RETURN(0); + U_RETURN(-1); } - else #endif return UClientImage_Base::handlerDataPending(); @@ -2907,8 +2907,7 @@ set_x_http_forward_for: U_http_info.ip_client = ptr+pos1; } } -next: - U_INTERNAL_DUMP("char (after cr/newline) = %C", pn[2]) +next: U_INTERNAL_DUMP("char (after cr/newline) = %C", pn[2]) if (U_http_info.endHeader == 0 && u_get_unalignedp32(pn) == U_MULTICHAR_CONSTANT32('\r','\n','\r','\n')) @@ -3035,7 +3034,7 @@ bool UHTTP::runCGI(bool set_environment) U_INTERNAL_ASSERT_POINTER(cgi) - U_INTERNAL_DUMP("cgi->dir = %S cgi->sh_script = %b cgi->interpreter = %S", cgi->dir, cgi->sh_script, cgi->interpreter) + U_INTERNAL_DUMP("cgi->dir = %S cgi->environment_type = %d cgi->interpreter = %S", cgi->dir, cgi->environment_type, cgi->interpreter) // NB: we can't use the relativ path because after we call chdir()... @@ -3052,9 +3051,11 @@ bool UHTTP::runCGI(bool set_environment) // ULIB facility: check if present form data and convert them in parameters for shell script... - if (cgi->sh_script) setCGIShellScript(command); + if (cgi->environment_type == U_SHELL) setCGIShellScript(command); - UCommand cmd(command); + U_INTERNAL_ASSERT_POINTER(pcmd) + + pcmd->setCommand(command); if (set_environment) { @@ -3062,14 +3063,14 @@ bool UHTTP::runCGI(bool set_environment) // NB: process the CGI request with fork.... - if (getCGIEnvironment(*UClientImage_Base::environment, cgi->sh_script ? U_SHELL : U_CGI) == false || + if (getCGIEnvironment(*UClientImage_Base::environment, cgi->environment_type) == false || UServer_Base::startParallelization()) // parent of parallelization { goto next; } } - if (processCGIRequest(cmd, cgi->dir)) // NB: in case of failure we have already the response... + if (processCGIRequest(pcmd, cgi)) // NB: in case of failure we have already the response... { next: U_DUMP("UServer_Base::isParallelizationChild() = %b UServer_Base::isParallelizationParent() = %b", UServer_Base::isParallelizationChild(), UServer_Base::isParallelizationParent()) @@ -3078,7 +3079,7 @@ next: U_DUMP("UServer_Base::isParallelizationChild() = %b UServer_Base::isParall if (set_environment == false || (U_ClientImage_parallelization != 2 && // 2 => parent of parallelization - processCGIOutput(cgi->sh_script, false))) + processCGIOutput(cgi->environment_type == U_SHELL, false))) { U_RETURN(true); } @@ -3845,7 +3846,7 @@ file_in_cache: # if defined(USE_RUBY) || defined(USE_PHP) || defined(HAVE_LIBTCC) if (U_http_is_request_nostat == false && U_HTTP_QUERY_STREQ("_nav_") == false && - runDynamicPage()) + (checkForPathName(), runDynamicPage())) { U_RETURN(U_PLUGIN_HANDLER_FINISHED); } @@ -5536,6 +5537,8 @@ UString UHTTP::getHeaderForResponse() #ifndef U_HTTP2_DISABLE if (U_http_version == '2') { + UHTTP2::handlerResponse(); + return UString::getStringNull(); } #endif @@ -6039,9 +6042,14 @@ end: # if defined(DEBUG) && defined(USE_LIBMAGIC) if (clength > 4) { - UString tmp = UMagic::getType(UClientImage_Base::wbuffer->c_pointer(U_http_info.endHeader), clength); + const char* p = UClientImage_Base::wbuffer->c_pointer(U_http_info.endHeader); - U_INTERNAL_ASSERT_EQUALS(memcmp(tmp.data(), U_CONSTANT_TO_PARAM("text")), 0) + if (u_isText((const unsigned char*)p, clength)) + { + UString tmp = UMagic::getType(p, clength); + + U_INTERNAL_ASSERT_EQUALS(memcmp(tmp.data(), U_CONSTANT_TO_PARAM("text")), 0) + } } # endif @@ -7544,18 +7552,14 @@ check: if (usp_src) goto end; ptr = pathname->c_pointer(pathname->size() - 2); - cgi->sh_script = (memcmp(ptr, U_CONSTANT_TO_PARAM("sh")) == 0); + if (suffix->equal(U_CONSTANT_TO_PARAM("sh"))) { cgi->interpreter = U_PATH_SHELL; cgi->environment_type = U_SHELL; } + else if (suffix->equal(U_CONSTANT_TO_PARAM("php"))) { cgi->interpreter = "php-cgi"; cgi->environment_type = U_PHP; } + else if (suffix->equal(U_CONSTANT_TO_PARAM("pl"))) { cgi->interpreter = "perl"; cgi->environment_type = U_CGI; } + else if (suffix->equal(U_CONSTANT_TO_PARAM("py"))) { cgi->interpreter = "python"; cgi->environment_type = U_CGI; } + else if (suffix->equal(U_CONSTANT_TO_PARAM("rb"))) { cgi->interpreter = "ruby"; cgi->environment_type = U_CGI; } + else { cgi->interpreter = 0; cgi->environment_type = U_CGI; } - U_INTERNAL_DUMP("cgi->sh_script = %b", cgi->sh_script) - - if (suffix->equal(U_CONSTANT_TO_PARAM("sh"))) cgi->interpreter = U_PATH_SHELL; - else if (suffix->equal(U_CONSTANT_TO_PARAM("php"))) cgi->interpreter = "php-cgi"; - else if (suffix->equal(U_CONSTANT_TO_PARAM("pl"))) cgi->interpreter = "perl"; - else if (suffix->equal(U_CONSTANT_TO_PARAM("py"))) cgi->interpreter = "python"; - else if (suffix->equal(U_CONSTANT_TO_PARAM("rb"))) cgi->interpreter = "ruby"; - else cgi->interpreter = 0; - - U_INTERNAL_DUMP("cgi->interpreter = %S", cgi->interpreter) + U_INTERNAL_DUMP("cgi->environment_type = %d cgi->interpreter = %S", cgi->environment_type, cgi->interpreter) file_data->ptr = cgi; file_data->mime_index = U_cgi; @@ -8202,6 +8206,20 @@ bool UHTTP::getCGIEnvironment(UString& environment, int mask) if (brequest == false) buffer.snprintf_add("REQUEST_URI=%.*s\n", sz, ptr); } + if ((mask & U_PHP) != 0) + { + // --------------------------------------------------------------------------------------------------- + // see: http://woozle.org/~neale/papers/php-cgi.html + // --------------------------------------------------------------------------------------------------- + // PHP_SELF: The filename of the currently executing script, relative to the document root + // --------------------------------------------------------------------------------------------------- + + buffer.snprintf_add("PHP_SELF=%.*s\n" + "REDIRECT_STATUS=1\n" + "SCRIPT_FILENAME=%w%.*s\n", + sz, ptr, sz, ptr); + } + (void) buffer.append(*UServer_Base::cenvironment); // SERVER_(NAME|PORT) /** @@ -8286,9 +8304,9 @@ bool UHTTP::getCGIEnvironment(UString& environment, int mask) if (U_http_host_len) { buffer.snprintf_add("HTTP_HOST=%.*s\n", U_HTTP_HOST_TO_TRACE); -# ifdef U_ALIAS +# ifdef U_ALIAS if (virtual_host) buffer.snprintf_add("VIRTUAL_HOST=%.*s\n", U_HTTP_VHOST_TO_TRACE); -# endif +# endif if (prequestHeader) { @@ -8449,25 +8467,6 @@ bool UHTTP::getCGIEnvironment(UString& environment, int mask) (void) buffer.append(U_CONSTANT_TO_PARAM("\nPATH=/usr/local/bin:/usr/bin:/bin\n")); if (*geoip) (void) buffer.append(*geoip); - - goto end; - } - - if ((mask & U_PHP) != 0) - { - // --------------------------------------------------------------------------------------------------- - // see: http://woozle.org/~neale/papers/php-cgi.html - // --------------------------------------------------------------------------------------------------- - // PHP_SELF: The filename of the currently executing script, relative to the document root - // --------------------------------------------------------------------------------------------------- - - sz = UHTTP::file->getPathRelativLen(); - ptr = UHTTP::file->getPathRelativ(); - - buffer.snprintf_add("PHP_SELF=%.*s\n" - "REDIRECT_STATUS=1\n" - "SCRIPT_FILENAME=%.*s\n", - sz, ptr, sz, ptr); } end: @@ -9106,9 +9105,9 @@ error: U_RETURN(false); } -bool UHTTP::processCGIRequest(UCommand& cmd, const char* cgi_dir) +bool UHTTP::processCGIRequest(UCommand* cmd, UHTTP::ucgi* cgi) { - U_TRACE(0, "UHTTP::processCGIRequest(%p,%S)", &cmd, cgi_dir) + U_TRACE(0, "UHTTP::processCGIRequest(%p,%p)", cmd, cgi) static int fd_stderr; @@ -9116,33 +9115,36 @@ bool UHTTP::processCGIRequest(UCommand& cmd, const char* cgi_dir) U_INTERNAL_DUMP("U_http_method_type = %B URI = %.*S U_http_info.nResponseCode = %d", U_http_method_type, U_HTTP_URI_TO_TRACE, U_http_info.nResponseCode) - U_ASSERT(cmd.checkForExecute()) + U_ASSERT(cmd->checkForExecute()) U_INTERNAL_ASSERT(*UClientImage_Base::environment) - cmd.setEnvironment(UClientImage_Base::environment); + cmd->setEnvironment(UClientImage_Base::environment); - /* When a url ends by "cgi-bin/" it is assumed to be a cgi script. + /** + * When a url ends by "cgi-bin/" it is assumed to be a cgi script. * The server changes directory to the location of the script and * executes it after setting QUERY_STRING and other environment variables. */ - if (cgi_dir[0]) (void) UFile::chdir(cgi_dir, true); + if (cgi) (void) UFile::chdir(cgi->dir, true); // execute script... - if (cgi_timeout) cmd.setTimeout(cgi_timeout); + if (cgi_timeout) cmd->setTimeout(cgi_timeout); if (fd_stderr == 0) fd_stderr = UServices::getDevNull("/tmp/processCGIRequest.err"); - bool result = cmd.execute(UClientImage_Base::body->empty() ? 0 : UClientImage_Base::body, UClientImage_Base::wbuffer, -1, fd_stderr); + bool result = cmd->execute(UClientImage_Base::body->empty() ? 0 : UClientImage_Base::body, UClientImage_Base::wbuffer, -1, fd_stderr); - if (cgi_dir[0]) (void) UFile::chdir(0, true); + if (cgi) (void) UFile::chdir(0, true); #ifdef U_LOG_ENABLE - UServer_Base::logCommandMsgError(cmd.getCommand(), false); + UServer_Base::logCommandMsgError(cmd->getCommand(), false); #endif - cmd.reset(UClientImage_Base::environment); + cmd->reset(UClientImage_Base::environment); + + cmd->environment.clear(); if (result == false || UClientImage_Base::wbuffer->empty()) @@ -9157,7 +9159,8 @@ bool UHTTP::processCGIRequest(UCommand& cmd, const char* cgi_dir) { // NB: exit_value consists of the least significant 8 bits of the status argument that the child specified in a call to exit()... - if (UCommand::exit_value > 128 && + if (UCommand::exit_value > 128 && + cgi->environment_type == U_SHELL && U_IS_HTTP_ERROR(UCommand::exit_value + 256)) { U_http_info.nResponseCode = UCommand::exit_value + 256; diff --git a/tests/examples/Makefile.am b/tests/examples/Makefile.am index 333fee54..1753dbef 100644 --- a/tests/examples/Makefile.am +++ b/tests/examples/Makefile.am @@ -5,7 +5,7 @@ MAINTAINERCLEANFILES = Makefile.in DEFAULT_INCLUDES = -I. -I$(top_srcdir) -I$(top_srcdir)/include -I$(top_srcdir)/examples/http_header/include EXTRA_DIST = inp ok CA CSP LCSP TSA RSIGN XAdES nocat wi-auth WAGSM RA IR/WEB IR/benchmark IR/doc_dir *.cfg .htpasswd .htdigest \ - *.properties *.test *.sh error_msg workflow doc_parse robots.txt css js benchmark websocket docroot + *.properties *.test *.sh error_msg workflow doc_parse robots.txt css js benchmark websocket docroot php.sh ## DEFS = -DU_TEST @DEFS@ diff --git a/tests/examples/Makefile.in b/tests/examples/Makefile.in index 895b72a5..782c8f19 100644 --- a/tests/examples/Makefile.in +++ b/tests/examples/Makefile.in @@ -509,7 +509,7 @@ top_srcdir = @top_srcdir@ MAINTAINERCLEANFILES = Makefile.in DEFAULT_INCLUDES = -I. -I$(top_srcdir) -I$(top_srcdir)/include -I$(top_srcdir)/examples/http_header/include EXTRA_DIST = inp ok CA CSP LCSP TSA RSIGN XAdES nocat wi-auth WAGSM RA IR/WEB IR/benchmark IR/doc_dir *.cfg .htpasswd .htdigest \ - *.properties *.test *.sh error_msg workflow doc_parse robots.txt css js benchmark websocket docroot + *.properties *.test *.sh error_msg workflow doc_parse robots.txt css js benchmark websocket docroot php.sh TESTS = client_server.test test_manager.test IR.test web_server.test \ web_server_multiclient.test web_socket.test $(am__append_1) \ diff --git a/tests/examples/php.sh b/tests/examples/php.sh new file mode 100755 index 00000000..19786614 --- /dev/null +++ b/tests/examples/php.sh @@ -0,0 +1,93 @@ +#!/bin/sh + +# Running PHP scripts in ULib + +ARG=$1 +if [ -z "$ARG" ]; then + ARG=1 +fi + +mkdir -p log out err www/cgi-bin + +rm -f log/php${ARG}.log \ + out/*.out err/*.err \ + /tmp/processCGIRequest.err /tmp/server_plugin_fcgi.err \ + trace.*.[0-9]* object.*.[0-9]* stack.*.[0-9]* mempool.*.[0-9]* \ + www/trace.*.[0-9]* www/object.*.[0-9]* www/stack.*.[0-9]* www/mempool.*.[0-9]* + +if [ ! -s "www/info.php" ]; then + echo -n "" > www/info.php +fi +if [ ! -s "www/cgi-bin/index.php" ]; then + echo -n "" > www/cgi-bin/index.php +fi + +if [ "$ARG" = "1" ]; then +#1) run PHP scripts using ULib CGI support + cat <userver.cfg +userver { + PORT 8080 + LOG_FILE_SZ 1M + LOG_MSG_SIZE -1 + DOCUMENT_ROOT www + LOG_FILE ../log/php1.log +} +EOF +#2) run PHP requests proxed by FastCGI protocol +elif [ "$ARG" = "2a" ]; then +#a) TCP socket (IP and port) approach + cat <userver.cfg +userver { + PORT 8080 + LOG_FILE_SZ 1M + LOG_MSG_SIZE -1 + DOCUMENT_ROOT www + LOG_FILE ../log/php2a.log + PLUGIN "fcgi http" +} +fcgi { + FCGI_URI_MASK *.php + SERVER 127.0.0.1 + PORT 9000 + LOG_FILE ../log/php2a.log +} +EOF +elif [ "$ARG" = "2b" ]; then +#b) unix domain socket (UDS) approach + cat <userver.cfg +userver { + PORT 8080 + LOG_FILE_SZ 1M + LOG_MSG_SIZE -1 + DOCUMENT_ROOT www + LOG_FILE ../log/php2b.log + PLUGIN "fcgi http" +} +fcgi { + FCGI_URI_MASK *.php + SOCKET_NAME /tmp/fcgi.socket + LOG_FILE ../log/php2b.log +} +EOF +elif [ "$ARG" = "3" ]; then +#3) run PHP scripts using ULib php embedded support (--with-php-embedded). + cat <userver.cfg +userver { + PORT 8080 + LOG_FILE_SZ 1M + LOG_MSG_SIZE -1 + DOCUMENT_ROOT www + LOG_FILE ../log/php3.log +} +EOF +fi + +#UTRACE="0 50M 0" +#UTRACE_SIGNAL="0 50M 0" +#UOBJDUMP="0 10M 100" +#USIMERR="error.sim" +export UTRACE UTRACE_SIGNAL UOBJDUMP USIMERR + +#STRACE="strace -t -f -s 100" +PID=`( eval "$STRACE userver_tcp -c userver.cfg >>out/php${ARG}.out 2>>err/php${ARG}.err &"; echo $! )` +echo "PID = "$PID diff --git a/tests/examples/web_server.test b/tests/examples/web_server.test index 3d7dd304..0e3910e2 100755 --- a/tests/examples/web_server.test +++ b/tests/examples/web_server.test @@ -22,9 +22,10 @@ rm -f db/session.ssl* /tmp/ssl_session.txt /tmp/byterange* /tmp/*.memusage.* \ $DOC_ROOT/trace.*userver_*.[0-9]* $DOC_ROOT/object.*userver_*.[0-9]* $DOC_ROOT/stack.*userver_*.[0-9]* $DOC_ROOT/mempool.*userver_*.[0-9]* #UTRACE="0 100M 0" -#UOBJDUMP="0 50M 5000" +#UTRACE_SIGNAL="0 50M 0" +#UOBJDUMP="0 10M 100" #USIMERR="error.sim" - export UTRACE UOBJDUMP USIMERR +export UTRACE UOBJDUMP USIMERR UTRACE_SIGNAL if [ "$TERM" = "msys" ]; then export TMPDIR="c:/tmp"