From f8242556bb151f6205a6fd4c0a8818cdb911fb93 Mon Sep 17 00:00:00 2001 From: stefanocasazza Date: Fri, 22 Dec 2017 17:45:23 +0100 Subject: [PATCH] fix --- examples/IR/ir_web.cpp | 16 +----- examples/WiAuth/wi_auth.cpp | 4 +- include/ulib/internal/objectIO.h | 2 + include/ulib/net/server/usp_macro.h | 28 ++++++---- .../net/server/plugin/usp/usp_translator.cpp | 53 ++++++++++--------- tests/examples/web_server.sh | 27 ++++------ 6 files changed, 60 insertions(+), 70 deletions(-) diff --git a/examples/IR/ir_web.cpp b/examples/IR/ir_web.cpp index 7bf5439f..61f15312 100644 --- a/examples/IR/ir_web.cpp +++ b/examples/IR/ir_web.cpp @@ -61,21 +61,18 @@ extern U_EXPORT void runDynamicPage_ir_web(int param); { U_TRACE(0, "::runDynamicPage_ir_web(%d)", param) + if (param) { if (param == U_DPAGE_INIT) { usp_init_ir_web(); return; } - if (param == U_DPAGE_DESTROY) { usp_end_ir_web(); return; } - if (param >= U_DPAGE_FORK) return; } UHTTP::mime_index = U_html; - U_http_info.endHeader = 0; if (UHTTP::getDataSession() == false) UHTTP::setSessionCookie(); - const char* ref = "?ext=help"; uint32_t num_args = UHTTP::processForm() / 2; bool form_with_help = false; @@ -142,26 +139,21 @@ extern U_EXPORT void runDynamicPage_ir_web(int param); (void) UClientImage_Base::wbuffer->append( U_CONSTANT_TO_PARAM("\n\n ULib search engine: a full-text search system for communities\n \n\n\n
\n
\n\n \n\n
\n \n \n
\n\n
\n per page\n
\n
\n
\n\n") ); - if (form_with_help) { (void) UClientImage_Base::wbuffer->append( U_CONSTANT_TO_PARAM("
\n

Help

\n\n

What is This?

\n\n

This is a full-text search system. You can search for documents including some specified words.

\n\n

How to Use

\n\n

Input search phrase into the field at the top of the page. For example, if you search for documents including \"computer\", input the\n following.

\n
computer
\n\n

If you search for documents including both of \"network\" and \"socket\", input the following.

\n
network socket
\n\n

It is the same as the following.

\n
network AND socket
\n\n

If you search for documents including \"network\" followed by \"socket\", input the following.

\n
\"network socket\"
\n\n

If you search for documents including one or both of \"network\" and \"socket\", input the following.

\n
network OR socket
\n\n

If you search for documents including \"network\" but without \"socket\", input the following.

\n
network AND NOT socket
\n\n

For more complex query, you can use \"(\". Note that the priority of \"(\" is higher than that of \"AND\",\n \"OR\" and \"NOT\". So, the following is to search for documents including one of \"F1\", \"F-1\", \"Formula One\", and including\n one of \"champion\" and \"victory\".

\n
(F1 OR F-1 OR \"Formula One\") AND (champion OR victory)
\n\n

You can use DOS wildcard characters

\n\n

If you search for documents including some words beginning with \"inter\", input the following.

\n
inter*
\n\n

If you search for documents including some words ending with \"sphere\", input the following.

\n
*sphere
\n\n

If you search for documents matching some words matching \"?n*able\" (unable, unavoidable, inevitable, ...), input the following.

\n
?n*able
\n\n

Other Faculties

\n\n

\"[...] per page\" specifies the number of shown documents per page. If documents over one page correspond, you can move to another\n page via anchors of \"PREV\" and \"NEXT\" at the bottom of the page.

\n\n

Information

\n\n

See the project site for more detail.

\n
\n\n") ); - } else { if (num_args == 0) { (void) UClientImage_Base::wbuffer->append( U_CONSTANT_TO_PARAM("
\n

ULib search engine

\n
a full-text search system for communities
\n
\n\n") ); - } else { UString link_paginazione = UHTTP::getLinkPagination(); @@ -177,7 +169,6 @@ extern U_EXPORT void runDynamicPage_ir_web(int param); (void) UClientImage_Base::wbuffer->append( U_CONSTANT_TO_PARAM("

Your search did not match any documents.

\n") ); - } else { UString doc, snippet_doc(U_CAPACITY), basename, filename, pathname1(U_CAPACITY), pathname2(U_CAPACITY); @@ -210,13 +201,10 @@ extern U_EXPORT void runDynamicPage_ir_web(int param); (void) UClientImage_Base::wbuffer->append( U_CONSTANT_TO_PARAM("
\n Powered by ULib search engine ") ); - (void) UClientImage_Base::wbuffer->append((*footer)); - (void) UClientImage_Base::wbuffer->append( U_CONSTANT_TO_PARAM("
\n\n") ); - UHTTP::putDataSession(); - + } } \ No newline at end of file diff --git a/examples/WiAuth/wi_auth.cpp b/examples/WiAuth/wi_auth.cpp index 8b1f71c2..a9497a09 100644 --- a/examples/WiAuth/wi_auth.cpp +++ b/examples/WiAuth/wi_auth.cpp @@ -14,14 +14,12 @@ extern U_EXPORT void runDynamicPage_wi_auth(int param); { U_TRACE(0, "::runDynamicPage_wi_auth(%d)", param) + if (param) { if (param == U_DPAGE_INIT) { usp_init_wi_auth(); return; } - if (param == U_DPAGE_DESTROY) { usp_end_wi_auth(); return; } - if (param == U_DPAGE_SIGHUP) { usp_sighup_wi_auth(); return; } - if (param >= U_DPAGE_FORK) return; } diff --git a/include/ulib/internal/objectIO.h b/include/ulib/internal/objectIO.h index c2f299b6..3b6cf1d2 100644 --- a/include/ulib/internal/objectIO.h +++ b/include/ulib/internal/objectIO.h @@ -40,6 +40,8 @@ template inline void UString2Object(const char* t, uint32_t tlen, T& o { U_INTERNAL_TRACE("UString2Object(%.*s,%u,%p)", tlen, t, tlen, &object) + U_INTERNAL_ASSERT_MAJOR(tlen, 0) + #ifdef U_STDCPP_ENABLE UObjectIO::input(t, tlen); diff --git a/include/ulib/net/server/usp_macro.h b/include/ulib/net/server/usp_macro.h index 9b244a4b..10ea71ee 100644 --- a/include/ulib/net/server/usp_macro.h +++ b/include/ulib/net/server/usp_macro.h @@ -45,8 +45,21 @@ #define USP_STORAGE_VAR_GET(index,varname) \ { \ UString varname##_value; \ - if (UHTTP::getDataStorage(index, varname##_value)) \ - UString2Object(U_STRING_TO_PARAM(varname##_value), varname); \ + if (UHTTP::getDataStorage(index, varname##_value) && \ + (usp_sz = varname##_value.size())) \ + { \ + UString2Object(varname##_value.data(), usp_sz, varname); \ + } \ + } + +#define USP_SESSION_VAR_GET(index,varname) \ + { \ + UString varname##_value; \ + if (UHTTP::getDataSession(index, varname##_value) == false) UHTTP::setSessionCookie(); \ + else if ((usp_sz = varname##_value.size())) \ + { \ + UString2Object(varname##_value.data(), usp_sz, varname); \ + } \ } #define USP_STORAGE_VAR_PUT(index,varname) \ @@ -55,18 +68,11 @@ UHTTP::putDataStorage(index, usp_buffer, usp_sz); \ } -#define USP_SESSION_VAR_GET(index,varname) \ - { \ - UString varname##_value; \ - if (UHTTP::getDataSession(index, varname##_value) == false) UHTTP::setSessionCookie(); \ - else UString2Object(U_STRING_TO_PARAM(varname##_value), varname); \ - } - #define USP_SESSION_VAR_PUT(index,varname) \ { \ - if (UHTTP::isDataSession()) \ + if (UHTTP::isDataSession() && \ + (usp_sz = UObject2String(varname, usp_buffer, sizeof(usp_buffer)))) \ { \ - usp_sz = UObject2String(varname, usp_buffer, sizeof(usp_buffer)); \ UHTTP::putDataSession(index, usp_buffer, usp_sz); \ } \ } diff --git a/src/ulib/net/server/plugin/usp/usp_translator.cpp b/src/ulib/net/server/plugin/usp/usp_translator.cpp index c37ad82d..daa1fe94 100644 --- a/src/ulib/net/server/plugin/usp/usp_translator.cpp +++ b/src/ulib/net/server/plugin/usp/usp_translator.cpp @@ -92,8 +92,8 @@ public: (void) output0.reserve(50U + size); (void) output1.reserve(50U + size); - output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUSP_%s_VAR_GET(%u,%.*s);\n\t"), name, i, size, ptr); - output1.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUSP_%s_VAR_PUT(%u,%.*s);\n\t"), name, i, size, ptr); + output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUSP_%s_VAR_GET(%u,%.*s);\n"), name, i, size, ptr); + output1.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUSP_%s_VAR_PUT(%u,%.*s);\n"), name, i, size, ptr); # ifdef DEBUG id.clear(); // NB: to avoid DEAD OF SOURCE STRING WITH CHILD ALIVE... @@ -119,11 +119,11 @@ public: pos = tmp.find('('); id = (pos == U_NOT_FOUND ? tmp : tmp.substr(0U, pos)); - output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUString %v = %s(%u);\n\t"), id.rep, name, i+binc); + output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUString %v = %s(%u);\n"), id.rep, name, i+binc); if (pos != U_NOT_FOUND) { - output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tif (%v.empty()) %v = U_STRING_FROM_CONSTANT(%.*s);\n\t"), id.rep, id.rep, tmp.size()-pos-2, tmp.c_pointer(pos+1)); + output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tif (%v.empty()) %v = U_STRING_FROM_CONSTANT(%.*s);\n"), id.rep, id.rep, tmp.size()-pos-2, tmp.c_pointer(pos+1)); } # ifdef DEBUG @@ -263,8 +263,8 @@ public: if (token) manageDirectiveSessionOrStorage("SESSION"); else { - (void) output0.append(U_CONSTANT_TO_PARAM("\n\tif (UHTTP::getDataSession() == false) UHTTP::setSessionCookie();\n\t")); - (void) output1.append(U_CONSTANT_TO_PARAM("\n\tUHTTP::putDataSession();\n\t")); + (void) output0.append(U_CONSTANT_TO_PARAM("\n\tif (UHTTP::getDataSession() == false) UHTTP::setSessionCookie();\n")); + (void) output1.append(U_CONSTANT_TO_PARAM("\n\tUHTTP::putDataSession();\n")); } } else if (strncmp(directive, U_CONSTANT_TO_PARAM("storage")) == 0) @@ -279,8 +279,8 @@ public: if (token) manageDirectiveSessionOrStorage("STORAGE"); else { - (void) output0.append(U_CONSTANT_TO_PARAM("\n\t(void) UHTTP::getDataStorage();\n\t")); - (void) output1.append(U_CONSTANT_TO_PARAM("\n\tUHTTP::putDataStorage();\n\t")); + (void) output0.append(U_CONSTANT_TO_PARAM("\n\t(void) UHTTP::getDataStorage();\n")); + (void) output1.append(U_CONSTANT_TO_PARAM("\n\tUHTTP::putDataStorage();\n")); } } else if (strncmp(directive, U_CONSTANT_TO_PARAM("args")) == 0) @@ -290,7 +290,7 @@ public: setDirectiveItem(directive, U_CONSTANT_SIZE("args")); - (void) output0.append(U_CONSTANT_TO_PARAM("\t\n\t\tif (UHTTP::isGETorPOST()) (void) UHTTP::processForm();\n")); + (void) output0.append(U_CONSTANT_TO_PARAM("\t\n\tif (UHTTP::isGETorPOST()) (void) UHTTP::processForm();\n")); if (token) manageDirectiveArgsOrCpath("USP_FORM_VALUE", false); } @@ -430,7 +430,7 @@ public: char buffer[200]; - (void) vars.append(buffer, u__snprintf(buffer, sizeof(buffer), U_CONSTANT_TO_PARAM("\n\tUTimeVal sse_time_to_sleep(%u, 0L);\n\t\n"), sse_time_to_sleep)); + (void) vars.append(buffer, u__snprintf(buffer, sizeof(buffer), U_CONSTANT_TO_PARAM("\n\tUTimeVal sse_time_to_sleep(%u, 0L);\n"), sse_time_to_sleep)); sseloop = UStringExt::substitute(data, sz, '\n', U_CONSTANT_TO_PARAM("\n\t")); @@ -483,7 +483,7 @@ public: (void) output0.reserve(100U + token.size()); - output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUStringExt::appendNumber32(*UClientImage_Base::wbuffer, (%v));\n\t"), token.rep); + output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUStringExt::appendNumber32(*UClientImage_Base::wbuffer, (%v));\n"), token.rep); } else if (strncmp(directive, U_CONSTANT_TO_PARAM("puts")) == 0) { @@ -495,7 +495,7 @@ public: (void) output0.reserve(100U + token.size()); - output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\t(void) UClientImage_Base::wbuffer->append((%v));\n\t"), token.rep); + output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\t(void) UClientImage_Base::wbuffer->append((%v));\n"), token.rep); } else if (strncmp(directive, U_CONSTANT_TO_PARAM("xmlputs")) == 0) { @@ -507,7 +507,7 @@ public: (void) output0.reserve(100U + token.size()); - output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUSP_XML_PUTS((%v));\n\t"), token.rep); + output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tUSP_XML_PUTS((%v));\n"), token.rep); } else if (strncmp(directive, U_CONSTANT_TO_PARAM("cout")) == 0) { @@ -522,7 +522,7 @@ public: (void) output0.reserve(200U + token.size()); output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tusp_sz = UObject2String((%v), usp_buffer, sizeof(usp_buffer));" - "\n\t(void) UClientImage_Base::wbuffer->append(usp_buffer, usp_sz);\n\t"), token.rep); + "\n\t(void) UClientImage_Base::wbuffer->append(usp_buffer, usp_sz);\n"), token.rep); } else if (strncmp(directive, U_CONSTANT_TO_PARAM("print")) == 0) { @@ -545,7 +545,7 @@ public: U_ASSERT_EQUALS(vec.size(), 5) output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tfor (%v; %v; %v) { usp_sz = u__snprintf(usp_buffer, sizeof(usp_buffer), %v, %v);" - "(void) UClientImage_Base::wbuffer->append(usp_buffer, usp_sz); }\n\t"), + "(void) UClientImage_Base::wbuffer->append(usp_buffer, usp_sz); }\n"), vec[0].rep, vec[1].rep, vec[2].rep, vec[3].rep, vec[4].rep); } else @@ -553,7 +553,7 @@ public: U_ASSERT_EQUALS(vec.size(), 2) output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\tusp_sz = u__snprintf(usp_buffer, sizeof(usp_buffer), %v, %v);" - "(void) UClientImage_Base::wbuffer->append(usp_buffer, usp_sz);\n\t"), vec[0].rep, vec[1].rep); + "(void) UClientImage_Base::wbuffer->append(usp_buffer, usp_sz);\n"), vec[0].rep, vec[1].rep); } } } @@ -611,7 +611,7 @@ loop: distance = t.getDistance(); (void) output0.reserve(100U + tmp.size()); - output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\t(void) UClientImage_Base::wbuffer->append(\n\t\tU_CONSTANT_TO_PARAM(%v)\n\t);\n\t"), tmp.rep); + output0.snprintf_add(U_CONSTANT_TO_PARAM("\n\t(void) UClientImage_Base::wbuffer->append(\n\t\tU_CONSTANT_TO_PARAM(%v)\n\t);\n"), tmp.rep); } } @@ -699,7 +699,7 @@ loop: distance = t.getDistance(); bsighup, // usp_sighup bfork; // usp_fork - const char* ptr0 = (sseloop ? "\n\t\tif (UHTTP::bsse) goto sseloop;\n\t" : ""); + const char* ptr0 = (sseloop ? "\n\t\tif (UHTTP::bsse) goto sseloop;\n" : ""); char ptr1[100] = { '\0' }; char ptr2[100] = { '\0' }; char ptr3[100] = { '\0' }; @@ -729,8 +729,8 @@ loop: distance = t.getDistance(); bsighup = (U_STRING_FIND(declaration, 0, "static void usp_sighup_") != U_NOT_FOUND); bfork = (U_STRING_FIND(declaration, 0, "static void usp_fork_") != U_NOT_FOUND); - if (bfork) (void) u__snprintf(ptr5, 100, U_CONSTANT_TO_PARAM("\n\t\tif (param == U_DPAGE_FORK) { usp_fork_%.*s(); return; }\n\t"), basename_sz, basename_ptr); - if (bsighup) (void) u__snprintf(ptr4, 100, U_CONSTANT_TO_PARAM("\n\t\tif (param == U_DPAGE_SIGHUP) { usp_sighup_%.*s(); return; }\n\t"), basename_sz, basename_ptr); + if (bfork) (void) u__snprintf(ptr5, 100, U_CONSTANT_TO_PARAM("\n\t\tif (param == U_DPAGE_FORK) { usp_fork_%.*s(); return; }\n"), basename_sz, basename_ptr); + if (bsighup) (void) u__snprintf(ptr4, 100, U_CONSTANT_TO_PARAM("\n\t\tif (param == U_DPAGE_SIGHUP) { usp_sighup_%.*s(); return; }\n"), basename_sz, basename_ptr); if (bend) { @@ -738,7 +738,7 @@ loop: distance = t.getDistance(); if (bpreprocessing_failed) bend = false; else # endif - (void) u__snprintf(ptr3, 100, U_CONSTANT_TO_PARAM("\n\t\tif (param == U_DPAGE_DESTROY) { usp_end_%.*s(); return; }\n\t"), basename_sz, basename_ptr); + (void) u__snprintf(ptr3, 100, U_CONSTANT_TO_PARAM("\n\t\tif (param == U_DPAGE_DESTROY) { usp_end_%.*s(); return; }\n"), basename_sz, basename_ptr); } } else @@ -769,11 +769,11 @@ loop: distance = t.getDistance(); "}"), basename_sz, basename_ptr, basename_sz, basename_ptr, - (bsession ? "\n\tif (UHTTP::data_session == U_NULLPTR) U_NEW(UDataSession, UHTTP::data_session, UDataSession);\n\t" : ""), - (bstorage ? "\n\tif (UHTTP::data_storage == U_NULLPTR) { U_NEW(UDataSession, UHTTP::data_storage, UDataSession(*UString::str_storage_keyid)); }\n\t" : "")); + (bsession ? "\n\tif (UHTTP::data_session == U_NULLPTR) U_NEW(UDataSession, UHTTP::data_session, UDataSession);\n" : ""), + (bstorage ? "\n\tif (UHTTP::data_storage == U_NULLPTR) { U_NEW(UDataSession, UHTTP::data_storage, UDataSession(*UString::str_storage_keyid)); }\n" : "")); } - if (binit) (void) u__snprintf(ptr1, 100, U_CONSTANT_TO_PARAM("\n\t\tif (param == U_DPAGE_INIT) { usp_init_%.*s(); return; }\n\t"), basename_sz, basename_ptr); + if (binit) (void) u__snprintf(ptr1, 100, U_CONSTANT_TO_PARAM("\n\t\tif (param == U_DPAGE_INIT) { usp_init_%.*s(); return; }\n"), basename_sz, basename_ptr); if (binit == false || bend == false || @@ -787,14 +787,14 @@ loop: distance = t.getDistance(); if (bvar) { (void) vars.append(U_CONSTANT_TO_PARAM("\n\tuint32_t usp_sz = 0;" - "\n\tchar usp_buffer[10 * 4096];\n\t")); + "\n\tchar usp_buffer[10 * 4096];\n")); } // NB: we check for HTML without HTTP headers... if (http_header.empty()) { - if (is_html) (void) http_header.append(U_CONSTANT_TO_PARAM("\n\tUHTTP::mime_index = U_html;\n\t")); + if (is_html) (void) http_header.append(U_CONSTANT_TO_PARAM("\n\tUHTTP::mime_index = U_html;\n")); (void) http_header.append(U_CONSTANT_TO_PARAM("\n\tU_http_info.endHeader = 0;\n")); } @@ -815,6 +815,7 @@ loop: distance = t.getDistance(); "\tU_TRACE(0, \"::runDynamicPage_%.*s(%%d)\", param)\n" "\t\n" "%v" + "\t\n" "\tif (param)\n" "\t\t{\n" "%s" diff --git a/tests/examples/web_server.sh b/tests/examples/web_server.sh index cb8350ca..f03c4d38 100755 --- a/tests/examples/web_server.sh +++ b/tests/examples/web_server.sh @@ -4,11 +4,11 @@ (cd benchmark; rm -f db; creat_link FrameworkBenchmarks/ULib/db db) -#DOC_ROOT=docroot + DOC_ROOT=docroot #DOC_ROOT=sse_example #DOC_ROOT=ruby/blog #DOC_ROOT=benchmark/docroot - DOC_ROOT=ShivShankarDayal/docroot +#DOC_ROOT=ShivShankarDayal/docroot rm -f tmp/usp_compile.sh.err /tmp/*.hpack.* \ $DOC_ROOT/web_server.log* \ @@ -20,7 +20,7 @@ rm -f tmp/usp_compile.sh.err /tmp/*.hpack.* \ UTRACE_SIGNAL="0 50M 0" #UOBJDUMP="0 10M 100" #USIMERR="error.sim" - UMEMUSAGE=yes +#UMEMUSAGE=yes export UTRACE UOBJDUMP USIMERR UTRACE_SIGNAL UMEMUSAGE SOCK1=tmp/fcgi.socket @@ -73,26 +73,21 @@ userver { #CRASH_COUNT 1 #CRASH_EMAIL_NOTIFY mail.unirel.com:stefano.casazza@unirel.com #DOS_SITE_COUNT 1 -#DOS_WHITE_LIST 127.0.0.1 + DOS_WHITE_LIST 127.0.0.1 #DOS_LOGFILE /tmp/dos_blacklist.txt #REQ_TIMEOUT 300 #PLUGIN "ssi http" #ORM_DRIVER "sqlite mysql" #ORM_DRIVER sqlite #DOCUMENT_ROOT . -#PLUGIN_DIR ../../src/ulib/net/server/plugin/.libs -#ORM_DRIVER_DIR ../../src/ulib/orm/driver/.libs -#DOCUMENT_ROOT php -#DOCUMENT_ROOT docroot -#DOCUMENT_ROOT sse_example -#PLUGIN_DIR ../../../src/ulib/net/server/plugin/.libs -#ORM_DRIVER_DIR ../../../src/ulib/orm/driver/.libs -#DOCUMENT_ROOT JONATHAN/docroot +#PLUGIN_DIR ../../src/ulib/net/server/plugin/.libs +#ORM_DRIVER_DIR ../../src/ulib/orm/driver/.libs + DOCUMENT_ROOT $DOC_ROOT + PLUGIN_DIR ../../../src/ulib/net/server/plugin/.libs + ORM_DRIVER_DIR ../../../src/ulib/orm/driver/.libs #DOCUMENT_ROOT benchmark/docroot -#DOCUMENT_ROOT ruby/blog/public - DOCUMENT_ROOT ShivShankarDayal/docroot - PLUGIN_DIR ../../../../src/ulib/net/server/plugin/.libs - ORM_DRIVER_DIR ../../../../src/ulib/orm/driver/.libs +#PLUGIN_DIR ../../../../src/ulib/net/server/plugin/.libs +#ORM_DRIVER_DIR ../../../../src/ulib/orm/driver/.libs } http { #ALIAS "[ / /100.html ]"