From 6d5f517be73954607bc240c388016bcbdfbc3ea7 Mon Sep 17 00:00:00 2001 From: ruanshudong Date: Wed, 1 Apr 2020 20:29:29 +0800 Subject: [PATCH] support http1, change file name same to taf --- CMakeLists.txt | 4 + cmake/Common.cmake | 19 +- examples/AuthDemo/Client/main.cpp | 2 +- examples/CMakeLists.txt | 86 +- examples/CoroutineDemo/client/main.cpp | 2 +- examples/CustomDemo/CustomClient/main.cpp | 2 +- examples/HttpDemo/Http2Client/main.cpp | 71 +- examples/HttpDemo/Http2Server/Http2Imp.cpp | 2 + examples/HttpDemo/HttpClient/main.cpp | 433 ++--- examples/HttpDemo/HttpServer/HttpImp.cpp | 14 +- .../HelloServer/Client/main.cpp | 2 +- examples/SSLDemo/Client/config.conf | 24 +- examples/SSLDemo/Client/main.cpp | 2 +- examples/SSLDemo/Server/config.conf | 24 +- examples/scripts/run-auth.bat | 2 +- examples/scripts/run-auth.sh | 2 +- examples/scripts/run-co.bat | 2 +- examples/scripts/run-co.sh | 2 +- examples/scripts/run-custom.bat | 2 +- examples/scripts/run-custom.sh | 2 +- examples/scripts/run-http.bat | 2 +- examples/scripts/run-http.sh | 6 +- examples/scripts/run-http2.bat | 2 +- examples/scripts/run-http2.sh | 2 +- examples/scripts/run-push.bat | 2 +- examples/scripts/run-push.sh | 2 +- examples/scripts/run-quick-start.bat | 2 +- examples/scripts/run-quick-start.sh | 2 +- examples/scripts/run-ssl.bat | 2 +- examples/scripts/run-ssl.sh | 2 +- examples/scripts/run-udp.bat | 2 +- examples/scripts/run-udp.sh | 2 +- servant/CMakeLists.txt | 2 +- servant/libservant/AdapterProxy.cpp | 472 ++++-- servant/libservant/AdminServant.cpp | 2 +- servant/libservant/AppProtocol.cpp | 151 +- servant/libservant/Application.cpp | 103 +- servant/libservant/AsyncProcThread.cpp | 4 +- servant/libservant/CMakeLists.txt | 2 +- servant/libservant/Communicator.cpp | 63 +- servant/libservant/CommunicatorEpoll.cpp | 4 +- servant/libservant/CoroutineScheduler.cpp | 2 +- servant/libservant/EndpointInfo.cpp | 2 +- servant/libservant/EndpointManager.cpp | 33 +- servant/libservant/NetworkUtil.cpp | 22 +- servant/libservant/ObjectProxy.cpp | 151 +- servant/libservant/Servant.cpp | 2 +- servant/libservant/ServantHandle.cpp | 48 +- servant/libservant/ServantProxy.cpp | 306 +++- servant/libservant/ServantProxyFactory.cpp | 2 +- servant/libservant/StatReport.cpp | 6 +- servant/libservant/TarsConfig.cpp | 213 --- servant/libservant/TarsCurrent.cpp | 437 ----- servant/libservant/TarsLogger.cpp | 723 --------- servant/libservant/TarsNodeF.cpp | 116 -- servant/libservant/TarsNotify.cpp | 132 -- servant/libservant/Transceiver.cpp | 26 +- servant/makefile/makefile.tars | 8 +- servant/servant/AdapterProxy.h | 82 +- servant/servant/AdminServant.h | 2 +- servant/servant/AppCache.h | 4 +- servant/servant/AppProtocol.h | 2 + servant/servant/Application.h | 34 +- servant/servant/Communicator.h | 38 +- servant/servant/CommunicatorEpoll.h | 11 +- servant/servant/EndpointManager.h | 26 +- servant/servant/Global.h | 16 +- servant/servant/Message.h | 68 +- servant/servant/NotifyObserver.h | 2 +- servant/servant/ObjectProxy.h | 86 +- servant/servant/PropertyReport.h | 10 +- servant/servant/Servant.h | 4 +- servant/servant/ServantHandle.h | 24 +- servant/servant/ServantHelper.h | 8 +- servant/servant/ServantProxy.h | 187 ++- servant/servant/StatReport.h | 5 + servant/servant/TarsConfig.h | 154 -- servant/servant/TarsCookie.h | 72 - servant/servant/TarsCurrent.h | 330 ---- servant/servant/TarsLogger.h | 893 ---------- servant/servant/TarsNodeF.h | 80 - servant/servant/TarsNotify.h | 101 -- servant/servant/Transceiver.h | 4 +- tools/tars2node/gen_server_ts.cpp | 8 +- tools/tarsparse/tars.lex.cpp | 36 +- tools/tarsparse/tars.tab.cpp | 266 +-- util/include/util/tc_autoptr.h | 4 +- util/include/util/tc_common.h | 24 +- util/include/util/tc_epoll_server.h | 12 +- util/include/util/tc_ex.h | 3 +- util/include/util/tc_http.h | 284 ++-- util/include/util/tc_http2.h | 9 +- util/include/util/tc_logger.h | 37 +- util/include/util/tc_network_buffer.h | 16 +- util/include/util/tc_openssl.h | 2 +- util/include/util/tc_platform.h | 39 + util/include/util/tc_singleton.h | 109 +- util/include/util/tc_spin_lock.h | 3 +- util/include/util/tc_thread_mutex.h | 9 +- util/include/util/tc_thread_rwlock.h | 3 +- util/include/util/tc_timeout_queue_new.h | 5 +- util/include/util/tc_timeout_queue_noid.h | 4 + util/include/util/tc_timeprovider.h | 2 +- util/src/tc_cgi.cpp | 5 +- util/src/tc_config.cpp | 3 +- util/src/tc_encoder.cpp | 8 +- util/src/tc_epoll_server.cpp | 10 +- util/src/tc_epoller.cpp | 10 +- util/src/tc_file.cpp | 8 +- util/src/tc_http.cpp | 1438 ++++++++--------- util/src/tc_http2.cpp | 51 +- util/src/tc_http_async.cpp | 7 +- util/src/tc_logger.cpp | 7 +- util/src/tc_md5.cpp | 2 +- util/src/tc_mmap.cpp | 18 +- util/src/tc_network_buffer.cpp | 2 +- util/src/tc_openssl.cpp | 15 +- util/src/tc_sem_mutex.cpp | 28 +- util/src/tc_shm.cpp | 4 +- util/src/tc_socket.cpp | 52 +- 120 files changed, 3122 insertions(+), 5423 deletions(-) delete mode 100755 servant/libservant/TarsConfig.cpp delete mode 100644 servant/libservant/TarsCurrent.cpp delete mode 100644 servant/libservant/TarsLogger.cpp delete mode 100755 servant/libservant/TarsNodeF.cpp delete mode 100644 servant/libservant/TarsNotify.cpp delete mode 100644 servant/servant/TarsConfig.h delete mode 100644 servant/servant/TarsCookie.h delete mode 100644 servant/servant/TarsCurrent.h delete mode 100755 servant/servant/TarsLogger.h delete mode 100644 servant/servant/TarsNodeF.h delete mode 100644 servant/servant/TarsNotify.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 27aa9017..ae88406b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,10 @@ if("${TARS_CPP_COMMON}" STREQUAL "") endif() +set(CLEAR_INCLUDE "clear-install.cmake") +FILE(WRITE ${CLEAR_INCLUDE} "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_INSTALL_PREFIX}/include)\n") +install(SCRIPT ${CLEAR_INCLUDE}) + #------------------------------------------------------------------- include_directories(${PROJECT_SOURCE_DIR}/util/include) diff --git a/cmake/Common.cmake b/cmake/Common.cmake index 743a0992..45e55a54 100755 --- a/cmake/Common.cmake +++ b/cmake/Common.cmake @@ -21,11 +21,18 @@ foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin) endforeach() -set(_USE_OPENTRACKING $ENV{_USE_OPENTRACKING}) -if(_USE_OPENTRACKING) -set(OPENTRACKING_INC "/usr/local/include") -add_definitions(-D_USE_OPENTRACKING=${_USE_OPENTRACKING}) -endif() +option(TARS_OPENTRACKING "option for open tracking" OFF) + +if (TARS_OPENTRACKING) + add_definitions(-DTARS_OPENTRACKING=1) + set(OPENTRACKING_INC "/usr/local/include") +endif () + +# set(TARS_OPENTRACKING $ENV{TARS_OPENTRACKING}) +# if(TARS_OPENTRACKING) +# set(OPENTRACKING_INC "/usr/local/include") +# add_definitions(-D_USE_OPENTRACKING=${TARS_OPENTRACKING}) +# endif() #------------------------------------------------------------- @@ -88,5 +95,7 @@ message("PLATFORM: ${PLATFORM}") message("CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}") message("BIN: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") message("TARS2CPP: ${TARS2CPP}") +message("TARS_OPENTRACKING: ${TARS_OPENTRACKING}") + #------------------------------------------------------------- diff --git a/examples/AuthDemo/Client/main.cpp b/examples/AuthDemo/Client/main.cpp index 1adc18e8..7dd8af15 100644 --- a/examples/AuthDemo/Client/main.cpp +++ b/examples/AuthDemo/Client/main.cpp @@ -153,7 +153,7 @@ int main(int argc, char *argv[]) conf.parseFile(option.getValue("config")); _comm->setProperty(conf); -// TarsRollLogger::getInstance()->logger()->setLogLevel(6); +// LocalRollLogger::getInstance()->logger()->setLogLevel(6); _comm->setProperty("sendqueuelimit", "1000000"); _comm->setProperty("asyncqueuecap", "1000000"); diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 6c5fab37..e8047b9a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -14,7 +14,7 @@ add_subdirectory(QuickStartDemo) add_subdirectory(StressDemo) add_subdirectory(UdpDemo) -set(WORKING_DIRECTORY ${tars-cpp_SOURCE_DIR}) +set(WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) if(WIN32) @@ -22,28 +22,28 @@ if(WIN32) WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS QuickStartDemo QuickStartDemoClient USES_TERMINAL - COMMAND examples/scripts/run-quick-start.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-quick-start.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call quick start") add_custom_target(run-http WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS HttpServer HttpClient USES_TERMINAL - COMMAND examples/scripts/run-http.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-http.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run http") add_custom_target(run-auth WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS AuthServer AuthClient USES_TERMINAL - COMMAND examples/scripts/run-auth.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-auth.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run auth") add_custom_target(run-udp WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS UdpServer UdpClient USES_TERMINAL - COMMAND examples/scripts/run-udp.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-udp.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run udp") if(TARS_HTTP2) @@ -51,7 +51,7 @@ if(WIN32) WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS Http2Server Http2Client USES_TERMINAL - COMMAND examples/scripts/run-http2.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-http2.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run http2") endif() @@ -60,7 +60,7 @@ if(WIN32) WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS SSLServer SSLClient USES_TERMINAL - COMMAND examples/scripts/run-ssl.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-ssl.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run ssl") endif() @@ -68,21 +68,21 @@ if(WIN32) WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS CoroutineDemoAServer CoroutineDemoBServer CoroutineDemoClient testCoro testParallelCoro USES_TERMINAL - COMMAND examples/scripts/run-co.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-co.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run co") add_custom_target(run-custom WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS CustomServer CustomClient USES_TERMINAL - COMMAND examples/scripts/run-custom.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-custom.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run custom") add_custom_target(run-push WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS PushServer PushClient USES_TERMINAL - COMMAND examples/scripts/run-push.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-push.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run push") if(TARS_SSL) @@ -90,23 +90,23 @@ if(WIN32) WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS QuickStartDemo QuickStartDemoClient HttpServer HttpClient AuthServer AuthClient SSLServer SSLClient CoroutineDemoAServer CoroutineDemoBServer CoroutineDemoClient testCoro testParallelCoro PushServer PushClient USES_TERMINAL - COMMAND examples/scripts/run-quick-start.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND examples/scripts/run-http.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND examples/scripts/run-co.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND examples/scripts/run-push.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND examples/scripts/run-auth.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND examples/scripts/run-ssl.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-quick-start.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-http.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-co.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-push.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-auth.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-ssl.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run all") else() add_custom_target(run-all WORKING_DIRECTORY ${WORKING_DIRECTORY} USES_TERMINAL DEPENDS QuickStartDemo QuickStartDemoClient HttpServer HttpClient AuthServer AuthClient CoroutineDemoAServer CoroutineDemoBServer CoroutineDemoClient testCoro testParallelCoro PushServer PushClient - COMMAND examples/scripts/run-quick-start.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND examples/scripts/run-http.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND examples/scripts/run-co.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND examples/scripts/run-push.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND examples/scripts/run-auth.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-quick-start.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-http.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-co.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-push.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-auth.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run all") endif() @@ -114,39 +114,39 @@ if(WIN32) add_custom_target(run-kill WORKING_DIRECTORY ${WORKING_DIRECTORY} USES_TERMINAL - COMMAND examples/scripts/run-kill.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND ../examples/scripts/run-kill.bat ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run kill") else(WIN32) add_custom_target(run-quick-start WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS QuickStartDemo QuickStartDemoClient - COMMAND sh examples/scripts/run-quick-start.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-quick-start.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call quick start") add_custom_target(run-http WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS HttpServer HttpClient - COMMAND sh examples/scripts/run-http.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-http.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run http") add_custom_target(run-udp WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS UdpServer UdpClient - COMMAND sh examples/scripts/run-udp.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-udp.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run udp") add_custom_target(run-auth WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS AuthServer AuthClient - COMMAND sh examples/scripts/run-auth.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-auth.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run auth") if(TARS_HTTP2) add_custom_target(run-http2 WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS Http2Server Http2Client - COMMAND sh examples/scripts/run-http2.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-http2.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run http2") endif() @@ -154,53 +154,53 @@ else(WIN32) add_custom_target(run-ssl WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS SSLServer SSLClient - COMMAND sh examples/scripts/run-ssl.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-ssl.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run ssl") endif() add_custom_target(run-co WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS CoroutineDemoAServer CoroutineDemoBServer CoroutineDemoClient testCoro testParallelCoro - COMMAND sh examples/scripts/run-co.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-co.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run co") add_custom_target(run-custom WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS CustomServer CustomClient - COMMAND sh examples/scripts/run-custom.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-custom.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run custom") add_custom_target(run-push WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS PushServer PushClient - COMMAND sh examples/scripts/run-push.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-push.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run push") if(TARS_SSL) add_custom_target(run-all WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS QuickStartDemo QuickStartDemoClient HttpServer HttpClient AuthServer AuthClient SSLServer SSLClient CoroutineDemoAServer CoroutineDemoBServer CoroutineDemoClient testCoro testParallelCoro PushServer PushClient - COMMAND sh examples/scripts/run-quick-start.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND sh examples/scripts/run-http.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND sh examples/scripts/run-co.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND sh examples/scripts/run-push.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND sh examples/scripts/run-auth.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND sh examples/scripts/run-ssl.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-quick-start.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-http.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-co.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-push.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-auth.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-ssl.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run all") else() add_custom_target(run-all WORKING_DIRECTORY ${WORKING_DIRECTORY} DEPENDS QuickStartDemo QuickStartDemoClient HttpServer HttpClient AuthServer AuthClient CoroutineDemoAServer CoroutineDemoBServer CoroutineDemoClient testCoro testParallelCoro PushServer PushClient - COMMAND sh examples/scripts/run-quick-start.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND sh examples/scripts/run-http.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND sh examples/scripts/run-co.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND sh examples/scripts/run-push.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} - COMMAND sh examples/scripts/run-auth.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-quick-start.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-http.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-co.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-push.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-auth.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run all") endif() add_custom_target(run-kill WORKING_DIRECTORY ${WORKING_DIRECTORY} - COMMAND sh examples/scripts/run-kill.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} + COMMAND sh ../examples/scripts/run-kill.sh ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${WORKING_DIRECTORY} COMMENT "call run kill") endif(WIN32) diff --git a/examples/CoroutineDemo/client/main.cpp b/examples/CoroutineDemo/client/main.cpp index 22423332..22cc4e65 100644 --- a/examples/CoroutineDemo/client/main.cpp +++ b/examples/CoroutineDemo/client/main.cpp @@ -188,7 +188,7 @@ int main(int argc, char *argv[]) param.pPrx = _comm->stringToProxy(coroObj); -// TarsRollLogger::getInstance()->logger()->setLogLevel(6); +// LocalRollLogger::getInstance()->logger()->setLogLevel(6); _comm->setProperty("sendqueuelimit", "1000000"); _comm->setProperty("asyncqueuecap", "1000000"); diff --git a/examples/CustomDemo/CustomClient/main.cpp b/examples/CustomDemo/CustomClient/main.cpp index d27fe065..c9996392 100644 --- a/examples/CustomDemo/CustomClient/main.cpp +++ b/examples/CustomDemo/CustomClient/main.cpp @@ -198,7 +198,7 @@ int main(int argc, char *argv[]) param.servantPrx = _comm->stringToProxy(sObjName); -// TarsRollLogger::getInstance()->logger()->setLogLevel(6); +// LocalRollLogger::getInstance()->logger()->setLogLevel(6); ProxyProtocol prot; prot.requestFunc = customRequest; prot.responseFunc = customResponse; diff --git a/examples/HttpDemo/Http2Client/main.cpp b/examples/HttpDemo/Http2Client/main.cpp index 2344d504..8123fe38 100644 --- a/examples/HttpDemo/Http2Client/main.cpp +++ b/examples/HttpDemo/Http2Client/main.cpp @@ -45,25 +45,26 @@ void syncRpc2(int c) { int64_t t = TC_Common::now2us(); - std::map header; - header[":authority"] = "domain.com"; - header[":scheme"] = "http"; - // header[":method"] = "POST"; - - std::map rheader; //发起远程调用 for (int i = 0; i < c; ++i) { - string rbody; + shared_ptr rsp; + shared_ptr req = std::make_shared(); + req->setPostRequest("http://domain.com/hello", string("helloworld-") + TC_Common::tostr(i), true); + + try + { + param.servant2Prx->http_call("hello", req, rsp); + } + catch (exception & e) + { + cout << "exception:" << e.what() << endl; + } + + assert(req->getContent() == rsp->getContent()); + assert(req.use_count() == 1); + assert(rsp.use_count() == 1); - try - { - param.servant2Prx->http_call("POST", "/", header, "helloworld", rheader, rbody); - } - catch(exception& e) - { - cout << "exception:" << e.what() << endl; - } ++callback_count; } @@ -71,30 +72,22 @@ void syncRpc2(int c) cout << "syncRpc2 total:" << cost << "us, avg:" << 1.*cost/c << "us" << endl; } - struct TestHttpCallback : public HttpCallback { - TestHttpCallback(int64_t t, int i, int c) : start(t), cur(i), count(c) + TestHttpCallback(const string &buff) : _buff(buff) { } - virtual int onHttpResponse(const std::map& requestHeaders , - const std::map& responseHeaders , - const std::vector& rspBody) + virtual int onHttpResponse(const shared_ptr &rsp) { callback_count++; - if(cur == count-1) - { - int64_t cost = TC_Common::now2us() - start; - cout << "onHttpResponse count:" << count << ", " << cost << " us, avg:" << 1.*cost/count << "us" << endl; - } + assert(_buff == rsp->getContent()); return 0; } - virtual int onHttpResponseException(const std::map& requestHeaders, - int expCode) + virtual int onHttpResponseException(int expCode) { cout << "onHttpResponseException expCode:" << expCode << endl; @@ -103,27 +96,26 @@ struct TestHttpCallback : public HttpCallback return 0; } - int64_t start; - int cur; - int count; + string _buff; }; void asyncRpc2(int c) { int64_t t = TC_Common::now2us(); - std::map header; - header[":authority"] = "domain.com"; - header[":scheme"] = "http"; - //发起远程调用 for (int i = 0; i < c; ++i) { - HttpCallbackPtr p = new TestHttpCallback(t, i, c); + shared_ptr req = std::make_shared(); + + string buff = string("helloworld-") + TC_Common::tostr(i); + req->setPostRequest("http://domain.com/hello", buff, true); + + HttpCallbackPtr p = new TestHttpCallback(buff); try { - param.servant2Prx->http_call_async("POST", "/", header, "helloworld", p); + param.servant2Prx->http_call_async("hello", req, p); } catch(exception& e) { @@ -140,6 +132,7 @@ void asyncRpc2(int c) cout << "asyncRpc2 send:" << cost << "us, avg:" << 1.*cost/c << "us" << endl; } + int main(int argc, char *argv[]) { try @@ -173,11 +166,7 @@ int main(int argc, char *argv[]) param.servant2Prx->tars_connect_timeout(5000); param.servant2Prx->tars_async_timeout(60*1000); - ProxyProtocol proto; - - proto.requestFunc = ProxyProtocol::http2Request; - proto.responseFunc = ProxyProtocol::http2Response; - param.servant2Prx->tars_set_protocol(proto); + param.servant2Prx->tars_set_protocol(ServantProxy::PROTOCOL_HTTP2); int64_t start = TC_Common::now2us(); diff --git a/examples/HttpDemo/Http2Server/Http2Imp.cpp b/examples/HttpDemo/Http2Server/Http2Imp.cpp index 823e19ee..9ef45370 100644 --- a/examples/HttpDemo/Http2Server/Http2Imp.cpp +++ b/examples/HttpDemo/Http2Server/Http2Imp.cpp @@ -57,6 +57,8 @@ int Http2Imp::doRequest(TarsCurrentPtr current, vector &buffer) { cout << "encodeResponse error:" << session->getErrMsg() << endl; } +// cout << context->request.getContent() << endl; + buffer.insert(buffer.end(), data.begin(), data.end()); } diff --git a/examples/HttpDemo/HttpClient/main.cpp b/examples/HttpDemo/HttpClient/main.cpp index 5b250dea..25289970 100644 --- a/examples/HttpDemo/HttpClient/main.cpp +++ b/examples/HttpDemo/HttpClient/main.cpp @@ -1,38 +1,23 @@ -/** - * Tencent is pleased to support the open source community by making Tars available. - * - * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ + #include #include "util/tc_http.h" -#include "util/tc_option.h" #include "util/tc_common.h" #include "util/tc_clientsocket.h" #include "util/tc_thread_pool.h" -#include "tup/Tars.h" -#include "tup/tup.h" +// #include "tup/tup.h" #include "util/tc_timeprovider.h" #include "servant/Application.h" + using namespace std; using namespace tars; -using namespace tup; - +// using namespace wup; Communicator* _comm; -//static string httpObj = "TestApp.HttpServer.httpObj@tcp -h 127.0.0.1 -p 8081"; -static string httpObj = "TestApp.HttpServer.httpObj@tcp -h 134.175.105.92 -p 8081"; +//static string httpObj = "TestApp.HttpServer.httpObj@tcp -h 127.0.0.1 -p 8081:tcp -h 127.0.0.1 -p 8082:tcp -h 127.0.0.1 -p 8083"; +static string httpObj = "TestApp.HttpServer.httpObj@tcp -h 127.0.0.1 -p 8081"; +//static string httpObj = "TestApp.HttpServer.httpObj@tcp -h 134.175.105.92 -p 8081"; struct Param { @@ -46,198 +31,272 @@ struct Param Param param; std::atomic callback_count(0); - void httpCall(int excut_num) { - int64_t _iTime = TC_TimeProvider::getInstance()->getNowMs(); + int64_t _iTime = TC_TimeProvider::getInstance()->getNowMs(); - // string sServer1("http://134.175.105.92:8081/"); - string sServer1("http://127.0.0.1:8081/"); + // string sServer1("http://134.175.105.92:8081/"); + string sServer1("http://127.0.0.1:8081/"); - TC_HttpRequest stHttpReq; - stHttpReq.setCacheControl("no-cache"); + TC_HttpRequest stHttpReq; + stHttpReq.setCacheControl("no-cache"); // stHttpReq.setGetRequest(sServer1); - TC_TCPClient client ; - // client.init("127.0.0.1", 8081, 3000); - client.init("127.0.0.1", 8082, 3000); - - int iRet = 0; - - for (int i = 0; igetNowMs() - _iTime <<"(ms)"<getNowMs() - _iTime <<"(ms)"< req = std::make_shared(); + req->setPostRequest("http://tars.com/hello", buff, true); +// req->setHeader("Connection", "keep-alive"); + + shared_ptr rsp; + + try + { + param.servantPrx->tars_hash(i)->http_call("hello", req, rsp); + assert(req->getContent() == rsp->getContent()); + } + catch(exception& e) + { + cout << "exception:" << e.what() << endl; + } + +// sleep(1); +// assert(req.use_count() == 1); +// assert(rsp.use_count() == 1); + ++callback_count; + } + + int64_t cost = TC_Common::now2us() - t; + cout << "syncCall total:" << cost << "us, avg:" << 1.*cost/c << "us" << endl; } struct TestHttpCallback : public HttpCallback { - TestHttpCallback(int64_t t, int i, int c) : start(t), cur(i), count(c) - { - - } - - virtual int onHttpResponse(const std::map& requestHeaders , - const std::map& responseHeaders , - const std::vector& rspBody) - { - callback_count++; - - if(cur == count-1) - { - int64_t cost = TC_Common::now2us() - start; - cout << "onHttpResponse count:" << count << ", " << cost << " us, avg:" << 1.*cost/count << "us" << endl; - } - - return 0; - } - virtual int onHttpResponseException(const std::map& requestHeaders, - int expCode) - { - cout << "onHttpResponseException expCode:" << expCode << endl; - - callback_count++; - - return 0; - } - - int64_t start; - int cur; - int count; + TestHttpCallback(const string &buff) : _buff(buff) + { + + } + + virtual int onHttpResponse(const shared_ptr &rsp) + { + callback_count++; + + assert(_buff == rsp->getContent()); + + return 0; + } + virtual int onHttpResponseException(int expCode) + { + cout << "onHttpResponseException expCode:" << expCode << endl; + + callback_count++; + + return 0; + } + + string _buff; }; -void syncRpc(int c) +void asyncRpc(int c) { int64_t t = TC_Common::now2us(); - std::map header; - - std::map rheader; - //发起远程调用 - for (int i = 0; i < c; ++i) - { - string rbody; - - try - { - param.servantPrx->http_call("GET", "/", header, "helloworld", rheader, rbody); - } - catch(exception& e) - { - cout << "exception:" << e.what() << endl; - } - ++callback_count; - } - - int64_t cost = TC_Common::now2us() - t; - cout << "syncCall total:" << cost << "us, avg:" << 1.*cost/c << "us" << endl; + //发起远程调用 + for (int i = 0; i < c; ++i) + { + shared_ptr req = std::make_shared(); + + string buff = string("helloworld-") + TC_Common::tostr(i); + req->setPostRequest("http://tars.com/hello", buff, true); +// req->setHeader("Connection", "keep-alive"); + + HttpCallbackPtr p = new TestHttpCallback(buff); + + try + { + param.servantPrx->http_call_async("hello", req, p); + } + catch(exception& e) + { + cout << "exception:" << e.what() << endl; + } + + if(i % 500 == 0) + { + TC_Common::msleep(100); + } + } + + int64_t cost = TC_Common::now2us() - t; + cout << "asyncRpc2 send:" << cost << "us, avg:" << 1.*cost/c << "us" << endl; +} + + +void asyncRpcCallback(int c) +{ + int64_t t = TC_Common::now2us(); + + _comm->setServantCustomCallback(param.servantPrx->tars_name(), [](ReqMessagePtr msg) { + msg->callback->dispatch(msg); + }); + + //发起远程调用 + for (int i = 0; i < c; ++i) + { + shared_ptr req = std::make_shared(); + + string buff = string("helloworld-") + TC_Common::tostr(i); + req->setPostRequest("http://tars.com/hello", buff, true); +// req->setHeader("Connection", "keep-alive"); + + HttpCallbackPtr p = new TestHttpCallback(buff); + + try + { + param.servantPrx->http_call_async("hello", req, p); + } + catch(exception& e) + { + cout << "exception:" << e.what() << endl; + } + + if(i % 500 == 0) + { + TC_Common::msleep(100); + } + } + + int64_t cost = TC_Common::now2us() - t; + cout << "asyncRpc2 send:" << cost << "us, avg:" << 1.*cost/c << "us" << endl; } int main(int argc, char *argv[]) { - try - { - if (argc < 4) - { - cout << "Usage:" << argv[0] << "--count=1000 --call=[basehttp|synchttp] --thread=1" << endl; + try + { + if (argc < 4) + { + cout << "Usage:" << argv[0] << "--count=1000 --call=[base|sync|async|callback] --thread=1" << endl; - return 0; - } + return 0; + } - TC_Option option; - option.decode(argc, argv); + TC_Option option; + option.decode(argc, argv); param.count = TC_Common::strto(option.getValue("count")); - if(param.count <= 0) param.count = 1000; - param.call = option.getValue("call"); - if(param.call.empty()) param.call = "sync"; - param.thread = TC_Common::strto(option.getValue("thread")); - if(param.thread <= 0) param.thread = 1; -/* + if(param.count <= 0) param.count = 1000; + param.call = option.getValue("call"); + if(param.call.empty()) param.call = "sync"; + param.thread = TC_Common::strto(option.getValue("thread")); + if(param.thread <= 0) param.thread = 1; + _comm = new Communicator(); -// TarsRollLogger::getInstance()->logger()->setLogLevel(6); + // LocalRollLogger::getInstance()->logger()->setLogLevel(6); _comm->setProperty("sendqueuelimit", "1000000"); _comm->setProperty("asyncqueuecap", "1000000"); - param.servantPrx = _comm->stringToProxy(httpObj); - - param.servantPrx->tars_connect_timeout(5000); - param.servantPrx->tars_async_timeout(60*1000); - - ProxyProtocol proto; - proto.requestFunc = ProxyProtocol::http1Request; - proto.responseFunc = ProxyProtocol::http1Response; - param.servantPrx->tars_set_protocol(proto); - */ - int64_t start = TC_Common::now2us(); - - std::function func; - - if (param.call == "basehttp") - { - func = httpCall; - } - else if (param.call == "synchttp") - { - func = syncRpc; - } - // else if(param.call == "asynchttp") - // { - // func = asyncRpc; - // } - else - { - cout << "no func, exits" << endl; - exit(0); - } - - vector vt; - for(int i = 0 ; i< param.thread; i++) - { - vt.push_back(new std::thread(func, param.count)); - } - - std::thread print([&]{while(callback_count != param.count * param.thread) { - cout << "Http:" << param.call << ": ----------finish count:" << callback_count << endl; - std::this_thread::sleep_for(std::chrono::seconds(1)); - };}); - - for(size_t i = 0 ; i< vt.size(); i++) - { - vt[i]->join(); - delete vt[i]; - } - - cout << "(pid:" << std::this_thread::get_id() << ")" - << "(count:" << param.count << ")" - << "(use ms:" << (TC_Common::now2us() - start)/1000 << ")" - << endl; - - while(callback_count != param.count * param.thread) { - std::this_thread::sleep_for(std::chrono::seconds(1)); - } - print.join(); - cout << "----------finish count:" << callback_count << endl; - } - catch(exception &ex) - { - cout << ex.what() << endl; - } - cout << "main return." << endl; - - return 0; + param.servantPrx = _comm->stringToProxy(httpObj); + + int64_t start = TC_Common::now2us(); + + std::function func; + + if (param.call == "base") + { + func = httpCall; + } + else if (param.call == "sync") + { + func = syncRpc; + } + else if(param.call == "async") + { + func = asyncRpc; + } + else if(param.call == "callback") + { + func = asyncRpcCallback; + } + else + { + cout << "no func, exits" << endl; + exit(0); + } + + param.servantPrx->tars_connect_timeout(5000); + param.servantPrx->tars_async_timeout(60*1000); + + param.servantPrx->tars_set_protocol(ServantProxy::PROTOCOL_HTTP1, 3); + + vector vt; + for(int i = 0 ; i< param.thread; i++) + { + vt.push_back(new std::thread(func, param.count)); + } + + std::thread print([&]{while(callback_count != param.count * param.thread) { + cout << "Http:" << param.call << ": ----------finish count:" << callback_count << endl; + std::this_thread::sleep_for(std::chrono::seconds(1)); + };}); + + for(size_t i = 0 ; i< vt.size(); i++) + { + vt[i]->join(); + delete vt[i]; + } + + cout << "(pid:" << std::this_thread::get_id() << ")" + << "(count:" << param.count << ")" + << "(use ms:" << (TC_Common::now2us() - start)/1000 << ")" + << endl; + + while(callback_count != param.count * param.thread) { + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + print.join(); + cout << "----------finish count:" << callback_count << endl; + + delete _comm; + _comm = NULL; + } + catch(exception &ex) + { + cout << ex.what() << endl; + } + cout << "main return." << endl; + + return 0; } \ No newline at end of file diff --git a/examples/HttpDemo/HttpServer/HttpImp.cpp b/examples/HttpDemo/HttpServer/HttpImp.cpp index 34745e33..243d7889 100644 --- a/examples/HttpDemo/HttpServer/HttpImp.cpp +++ b/examples/HttpDemo/HttpServer/HttpImp.cpp @@ -35,17 +35,17 @@ void HttpImp::destroy() int HttpImp::doRequest(TarsCurrentPtr current, vector &buffer) { - TC_HttpRequest request; + TC_HttpRequest request; + vector v = current->getRequestBuffer(); - string sBuf; - sBuf.assign(v.data(),v.size()); - request.decode(sBuf); - // cout << request.getContent() << endl; + request.decode(current->getRequestBuffer()); + TC_HttpResponse rsp; - string s="hello"; + string s=request.getContent(); rsp.setResponse(s.c_str(),s.size()); + rsp.setHeader("Connection", request.getHeader("Connection")); rsp.encode(buffer); - + return 0; } diff --git a/examples/QuickStartDemo/HelloServer/Client/main.cpp b/examples/QuickStartDemo/HelloServer/Client/main.cpp index 386f8333..291bea68 100644 --- a/examples/QuickStartDemo/HelloServer/Client/main.cpp +++ b/examples/QuickStartDemo/HelloServer/Client/main.cpp @@ -300,7 +300,7 @@ int main(int argc, char *argv[]) _comm->setProperty("netthread", TC_Common::tostr(param.netthread)); -// TarsRollLogger::getInstance()->logger()->setLogLevel(6); +// LocalRollLogger::getInstance()->logger()->setLogLevel(6); param.pPrx = _comm->stringToProxy(helloObj); diff --git a/examples/SSLDemo/Client/config.conf b/examples/SSLDemo/Client/config.conf index a8b4505a..7c1ad85c 100755 --- a/examples/SSLDemo/Client/config.conf +++ b/examples/SSLDemo/Client/config.conf @@ -23,28 +23,28 @@ #module name modulename = TestApp.SSLClient #server crt - ca = ./examples/SSLDemo/certs/server.crt + ca = ../examples/SSLDemo/certs/server.crt #can be empty - cert = ./examples/SSLDemo/certs/client.crt + cert = ../examples/SSLDemo/certs/client.crt #can be empty - key = ./examples/SSLDemo/certs/client.key + key = ../examples/SSLDemo/certs/client.key #server crt - ca = ./examples/SSLDemo/certs/server1.crt + ca = ../examples/SSLDemo/certs/server1.crt #can be empty - # cert = ./examples/SSLDemo/certs/client1.crt + # cert = ../examples/SSLDemo/certs/client1.crt #can be empty - # key = ./examples/SSLDemo/certs/client1.key + # key = ../examples/SSLDemo/certs/client1.key #server crt - ca = ./examples/SSLDemo/certs/server1.crt + ca = ../examples/SSLDemo/certs/server1.crt #can be empty - cert = ./examples/SSLDemo/certs/client1.crt + cert = ../examples/SSLDemo/certs/client1.crt #can be empty - key = ./examples/SSLDemo/certs/client1.key + key = ../examples/SSLDemo/certs/client1.key @@ -53,11 +53,11 @@ #auth secret key secretkey = 123456 #server crt - ca = ./examples/SSLDemo/certs/server1.crt + ca = ../examples/SSLDemo/certs/server1.crt #can be empty - cert = ./examples/SSLDemo/certs/client1.crt + cert = ../examples/SSLDemo/certs/client1.crt #can be empty - key = ./examples/SSLDemo/certs/client1.key + key = ../examples/SSLDemo/certs/client1.key diff --git a/examples/SSLDemo/Client/main.cpp b/examples/SSLDemo/Client/main.cpp index 3db68db9..8dd85811 100644 --- a/examples/SSLDemo/Client/main.cpp +++ b/examples/SSLDemo/Client/main.cpp @@ -162,7 +162,7 @@ int main(int argc, char *argv[]) conf.parseFile(option.getValue("config")); _comm->setProperty(conf); -// TarsRollLogger::getInstance()->logger()->setLogLevel(6); +// LocalRollLogger::getInstance()->logger()->setLogLevel(6); _comm->setProperty("sendqueuelimit", "1000000"); _comm->setProperty("asyncqueuecap", "1000000"); diff --git a/examples/SSLDemo/Server/config.conf b/examples/SSLDemo/Server/config.conf index 4c56ef08..6570aeb5 100755 --- a/examples/SSLDemo/Server/config.conf +++ b/examples/SSLDemo/Server/config.conf @@ -52,9 +52,9 @@ # log = tars.tarslog.LogObj #client crt, it can be empty when verifyclient is 0 - ca = ./examples/SSLDemo/certs/client.crt - cert = ./examples/SSLDemo/certs/server.crt - key = ./examples/SSLDemo/certs/server.key + ca = ../examples/SSLDemo/certs/client.crt + cert = ../examples/SSLDemo/certs/server.crt + key = ../examples/SSLDemo/certs/server.key #default is 0 verifyclient = 1 @@ -90,9 +90,9 @@ queuecap = 1000000 #tars protocol protocol = tars - # ca = ./examples/SSLDemo/certs/client1.crt - cert = ./examples/SSLDemo/certs/server1.crt - key = ./examples/SSLDemo/certs/server1.key + # ca = ../examples/SSLDemo/certs/client1.crt + cert = ../examples/SSLDemo/certs/server1.crt + key = ../examples/SSLDemo/certs/server1.key #default is 0 verifyclient = 0 @@ -112,9 +112,9 @@ queuecap = 1000000 #tars protocol protocol = tars - ca = ./examples/SSLDemo/certs/client1.crt - cert = ./examples/SSLDemo/certs/server1.crt - key = ./examples/SSLDemo/certs/server1.key + ca = ../examples/SSLDemo/certs/client1.crt + cert = ../examples/SSLDemo/certs/server1.crt + key = ../examples/SSLDemo/certs/server1.key #default is 0 verifyclient = 1 @@ -138,9 +138,9 @@ accesskey = tars-test-user #auth secret key secretkey = 123456 - ca = ./examples/SSLDemo/certs/client1.crt - cert = ./examples/SSLDemo/certs/server1.crt - key = ./examples/SSLDemo/certs/server1.key + ca = ../examples/SSLDemo/certs/client1.crt + cert = ../examples/SSLDemo/certs/server1.crt + key = ../examples/SSLDemo/certs/server1.key #default is 0 verifyclient = 1 diff --git a/examples/scripts/run-auth.bat b/examples/scripts/run-auth.bat index fcff41e0..4d828d8d 100644 --- a/examples/scripts/run-auth.bat +++ b/examples/scripts/run-auth.bat @@ -2,7 +2,7 @@ echo "run-auth.bat" set EXE_PATH=%1 -set SRC_PATH=%2 +set SRC_PATH=%2\\.. echo %EXE_PATH% %SRC_PATH% diff --git a/examples/scripts/run-auth.sh b/examples/scripts/run-auth.sh index 44026db9..6b76bb13 100644 --- a/examples/scripts/run-auth.sh +++ b/examples/scripts/run-auth.sh @@ -3,7 +3,7 @@ echo "run-auth.sh" EXE_PATH=$1 -SRC_PATH=$2 +SRC_PATH=$2/.. echo ${EXE_PATH} ${SRC_PATH} diff --git a/examples/scripts/run-co.bat b/examples/scripts/run-co.bat index e8e02956..72ff1504 100644 --- a/examples/scripts/run-co.bat +++ b/examples/scripts/run-co.bat @@ -2,7 +2,7 @@ echo "run-co.bat" set EXE_PATH=%1 -set SRC_PATH=%2 +set SRC_PATH=%2\\.. echo %EXE_PATH% %SRC_PATH% diff --git a/examples/scripts/run-co.sh b/examples/scripts/run-co.sh index 7d8eef50..03cf52a2 100644 --- a/examples/scripts/run-co.sh +++ b/examples/scripts/run-co.sh @@ -3,7 +3,7 @@ echo "run-co.sh" EXE_PATH=$1 -SRC_PATH=$2 +SRC_PATH=$2/.. echo ${EXE_PATH} ${SRC_PATH} diff --git a/examples/scripts/run-custom.bat b/examples/scripts/run-custom.bat index b1878c93..fe002b47 100644 --- a/examples/scripts/run-custom.bat +++ b/examples/scripts/run-custom.bat @@ -2,7 +2,7 @@ echo "run-push.bat" set EXE_PATH=%1 -set SRC_PATH=%2 +set SRC_PATH=%2\\.. echo %EXE_PATH% %SRC_PATH% diff --git a/examples/scripts/run-custom.sh b/examples/scripts/run-custom.sh index 88d6c471..48d44827 100644 --- a/examples/scripts/run-custom.sh +++ b/examples/scripts/run-custom.sh @@ -3,7 +3,7 @@ echo "run-custom.sh" EXE_PATH=$1 -SRC_PATH=$2 +SRC_PATH=$2/.. echo ${EXE_PATH} ${SRC_PATH} diff --git a/examples/scripts/run-http.bat b/examples/scripts/run-http.bat index 213aabfc..6c36e6a0 100644 --- a/examples/scripts/run-http.bat +++ b/examples/scripts/run-http.bat @@ -2,7 +2,7 @@ echo "run-http.bat" set EXE_PATH=%1 -set SRC_PATH=%2 +set SRC_PATH=%2\\.. echo %EXE_PATH% %SRC_PATH% diff --git a/examples/scripts/run-http.sh b/examples/scripts/run-http.sh index d7c6f723..2f21191a 100644 --- a/examples/scripts/run-http.sh +++ b/examples/scripts/run-http.sh @@ -3,7 +3,7 @@ echo "run-http.sh" EXE_PATH=$1 -SRC_PATH=$2 +SRC_PATH=$2/.. echo ${EXE_PATH} ${SRC_PATH} @@ -18,7 +18,9 @@ sleep 1 echo "client: ${EXE_PATH}/HttpClient" -${EXE_PATH}/HttpClient --count=10000 --thread=2 --call=basehttp +${EXE_PATH}/HttpClient --count=10000 --thread=2 --call=base +${EXE_PATH}/HttpClient --count=10000 --thread=2 --call=sync +${EXE_PATH}/HttpClient --count=10000 --thread=2 --call=async #${EXE_PATH}/HttpClient --count=10000 --thread=2 --call=synchttp sleep 1 diff --git a/examples/scripts/run-http2.bat b/examples/scripts/run-http2.bat index 4882d8b0..e2b07349 100644 --- a/examples/scripts/run-http2.bat +++ b/examples/scripts/run-http2.bat @@ -2,7 +2,7 @@ echo "run-http2.bat" set EXE_PATH=%1 -set SRC_PATH=%2 +set SRC_PATH=%2\\.. echo %EXE_PATH% %SRC_PATH% diff --git a/examples/scripts/run-http2.sh b/examples/scripts/run-http2.sh index bed22244..7a39e371 100644 --- a/examples/scripts/run-http2.sh +++ b/examples/scripts/run-http2.sh @@ -2,7 +2,7 @@ echo "run-http2.sh" EXE_PATH=$1 -SRC_PATH=$2 +SRC_PATH=$2/.. echo ${EXE_PATH} ${SRC_PATH} diff --git a/examples/scripts/run-push.bat b/examples/scripts/run-push.bat index e49a17fe..5c1afdcf 100644 --- a/examples/scripts/run-push.bat +++ b/examples/scripts/run-push.bat @@ -2,7 +2,7 @@ echo "run-push.bat" set EXE_PATH=%1 -set SRC_PATH=%2 +set SRC_PATH=%2\\.. echo %EXE_PATH% %SRC_PATH% diff --git a/examples/scripts/run-push.sh b/examples/scripts/run-push.sh index e77135e6..dfece2bc 100644 --- a/examples/scripts/run-push.sh +++ b/examples/scripts/run-push.sh @@ -2,7 +2,7 @@ echo "run-co.sh" EXE_PATH=$1 -SRC_PATH=$2 +SRC_PATH=$2/.. echo ${EXE_PATH} ${SRC_PATH} diff --git a/examples/scripts/run-quick-start.bat b/examples/scripts/run-quick-start.bat index 141802de..a3c02d8f 100644 --- a/examples/scripts/run-quick-start.bat +++ b/examples/scripts/run-quick-start.bat @@ -2,7 +2,7 @@ echo "run-quick-start.bat" set EXE_PATH=%1 -set SRC_PATH=%2 +set SRC_PATH=%2\\.. echo %EXE_PATH% %SRC_PATH% diff --git a/examples/scripts/run-quick-start.sh b/examples/scripts/run-quick-start.sh index 51d8b7d4..d7a2e06c 100644 --- a/examples/scripts/run-quick-start.sh +++ b/examples/scripts/run-quick-start.sh @@ -2,7 +2,7 @@ echo "run-quick-start.sh" EXE_PATH=$1 -SRC_PATH=$2 +SRC_PATH=$2/.. echo ${EXE_PATH} ${SRC_PATH} diff --git a/examples/scripts/run-ssl.bat b/examples/scripts/run-ssl.bat index 1e8ebdf7..d3214c4c 100644 --- a/examples/scripts/run-ssl.bat +++ b/examples/scripts/run-ssl.bat @@ -2,7 +2,7 @@ echo "run-ssl.bat" set EXE_PATH=%1 -set SRC_PATH=%2 +set SRC_PATH=%2\\.. echo %EXE_PATH% %SRC_PATH% diff --git a/examples/scripts/run-ssl.sh b/examples/scripts/run-ssl.sh index be46809a..a7c8f0c6 100644 --- a/examples/scripts/run-ssl.sh +++ b/examples/scripts/run-ssl.sh @@ -2,7 +2,7 @@ echo "run-ssl.sh" EXE_PATH=$1 -SRC_PATH=$2 +SRC_PATH=$2/.. echo ${EXE_PATH} ${SRC_PATH} diff --git a/examples/scripts/run-udp.bat b/examples/scripts/run-udp.bat index 59d7eb85..49e20187 100644 --- a/examples/scripts/run-udp.bat +++ b/examples/scripts/run-udp.bat @@ -2,7 +2,7 @@ echo "run-auth.bat" set EXE_PATH=%1 -set SRC_PATH=%2 +set SRC_PATH=%2\\.. echo %EXE_PATH% %SRC_PATH% diff --git a/examples/scripts/run-udp.sh b/examples/scripts/run-udp.sh index 5833b316..79a3be7d 100644 --- a/examples/scripts/run-udp.sh +++ b/examples/scripts/run-udp.sh @@ -3,7 +3,7 @@ echo "run-auth.sh" EXE_PATH=$1 -SRC_PATH=$2 +SRC_PATH=$2/.. echo ${EXE_PATH} ${SRC_PATH} diff --git a/servant/CMakeLists.txt b/servant/CMakeLists.txt index a2ee3d4d..755f273d 100644 --- a/servant/CMakeLists.txt +++ b/servant/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.2) project(servant) -if(_USE_OPENTRACKING) +if(TARS_OPENTRACKING) include_directories(${util_SOURCE_DIR}/include ${OPENTRACKING_INC}) else() include_directories(${util_SOURCE_DIR}/include) diff --git a/servant/libservant/AdapterProxy.cpp b/servant/libservant/AdapterProxy.cpp index 68fb9e83..13dc34dd 100755 --- a/servant/libservant/AdapterProxy.cpp +++ b/servant/libservant/AdapterProxy.cpp @@ -20,13 +20,13 @@ #include "servant/Application.h" #include "servant/AdminF.h" #include "servant/AppCache.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" #include "tup/tup.h" #include "servant/StatF.h" #include "servant/StatReport.h" #include "util/tc_http2.h" // #include "util/tc_http2clientmgr.h" -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING #include "servant/text_map_carrier.h" #endif @@ -50,11 +50,11 @@ AdapterProxy::AdapterProxy(ObjectProxy * pObjectProxy,const EndpointInfo &ep,Com , _connTimeout(false) , _connExc(false) , _connExcCnt(0) -, _staticWeight(0) +//, _staticWeight(0) , _timeoutLogFlag(false) , _noSendQueueLimit(1000) -, _maxSampleCount(1000) -, _sampleRate(0) +//, _maxSampleCount(1000) +//, _sampleRate(0) , _id((++_idGen)) { _timeoutQueue.reset(new TC_TimeoutQueueNew()); @@ -64,10 +64,10 @@ AdapterProxy::AdapterProxy(ObjectProxy * pObjectProxy,const EndpointInfo &ep,Com _noSendQueueLimit = pObjectProxy->getCommunicatorEpoll()->getNoSendQueueLimit(); } - if(_communicator) - { - _timeoutLogFlag = _communicator->getTimeoutLogFlag(); - } + // if(_communicator) + // { + // _timeoutLogFlag = pObjectProxy->getCommunicatorEpoll()->getTimeoutLogFlag(); + // } if (ep.isTcp()) { @@ -92,7 +92,6 @@ AdapterProxy::~AdapterProxy() // adapterProxy->checkActive(true); // return adapterProxy; //} - string AdapterProxy::getSlaveName(const string& sSlaveName) { string::size_type pos = sSlaveName.find("."); @@ -110,66 +109,113 @@ string AdapterProxy::getSlaveName(const string& sSlaveName) void AdapterProxy::initStatHead() { - vector v; - if(!ClientConfig::SetDivision.empty() && - StatReport::divison2SetInfo(ClientConfig::SetDivision, v)) //主调(client)启用set - { - _statHead.masterName = StatReport::trimAndLimitStr(ClientConfig::ModuleName + "." + v[0] + v[1] + v[2] + "@" + ClientConfig::TarsVersion, StatReport::MAX_MASTER_NAME_LEN); - } - else - { - _statHead.masterName = StatReport::trimAndLimitStr(ClientConfig::ModuleName + "@" + ClientConfig::TarsVersion, StatReport::MAX_MASTER_NAME_LEN); - } - - const string sSlaveName = getSlaveName(_objectProxy->name()); - string sSlaveSet = _endpoint.setDivision(); - if(!sSlaveSet.empty() && - StatReport::divison2SetInfo(sSlaveSet, v)) //被调启用set - { - _statHead.slaveSetName = v[0]; - _statHead.slaveSetArea = v[1]; - _statHead.slaveSetID = v[2]; - _statHead.slaveName = StatReport::trimAndLimitStr(sSlaveName + "." + v[0] + v[1] + v[2], StatReport::MAX_MASTER_NAME_LEN); - } - else - { - _statHead.slaveName = StatReport::trimAndLimitStr(sSlaveName, StatReport::MAX_MASTER_NAME_LEN); - } + vector v; + if(!ClientConfig::SetDivision.empty() && + StatReport::divison2SetInfo(ClientConfig::SetDivision, v)) //主调(client)启用set + { + _statHead.masterName = StatReport::trimAndLimitStr(ClientConfig::ModuleName + "." + v[0] + v[1] + v[2] + "@" + ClientConfig::TarsVersion, StatReport::MAX_MASTER_NAME_LEN); + } + else + { + _statHead.masterName = StatReport::trimAndLimitStr(ClientConfig::ModuleName + "@" + ClientConfig::TarsVersion, StatReport::MAX_MASTER_NAME_LEN); + } + + const string sSlaveName = getSlaveName(_objectProxy->name()); + string sSlaveSet = _endpoint.setDivision(); + if(!sSlaveSet.empty() && + StatReport::divison2SetInfo(sSlaveSet, v)) //被调启用set + { + _statHead.slaveSetName = v[0]; + _statHead.slaveSetArea = v[1]; + _statHead.slaveSetID = v[2]; + _statHead.slaveName = StatReport::trimAndLimitStr(sSlaveName + "." + v[0] + v[1] + v[2], StatReport::MAX_MASTER_NAME_LEN); + } + else + { + _statHead.slaveName = StatReport::trimAndLimitStr(sSlaveName, StatReport::MAX_MASTER_NAME_LEN); + } + + _statHead.slaveIp = StatReport::trimAndLimitStr(_endpoint.host(), StatReport::MAX_MASTER_IP_LEN); + _statHead.slavePort = _endpoint.port(); + _statHead.returnValue = 0; +} - _statHead.slaveIp = StatReport::trimAndLimitStr(_endpoint.host(), StatReport::MAX_MASTER_IP_LEN); - _statHead.slavePort = _endpoint.port(); - _statHead.returnValue = 0; +//bool AdapterProxy::invoke_sync(ReqMessage * msg) +//{ +// if(!_trans->hasConnected()) { +// TLOGTARS("[TARS][AdapterProxy::invoke_sync " << _objectProxy->name() << ", " << _endpoint.desc() << "]" << endl); +// return false; +// } +// +// //生成requestid +// //taf调用 而且 不是单向调用 +// if (!msg->bFromRpc) +// { +// // msg->request.iRequestId = _objectProxy->generateId(); +// msg->request.iRequestId = _timeoutQueue->generateId(); +// } +// +// msg->sReqData->setBuffer(_objectProxy->getProxyProtocol().requestFunc(msg->request, _trans)); +// +// msg->response = std::make_shared(); +// +// //这里得加锁 +// std::lock_guard lock(_mutex); +// +// _trans->sendRecv(msg); +// +// return true; +//} + +void AdapterProxy::onConnect() +{ + _objectProxy->onConnect(this); } -int AdapterProxy::invoke(ReqMessage * msg) +int AdapterProxy::invoke_connection_serial(ReqMessage * msg) { - assert(_trans != NULL); + assert(msg->eType != ReqMessage::ONE_WAY); - TLOGTARS("[TARS][AdapterProxy::invoke objname:" << _objectProxy->name() << ",desc:" << _endpoint.desc() << endl); + msg->sReqData->setBuffer(_objectProxy->getProxyProtocol().requestFunc(msg->request, _trans.get())); - //未发链表有长度限制 - if(_timeoutQueue->getSendListSize() >= _noSendQueueLimit) - { - TLOGERROR("[TARS][AdapterProxy::invoke fail,ReqInfoQueue.size > " << _noSendQueueLimit << ",objname:" << _objectProxy->name() <<",desc:"<< _endpoint.desc() << endl); - msg->eStatus = ReqMessage::REQ_EXC; + msg->request.iRequestId = _timeoutQueue->generateId(); - finishInvoke(msg); + if(!_requestMsg && _timeoutQueue->sendListEmpty() && _trans->sendRequest(msg->sReqData) != Transceiver::eRetError) + { + TLOGTARS("[TARS][AdapterProxy::invoke push (send) obj: " << _objectProxy->name() << ", desc:" << _endpoint.desc() << ", id: " << msg->request.iRequestId << endl); - return 0; - } + _requestMsg = msg; - //生成requestid - //tars调用 而且 不是单向调用 - if(!msg->bFromRpc) - { - msg->request.iRequestId = _timeoutQueue->generateId(); - } + bool bFlag = _timeoutQueue->push(msg, msg->request.iRequestId, msg->request.iTimeout + msg->iBeginTime); + if (!bFlag) + { + TLOGERROR("[TARS][AdapterProxy::invoke fail1 : insert timeout queue fail,queue size:" << _timeoutQueue->size() << ",id: " << msg->request.iRequestId << "," << _objectProxy->name() << ", " << _endpoint.desc() << "]" << endl); + msg->eStatus = ReqMessage::REQ_EXC; -#ifdef _USE_OPENTRACKING - startTrack(msg); -#endif + finishInvoke(msg); + } + } + else + { + TLOGTARS("[TARS][AdapterProxy::invoke push (no send) " << _objectProxy->name() << ", " << _endpoint.desc() << ",id " << msg->request.iRequestId << endl); + + //之前还没有数据没发送 或者 请求发送失败了, 进队列 + bool bFlag = _timeoutQueue->push(msg, msg->request.iRequestId, msg->request.iTimeout + msg->iBeginTime, false); + if (!bFlag) + { + TLOGERROR("[TARS][AdapterProxy::invoke fail2 : insert timeout queue fail,queue size:" << _timeoutQueue->size() << ", id: " << msg->request.iRequestId << ", " << _objectProxy->name() << ", " << _endpoint.desc() << "]" << endl); + msg->eStatus = ReqMessage::REQ_EXC; - msg->sReqData->setBuffer(_objectProxy->getProxyProtocol().requestFunc(msg->request, _trans.get())); + finishInvoke(msg); + } + } + + return 0; +} + +int AdapterProxy::invoke_connection_parallel(ReqMessage * msg) +{ + msg->sReqData->setBuffer(_objectProxy->getProxyProtocol().requestFunc(msg->request, _trans.get())); // TLOGERROR("[TARS][AdapterProxy::invoke insert timeout queue fail, queue size:" << _timeoutQueue->size() << ", id:" << msg->request.iRequestId << ", obj:" <<_objectProxy->name() << ", desc:" << _endpoint.desc() <eType == ReqMessage::ONE_WAY) { - #ifdef _USE_OPENTRACKING + #ifdef TARS_OPENTRACKING finishTrack(msg); #endif @@ -218,24 +264,121 @@ int AdapterProxy::invoke(ReqMessage * msg) } } -#ifdef _USE_OPENTRACKING - if(msg->eType == ReqMessage::ONE_WAY) + return 0; +} + +int AdapterProxy::invoke(ReqMessage * msg) +{ + assert(_trans != NULL); + + TLOGTARS("[TARS][AdapterProxy::invoke " << _objectProxy->name() << ", " << _endpoint.desc() << "]" << endl); + + //未发链表有长度限制 + if (_timeoutQueue->getSendListSize() >= _noSendQueueLimit) { - finishTrack(msg); + TLOGERROR("[TARS][AdapterProxy::invoke fail,ReqInfoQueue.size>" << _noSendQueueLimit << "," << _objectProxy->name() << "," << _endpoint.desc() << "]" << endl); + msg->eStatus = ReqMessage::REQ_EXC; + + finishInvoke(msg); + return 0; } -#endif - return 0; + + //生成requestid + //taf调用 而且 不是单向调用 + if (!msg->bFromRpc) + { + msg->request.iRequestId = _timeoutQueue->generateId(); + } + + if(_objectProxy->getServantProxy()->tars_connection_serial() > 0) + { + invoke_connection_serial(msg); + } + else + { + invoke_connection_parallel(msg); + } +// +// msg->sReqData->setBuffer(_objectProxy->getProxyProtocol().requestFunc(msg->request, _trans.get())); +// +// //当前队列是空的, 且是连接复用模式, 交给连接发送数据 +// //连接连上 buffer不为空 发送数据成功 +// if (_timeoutQueue->sendListEmpty() && _trans->sendRequest(msg->sReqData) != Transceiver::eRetError) +// { +// TLOGTARS("[TARS][AdapterProxy::invoke push (send) obj: " << _objectProxy->name() << ", desc:" << _endpoint.desc() << ", id: " << msg->request.iRequestId << endl); +// +// //请求发送成功了 处理采样 +// //这个请求发送成功了。单向调用直接返回 +// if (msg->eType == ReqMessage::ONE_WAY) +// { +// delete msg; +// msg = NULL; +// +// return 0; +// } +// +// bool bFlag = _timeoutQueue->push(msg, msg->request.iRequestId, msg->request.iTimeout + msg->iBeginTime); +// if (!bFlag) +// { +// TLOGERROR("[TARS][AdapterProxy::invoke fail1 : insert timeout queue fail,queue size:" << _timeoutQueue->size() << ",id: " << msg->request.iRequestId << "," << _objectProxy->name() << ", " << _endpoint.desc() << "]" << endl); +// msg->eStatus = ReqMessage::REQ_EXC; +// +// finishInvoke(msg); +// } +// } +// else +// { +// TLOGTARS("[TARS][AdapterProxy::invoke push (no send) " << _objectProxy->name() << ", " << _endpoint.desc() << ",id " << msg->request.iRequestId << endl); +// +// //之前还没有数据没发送 或者 请求发送失败了, 进队列 +// bool bFlag = _timeoutQueue->push(msg, msg->request.iRequestId, msg->request.iTimeout + msg->iBeginTime, false); +// if (!bFlag) +// { +// TLOGERROR("[TARS][AdapterProxy::invoke fail2 : insert timeout queue fail,queue size:" << _timeoutQueue->size() << ", id: " << msg->request.iRequestId << ", " << _objectProxy->name() << ", " << _endpoint.desc() << "]" << endl); +// msg->eStatus = ReqMessage::REQ_EXC; +// +// finishInvoke(msg); +// } +// } + + return 0; } -void AdapterProxy::doInvoke() +void AdapterProxy::doInvoke_serial() { - while(!_timeoutQueue->sendListEmpty()) - { - ReqMessage * msg = NULL; + assert(_requestMsg == NULL); + + if(!_timeoutQueue->sendListEmpty()) + { + ReqMessage * msg = NULL; + + _timeoutQueue->getSend(msg); + + int iRet = _trans->sendRequest(msg->sReqData); + + //发送失败 返回 + if (iRet == Transceiver::eRetError) + { + TLOGTARS("[TARS][AdapterProxy::doInvoke sendRequest failed, obj:" << _objectProxy->name() << ",desc:" << _endpoint.desc() << ",id:" << msg->request.iRequestId << ", ret:" << iRet << endl); + return; + } - _timeoutQueue->getSend(msg); + //送send 队列中清掉, 但是保留在定时队列中 + _timeoutQueue->popSend(false); - int iRet = _trans->sendRequest(msg->sReqData); + _requestMsg = msg; + } +} + +void AdapterProxy::doInvoke_parallel() +{ + while(!_timeoutQueue->sendListEmpty()) + { + ReqMessage * msg = NULL; + + _timeoutQueue->getSend(msg); + + int iRet = _trans->sendRequest(msg->sReqData); //发送失败 返回 if(iRet == Transceiver::eRetError) @@ -243,7 +386,6 @@ void AdapterProxy::doInvoke() TLOGTARS("[TARS][AdapterProxy::doInvoke sendRequest failed, obj:" << _objectProxy->name() << ",desc:" << _endpoint.desc() << ",id:" << msg->request.iRequestId << ", ret:" << iRet << endl); return; } - TLOGTARS("[TARS][AdapterProxy::doInvoke sendRequest obj:" << _objectProxy->name() << ",desc:" << _endpoint.desc() << ",id:" << msg->request.iRequestId << ",ret:" << iRet << endl); //请求发送成功了 处理采样 //... @@ -264,6 +406,20 @@ void AdapterProxy::doInvoke() } } +void AdapterProxy::doInvoke(bool initInvoke) +{ + if(_objectProxy->getServantProxy()->tars_connection_serial() > 0) + { + if(initInvoke) + { + doInvoke_serial(); + } + } + else + { + doInvoke_parallel(); + } +} void AdapterProxy::finishInvoke(bool bFail) { @@ -375,7 +531,13 @@ int AdapterProxy::getConTimeout() bool AdapterProxy::checkActive(bool bForceConnect, bool onlyCheck) { - time_t now = TNOW; + if(onlyCheck) + { + return _trans->hasConnected(); + } + else + { + time_t now = TNOW; TLOGTARS("[TARS][AdapterProxy::checkActive objname:" << _objectProxy->name() << ",desc:" << _endpoint.desc() @@ -452,10 +614,11 @@ bool AdapterProxy::checkActive(bool bForceConnect, bool onlyCheck) } } - return _trans->hasConnected(); + //已经建立连接了才返回 + return _trans->hasConnected(); + } } - void AdapterProxy::setConTimeout(bool bConTimeout) { if(bConTimeout != _connTimeout) @@ -469,24 +632,70 @@ void AdapterProxy::setConTimeout(bool bConTimeout) } } +void AdapterProxy::onSetInactive() +{ + _activeStatus = false; + + _nextRetryTime = TNOW + _objectProxy->checkTimeoutInfo().tryTimeInterval; + + //需要关闭连接 + _trans->close(); +} + //屏蔽结点 void AdapterProxy::setInactive() { - _activeStatus = false; + onSetInactive(); + + _objectProxy->getServantProxy()->onSetInactive(_endpoint); + + TLOGTARS("[TARS][AdapterProxy::setInactive, " << _objectProxy->name() << ", " << _endpoint.desc() << ", inactive]" << endl); +} + +void AdapterProxy::finishInvoke_serial(shared_ptr & rsp) +{ + TLOGTARS("[TARS][AdapterProxy::finishInvoke(ResponsePacket), " << _objectProxy->name() << ", " << _endpoint.desc() << ", id:" << rsp->iRequestId << "]" << endl); + + if (!_requestMsg) + { + if(_timeoutLogFlag) + { + TLOGERROR("[TARS][AdapterProxy::finishInvoke(ResponsePacket)," + << _objectProxy->name() + << ",get req-ptr NULL,may be timeout,id:" + << rsp->iRequestId << ",desc:" << _endpoint.desc() << "]" << endl); + } + return; + } - _nextRetryTime = TNOW + _objectProxy->checkTimeoutInfo().tryTimeInterval; + ReqMessage * msg = _requestMsg; - _trans->close(); + //这里的队列中的发送链表中的数据可能已经在timeout的时候删除了,因此可能会core,在erase中要加判断 + //获取请求信息 + bool retErase = _timeoutQueue->erase(_requestMsg->request.iRequestId, msg); - TLOGTARS("[TARS][AdapterProxy::setInactive objname:" << _objectProxy->name() << ",desc:" << _endpoint.desc() << ",inactive" << endl); + assert(retErase); + assert(_requestMsg == msg); + assert(msg->eType != ReqMessage::ONE_WAY); + assert(msg->eStatus == ReqMessage::REQ_REQ); + + _requestMsg = NULL; + + msg->eStatus = ReqMessage::REQ_RSP; + + msg->response = rsp; + + finishInvoke(msg); + + //检查连接状态 + checkActive(); } -void AdapterProxy::finishInvoke(shared_ptr & rsp) +void AdapterProxy::finishInvoke_parallel(shared_ptr & rsp) { -// TLOGTARS("[TARS][AdapterProxy::finishInvoke(ResponsePacket) obj:" << _objectProxy->name() << ", desc:" << _endpoint.desc() -// << ", id:" << rsp->iRequestId << endl); + TLOGTARS("[TARS][AdapterProxy::finishInvoke(ResponsePacket), " << _objectProxy->name() << ", " << _endpoint.desc() << ", id:" << rsp->iRequestId << "]" << endl); - ReqMessage * msg = NULL; + ReqMessage * msg = NULL; //requestid 为0 是push消息 if(rsp->iRequestId == 0) @@ -534,6 +743,70 @@ void AdapterProxy::finishInvoke(shared_ptr & rsp) finishInvoke(msg); } +void AdapterProxy::finishInvoke(shared_ptr & rsp) +{ + TLOGTARS("[TARS][AdapterProxy::finishInvoke(ResponsePacket), " << _objectProxy->name() << ", " << _endpoint.desc() << ", id:" << rsp->iRequestId << "]" << endl); + + if(_objectProxy->getServantProxy()->tars_connection_serial() > 0) + { + finishInvoke_serial(rsp); + } + else + { + finishInvoke_parallel(rsp); + } +// +// ReqMessage * msg = NULL; +// +// if (rsp->iRequestId == 0) +// { +// //requestid 为0 是push消息 +// // +// //push callback is null +// if (!_objectProxy->getPushCallback()) +// { +// TLOGERROR("[TARS][AdapterProxy::finishInvoke(ResponsePacket), request id is 0, pushcallback is null, " << _objectProxy->name() << ", " << _endpoint.desc() << "]" << endl); +// return; +// } +// msg = new ReqMessage(); +// msg->eStatus = ReqMessage::REQ_RSP; +// msg->eType = ReqMessage::ASYNC_CALL; +// msg->bFromRpc = true; +// msg->bPush = true; +// msg->proxy = _objectProxy->getServantProxy(); +// msg->pObjectProxy = _objectProxy; +// msg->adapter = this; +// msg->callback = _objectProxy->getPushCallback(); +// } +// else +// { +// //这里的队列中的发送链表中的数据可能已经在timeout的时候删除了,因此可能会core,在erase中要加判断 +// //获取请求信息 +// bool retErase = _timeoutQueue->erase(rsp->iRequestId, msg); +// +// //找不到此id信息 +// if (!retErase) +// { +// if (_timeoutLogFlag) +// { +// TLOGERROR("[TARS][AdapterProxy::finishInvoke(ResponsePacket)," +// << _objectProxy->name() +// << ",get req-ptr NULL,may be timeout,id:" +// << rsp->iRequestId << ",desc:" << _endpoint.desc() << "]" << endl); +// } +// return ; +// } +// +// assert(msg->eStatus == ReqMessage::REQ_REQ); +// +// msg->eStatus = ReqMessage::REQ_RSP; +// } +// +// msg->response = rsp; +// +// finishInvoke(msg); +} + void AdapterProxy::finishInvoke(ReqMessage * msg) { assert(msg->eStatus != ReqMessage::REQ_REQ); @@ -543,7 +816,7 @@ void AdapterProxy::finishInvoke(ReqMessage * msg) << ", status:" << msg->eStatus << ", ret: " << msg->response->iRet << endl); -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING finishTrack(msg); #endif @@ -595,16 +868,14 @@ void AdapterProxy::finishInvoke(ReqMessage * msg) ReqMessagePtr msgPtr = msg; try { - msg->callback->onDispatch(msgPtr); + msg->callback->dispatch(msgPtr); } catch (exception & e) { - //FDLOG("taferror")<<"[TAF]AdapterProxy::finishInvoke(ReqMessage) exp:"<name() << ",desc:" << _endpoint.desc() << ",id " << msg->request.iRequestId << endl); - assert(msg->eStatus == ReqMessage::REQ_REQ); +// assert(msg->eStatus == ReqMessage::REQ_REQ); + + if(msg == _requestMsg) + { + _requestMsg = NULL; + //timeout, close + _trans->close(); + } msg->eStatus = ReqMessage::REQ_TIME; @@ -677,7 +950,7 @@ void AdapterProxy::doTimeout() } -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING void AdapterProxy::startTrack(ReqMessage * msg) { if(!_communicator->_traceManager) @@ -784,7 +1057,7 @@ void AdapterProxy::stat(ReqMessage * msg) _statBody[msg->request.sFuncName] = body; } - if(LOG->isNeedLog(TarsRollLogger::INFO_LOG)) + if(LOG->isNeedLog(LocalRollLogger::INFO_LOG)) { ostringstream os; os.str(""); @@ -849,10 +1122,9 @@ void AdapterProxy::addConnExc(bool bExc) { if(!_connExc && _connExcCnt++ >= _objectProxy->checkTimeoutInfo().maxConnectExc) { - if(!_connExc) - { - TLOGERROR("[TARS][AdapterProxy::addConnExc desc:"<< _endpoint.desc() << ",connect exception status is true! (connect error)"<report("AdminServant::notify:" + command); + RemoteNotify::getInstance()->report("AdminServant::notify:" + command); return NotifyObserver::getInstance()->notify(command, current); } diff --git a/servant/libservant/AppProtocol.cpp b/servant/libservant/AppProtocol.cpp index c6096fb4..67935d00 100644 --- a/servant/libservant/AppProtocol.cpp +++ b/servant/libservant/AppProtocol.cpp @@ -19,7 +19,7 @@ #include "servant/AppProtocol.h" #include "servant/Transceiver.h" #include "servant/AdapterProxy.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" #include "tup/Tars.h" #include @@ -60,64 +60,136 @@ vector ProxyProtocol::tarsRequest(RequestPacket& request, Transceiver *) vector ProxyProtocol::http1Request(tars::RequestPacket& request, Transceiver *trans) { - request.iRequestId = trans->getAdapterProxy()->getId(); +// assert(trans->getAdapterProxy()->getObjProxy()->getServantProxy()->taf_connection_serial() > 0); - TC_HttpRequest httpRequest; +// request.iRequestId = trans->getAdapterProxy()->getId(); - httpRequest.setRequest(request.sFuncName, request.sServantName, string(request.sBuffer.data(), request.sBuffer.size()), true); + shared_ptr &data = *(shared_ptr*)request.sBuffer.data(); - vector buffer; + vector buffer; - httpRequest.encode(buffer); + data->encode(buffer); - return buffer; -} - -struct Http1Context -{ -// string buff; + data.reset(); - TC_HttpResponse httpRsp; -}; + return buffer; +} TC_NetWorkBuffer::PACKET_TYPE ProxyProtocol::http1Response(TC_NetWorkBuffer &in, ResponsePacket& rsp) { - Http1Context *context = (Http1Context*)(in.getContextData()); + shared_ptr *context = (shared_ptr*)(in.getContextData()); - if(context == NULL) + if(!context) { - context = new Http1Context(); + context = new shared_ptr(); + *context = std::make_shared(); in.setContextData(context, [=]{ delete context; }); } -// context->buff.append(in.getBuffersString()); -// in.clearBuffers(); - - if(context->httpRsp.incrementDecode(in)) + if((*context)->incrementDecode(in)) { - rsp.iRequestId = ((Transceiver*)(in.getConnection()))->getAdapterProxy()->getId(); + rsp.sBuffer.resize(sizeof(shared_ptr)); - rsp.status["status"] = context->httpRsp.getResponseHeaderLine(); - for (const auto& kv : context->httpRsp.getHeaders()) - { - rsp.status[kv.first] = kv.second; - } + shared_ptr &data = *(shared_ptr*)rsp.sBuffer.data(); - rsp.sBuffer.assign(context->httpRsp.getContent().begin(), context->httpRsp.getContent().end()); + data = *context; - delete context; + if(!data->checkHeader("Connection", "keep-alive")) + { + Transceiver* session = (Transceiver*)(in.getConnection()); - context = NULL; + session->close(); + } - in.setContextData(NULL); + (*context) = NULL; + delete context; + in.setContextData(NULL); - return TC_NetWorkBuffer::PACKET_FULL; + return TC_NetWorkBuffer::PACKET_FULL; } return TC_NetWorkBuffer::PACKET_LESS; } +///////////////////////////////////////////////////////////////////////////////////////////////// + +// vector ProxyProtocol::httpJceRequest(taf::BasePacket& request, Transceiver *trans) +// { +// TC_HttpRequest httpRequest; + +// string uri; +// if(trans->isSSL()) +// uri = "https://"; +// else +// uri = "http://"; + +// uri += trans->getEndpointInfo().getEndpoint().getHost(); + +// vector buff = tafRequest(request, trans); + +// for(auto it = request.context.begin(); it != request.context.end(); ++it) +// { +// if(it->second == ":path") +// { +// uri += "/" + it->second; +// } +// else +// { +// httpRequest.setHeader(it->first, it->second); +// } +// } + +// httpRequest.setPostRequest(uri, buff.data(), buff.size(), true); + +// vector buffer; + +// httpRequest.encode(buffer); + +// return buffer; +// } + +// TC_NetWorkBuffer::PACKET_TYPE ProxyProtocol::httpJceResponse(TC_NetWorkBuffer &in, BasePacket& rsp) +// { +// TC_HttpResponse *context = (TC_HttpResponse*)(in.getContextData()); + +// if(!context) +// { +// context = new TC_HttpResponse(); +// in.setContextData(context, [=]{ delete context; }); +// } + +// if(context->incrementDecode(in)) +// { +// if(context->getStatus() != 200) +// { +// rsp.iRet = taf::JCESERVERUNKNOWNERR; +// rsp.sResultDesc = context->getContent(); +// return TC_NetWorkBuffer::PACKET_FULL; +// } + +// JceInputStream<> is; +// is.setBuffer(context->getContent().c_str() + 4, context->getContent().size() - 4); + +// rsp.readFrom(is); + +// if(!context->checkHeader("Connection", "keep-alive")) +// { +// Transceiver* session = (Transceiver*)(in.getConnection()); + +// session->close(); +// } + +// context = NULL; +// delete context; +// in.setContextData(NULL); + +// return TC_NetWorkBuffer::PACKET_FULL; +// } + +// return TC_NetWorkBuffer::PACKET_LESS; +// } + #if TARS_HTTP2 // ENCODE function, called by network thread @@ -133,7 +205,13 @@ vector ProxyProtocol::http2Request(RequestPacket& request, Transceiver *tr session->settings(3000); } - request.iRequestId = session->submit(request.sFuncName, request.sServantName, request.context, request.sBuffer); + shared_ptr *data = (shared_ptr*)request.sBuffer.data(); + + request.iRequestId = session->submit(*(*data).get()); + + //这里把智能指针释放一次 + (*data).reset(); + if (request.iRequestId < 0) { TLOGERROR("[TARS]http2Request::Fatal submit error: " << session->getErrMsg() << endl); @@ -156,8 +234,11 @@ TC_NetWorkBuffer::PACKET_TYPE ProxyProtocol::http2Response(TC_NetWorkBuffer &in, if(flag == TC_NetWorkBuffer::PACKET_FULL) { rsp.iRequestId = out.first; - out.second->getHeaders(rsp.status); - rsp.sBuffer.assign(out.second->getContent().begin(), out.second->getContent().end()); + + rsp.sBuffer.resize(sizeof(shared_ptr)); + + //这里智能指针有一次+1, 后面要自己reset掉 + *(shared_ptr*)rsp.sBuffer.data() = out.second; } return flag; diff --git a/servant/libservant/Application.cpp b/servant/libservant/Application.cpp index 6e86a7d2..74f51287 100644 --- a/servant/libservant/Application.cpp +++ b/servant/libservant/Application.cpp @@ -16,7 +16,7 @@ #include "util/tc_option.h" #include "util/tc_common.h" -#include "servant/TarsNodeF.h" +#include "servant/KeepAliveNodeF.h" #include "servant/Application.h" #include "servant/AppProtocol.h" #include "servant/AdminServant.h" @@ -95,6 +95,7 @@ std::string ServerConfig::CA; std::string ServerConfig::Cert; std::string ServerConfig::Key; bool ServerConfig::VerifyClient = false; +std::string ServerConfig::Ciphers; #endif map ServerConfig::Context; @@ -198,7 +199,7 @@ void Application::waitForShutdown() destroyApp(); - TarsRemoteNotify::getInstance()->report("stop"); + RemoteNotify::getInstance()->report("stop"); std::this_thread::sleep_for(std::chrono::milliseconds(100)); //稍微休息一下, 让当前处理包能够回复 @@ -302,7 +303,7 @@ bool Application::cmdSetLogLevel(const string& command, const string& params, st string level = TC_Common::trim(params); - int ret = TarsRollLogger::getInstance()->logger()->setLogLevel(level); + int ret = LocalRollLogger::getInstance()->logger()->setLogLevel(level); if(ret == 0) { @@ -372,13 +373,13 @@ bool Application::cmdEnableDayLog(const string& command, const string& params, s if(vParams[0] == "local") { - TarsTimeLogger::getInstance()->enableLocal(sFile,bEnable); + RemoteTimeLogger::getInstance()->enableLocal(sFile,bEnable); return true; } if(vParams[0] == "remote") { - TarsTimeLogger::getInstance()->enableRemote(sFile,bEnable); + RemoteTimeLogger::getInstance()->enableRemote(sFile,bEnable); return true; } @@ -393,14 +394,14 @@ bool Application::cmdLoadConfig(const string& command, const string& params, str string filename = TC_Common::trim(params); - if (TarsRemoteConfig::getInstance()->addConfig(filename, result,false)) + if (RemoteConfig::getInstance()->addConfig(filename, result,false)) { - TarsRemoteNotify::getInstance()->report(result); + RemoteNotify::getInstance()->report(result); return true; } - TarsRemoteNotify::getInstance()->report(result); + RemoteNotify::getInstance()->report(result); return true; } @@ -453,6 +454,33 @@ bool Application::cmdViewVersion(const string& command, const string& params, st return true; } +bool Application::cmdViewBuildID(const string& command, const string& params, string& result) +{ + #define YEARSUF ((__DATE__ [9] - '0') * 10 + (__DATE__ [10] - '0')) + + #define MONTH (__DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 0 : 5) \ + : __DATE__ [2] == 'b' ? 1 \ + : __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 2 : 3) \ + : __DATE__ [2] == 'y' ? 4 \ + : __DATE__ [2] == 'l' ? 6 \ + : __DATE__ [2] == 'g' ? 7 \ + : __DATE__ [2] == 'p' ? 8 \ + : __DATE__ [2] == 't' ? 9 \ + : __DATE__ [2] == 'v' ? 10 : 11) + + #define DAY ((__DATE__ [4] == ' ' ? 0 : __DATE__ [4] - '0') * 10 \ + + (__DATE__ [5] - '0')) + + #define TIMEINT ((((((__TIME__[0] - '0') * 10 + (__TIME__[1] - '0')) * 10 \ + + (__TIME__[3] - '0')) * 10 + (__TIME__[4] - '0')) * 10 \ + + (__TIME__[6] - '0')) * 10 + (__TIME__[7] - '0')) + + char buildTime[50] = {0}; + sprintf(buildTime, "%d.%02d%02d.%06d", YEARSUF, MONTH + 1, DAY, TIMEINT); + result = "$" + ServerConfig::Application + "." + ServerConfig::ServerName + "-" + string(buildTime) + "$"; + return true; +} + bool Application::cmdLoadProperty(const string& command, const string& params, string& result) { try @@ -472,15 +500,15 @@ bool Application::cmdLoadProperty(const string& command, const string& params, s //加载远程对象 ServerConfig::Log = _conf.get("/tars/application/server"); - TarsTimeLogger::getInstance()->setLogInfo(_communicator, ServerConfig::Log, ServerConfig::Application, ServerConfig::ServerName, ServerConfig::LogPath,setDivision()); + RemoteTimeLogger::getInstance()->setLogInfo(_communicator, ServerConfig::Log, ServerConfig::Application, ServerConfig::ServerName, ServerConfig::LogPath,setDivision()); ServerConfig::Config = _conf.get("/tars/application/server"); - TarsRemoteConfig::getInstance()->setConfigInfo(_communicator, ServerConfig::Config, ServerConfig::Application, ServerConfig::ServerName, ServerConfig::BasePath,setDivision(), 5); + RemoteConfig::getInstance()->setConfigInfo(_communicator, ServerConfig::Config, ServerConfig::Application, ServerConfig::ServerName, ServerConfig::BasePath,setDivision(), 5); ServerConfig::Notify = _conf.get("/tars/application/server"); - TarsRemoteNotify::getInstance()->setNotifyInfo(_communicator, ServerConfig::Notify, ServerConfig::Application, ServerConfig::ServerName, ServerConfig::LocalIp, setDivision()); + RemoteNotify::getInstance()->setNotifyInfo(_communicator, ServerConfig::Notify, ServerConfig::Application, ServerConfig::ServerName, setDivision()); result = "loaded config items:\r\n" + sResult + "log=" + ServerConfig::Log + "\r\n" + @@ -591,7 +619,7 @@ bool Application::cmdViewResource(const string& command, const string& params, s ostringstream os; - os << _communicator->getResouresInfo() << endl; + os << _communicator->getResourcesInfo() << endl; os << OUT_LINE << endl; @@ -626,13 +654,13 @@ bool Application::addConfig(const string &filename) { string result; - if (TarsRemoteConfig::getInstance()->addConfig(filename, result, false)) + if (RemoteConfig::getInstance()->addConfig(filename, result, false)) { - TarsRemoteNotify::getInstance()->report(result); + RemoteNotify::getInstance()->report(result); return true; } - TarsRemoteNotify::getInstance()->report(result); + RemoteNotify::getInstance()->report(result); return true; } @@ -642,15 +670,15 @@ bool Application::addAppConfig(const string &filename) string result = ""; // true-只获取应用级别配置 - if (TarsRemoteConfig::getInstance()->addConfig(filename, result, true)) + if (RemoteConfig::getInstance()->addConfig(filename, result, true)) { - TarsRemoteNotify::getInstance()->report(result); + RemoteNotify::getInstance()->report(result); return true; } - TarsRemoteNotify::getInstance()->report(result); + RemoteNotify::getInstance()->report(result); return true; } @@ -723,7 +751,7 @@ void Application::main(const TC_Option &option) catch (exception & ex) { keepActiving.detach(); - TarsRemoteNotify::getInstance()->report("exit: " + string(ex.what())); + RemoteNotify::getInstance()->report("exit: " + string(ex.what())); std::this_thread::sleep_for(std::chrono::milliseconds(100)); //稍微休息一下, 让当前处理包能够回复 cout << "[init exception]:" << ex.what() << endl; @@ -749,6 +777,9 @@ void Application::main(const TC_Option &option) //查看编译的TARS版本 TARS_ADD_ADMIN_CMD_PREFIX(TARS_CMD_VIEW_VERSION, Application::cmdViewVersion); + //查看服务buildid(编译时间) + TARS_ADD_ADMIN_CMD_PREFIX(TARS_CMD_VIEW_BID, Application::cmdViewBuildID); + //加载配置文件中的属性信息 TARS_ADD_ADMIN_CMD_PREFIX(TARS_CMD_LOAD_PROPERTY, Application::cmdLoadProperty); @@ -777,7 +808,7 @@ void Application::main(const TC_Option &option) TARS_KEEPALIVE(""); //发送给notify表示服务启动了 - TarsRemoteNotify::getInstance()->report("restart"); + RemoteNotify::getInstance()->report("restart"); //ctrl + c能够完美结束服务 #if TARGET_PLATFORM_LINUX || TARGET_PLATFORM_IOS @@ -811,7 +842,7 @@ void Application::main(const TC_Option &option) { cout << "[main exception]:" << ex.what() << endl; - TarsRemoteNotify::getInstance()->report("exit: " + string(ex.what())); + RemoteNotify::getInstance()->report("exit: " + string(ex.what())); std::this_thread::sleep_for(std::chrono::milliseconds(100)); //稍微休息一下, 让当前处理包能够回复 @@ -819,7 +850,7 @@ void Application::main(const TC_Option &option) } //初始化完毕后, 日志再修改为异步 - TarsRollLogger::getInstance()->sync(false); + LocalRollLogger::getInstance()->sync(false); } void Application::parseConfig(const TC_Option &op) @@ -971,12 +1002,12 @@ void Application::outServer(ostream &os) os << TC_Common::outfill("BackPacketLimit(backpacketlimit)") << ServerConfig::BackPacketLimit<< endl; os << TC_Common::outfill("BackPacketMin(backpacketmin)") << ServerConfig::BackPacketMin<< endl; -#if TAF_SSL +#if TARS_SSL cout << TC_Common::outfill("Ca(ca)") << ServerConfig::CA << endl; cout << TC_Common::outfill("Cert(cert)") << ServerConfig::Cert << endl; cout << TC_Common::outfill("Key(key)") << ServerConfig::Key << endl; cout << TC_Common::outfill("VerifyClient(verifyclient)") << ServerConfig::VerifyClient << endl; -// cout << TC_Common::outfill("Ciphers(ciphers)") << ServerConfig::Ciphers << endl; + cout << TC_Common::outfill("Ciphers(ciphers)") << ServerConfig::Ciphers << endl; #endif } @@ -1056,9 +1087,10 @@ void Application::initializeServer() ServerConfig::Cert = _conf.get("/tars/application/server"); ServerConfig::Key = _conf.get("/tars/application/server"); ServerConfig::VerifyClient = _conf.get("/tars/application/server","0")=="0"?false:true; + ServerConfig::Ciphers = _conf.get("/tars/application/server"); if(!ServerConfig::Cert.empty()) { - _ctx = TC_OpenSSL::newCtx(ServerConfig::CA, ServerConfig::Cert, ServerConfig::Key, ServerConfig::VerifyClient); + _ctx = TC_OpenSSL::newCtx(ServerConfig::CA, ServerConfig::Cert, ServerConfig::Key, ServerConfig::VerifyClient, ServerConfig::Ciphers); if (!_ctx) { TLOGERROR("[TARS]load server ssl error, ca:" << ServerConfig::CA << endl); @@ -1120,11 +1152,11 @@ void Application::initializeServer() /////////////////////////////////////////////////////////////////////////////////////////////////// //初始化本地Log cout << OUT_LINE << "\n" << TC_Common::outfill("[set roll logger] ") << "OK" << endl; - TarsRollLogger::getInstance()->setLogInfo(ServerConfig::Application, ServerConfig::ServerName, ServerConfig::LogPath, ServerConfig::LogSize, ServerConfig::LogNum, _communicator, ServerConfig::Log); - _epollServer->setLocalLogger(TarsRollLogger::getInstance()->logger()); + LocalRollLogger::getInstance()->setLogInfo(ServerConfig::Application, ServerConfig::ServerName, ServerConfig::LogPath, ServerConfig::LogSize, ServerConfig::LogNum, _communicator, ServerConfig::Log); + _epollServer->setLocalLogger(LocalRollLogger::getInstance()->logger()); //初始化是日志为同步 - TarsRollLogger::getInstance()->sync(true); + LocalRollLogger::getInstance()->sync(true); //设置日志级别 string level = AppCache::getInstance()->get("logLevel"); @@ -1135,28 +1167,28 @@ void Application::initializeServer() ServerConfig::LogLevel = TC_Common::upper(level); - TarsRollLogger::getInstance()->logger()->setLogLevel(ServerConfig::LogLevel); + LocalRollLogger::getInstance()->logger()->setLogLevel(ServerConfig::LogLevel); /////////////////////////////////////////////////////////////////////////////////////////////////// //初始化到LogServer代理 cout << OUT_LINE << "\n" << TC_Common::outfill("[set time logger] ") << "OK" << endl; bool bLogStatReport = (_conf.get("/tars/application/server", "0") == "1") ? true : false; - TarsTimeLogger::getInstance()->setLogInfo(_communicator, ServerConfig::Log, ServerConfig::Application, ServerConfig::ServerName, ServerConfig::LogPath, setDivision(), bLogStatReport); + RemoteTimeLogger::getInstance()->setLogInfo(_communicator, ServerConfig::Log, ServerConfig::Application, ServerConfig::ServerName, ServerConfig::LogPath, setDivision(), bLogStatReport); /////////////////////////////////////////////////////////////////////////////////////////////////// //初始化到配置中心代理 cout << OUT_LINE << "\n" << TC_Common::outfill("[set remote config] ") << "OK" << endl; - TarsRemoteConfig::getInstance()->setConfigInfo(_communicator, ServerConfig::Config, ServerConfig::Application, ServerConfig::ServerName, ServerConfig::BasePath,setDivision()); + RemoteConfig::getInstance()->setConfigInfo(_communicator, ServerConfig::Config, ServerConfig::Application, ServerConfig::ServerName, ServerConfig::BasePath,setDivision()); /////////////////////////////////////////////////////////////////////////////////////////////////// //初始化到信息中心代理 cout << OUT_LINE << "\n" << TC_Common::outfill("[set remote notify] ") << "OK" << endl; - TarsRemoteNotify::getInstance()->setNotifyInfo(_communicator, ServerConfig::Notify, ServerConfig::Application, ServerConfig::ServerName, setDivision(), ServerConfig::LocalIp); + RemoteNotify::getInstance()->setNotifyInfo(_communicator, ServerConfig::Notify, ServerConfig::Application, ServerConfig::ServerName, setDivision()); /////////////////////////////////////////////////////////////////////////////////////////////////// //初始化到Node的代理 cout << OUT_LINE << "\n" << TC_Common::outfill("[set node proxy]") << "OK" << endl; - TarsNodeFHelper::getInstance()->setNodeInfo(_communicator, ServerConfig::Node, ServerConfig::Application, ServerConfig::ServerName); + KeepAliveNodeFHelper::getInstance()->setNodeInfo(_communicator, ServerConfig::Node, ServerConfig::Application, ServerConfig::ServerName); /////////////////////////////////////////////////////////////////////////////////////////////////// //初始化管理对象 @@ -1227,8 +1259,9 @@ void Application::setAdapter(TC_EpollServer::BindAdapterPtr& adapter, const stri string key = _conf.get("/tars/application/server/" + name + ""); bool verifyClient = _conf.get("/tars/application/server/" + name + "", "0") == "0" ? false : true; + string ciphers = _conf.get("/tars/application/server/" + name + ""); - shared_ptr ctx = TC_OpenSSL::newCtx(ca, cert, key, verifyClient); + shared_ptr ctx = TC_OpenSSL::newCtx(ca, cert, key, verifyClient, ciphers); if (!ctx) { TLOGERROR("[TARS]load server ssl error, cert:" << cert << endl); @@ -1340,7 +1373,7 @@ void Application::checkServantNameValid(const string& servant, const string& sPr os << "Servant '" << servant << "' error: must be start with '" << sPrefix << "'"; - TarsRemoteNotify::getInstance()->report("exit:" + os.str()); + RemoteNotify::getInstance()->report("exit:" + os.str()); std::this_thread::sleep_for(std::chrono::milliseconds(100)); //稍微休息一下, 让当前处理包能够回复 diff --git a/servant/libservant/AsyncProcThread.cpp b/servant/libservant/AsyncProcThread.cpp index f0e9d1a9..8890c080 100644 --- a/servant/libservant/AsyncProcThread.cpp +++ b/servant/libservant/AsyncProcThread.cpp @@ -17,7 +17,7 @@ #include "servant/AsyncProcThread.h" #include "servant/Communicator.h" #include "servant/StatReport.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" namespace tars { @@ -119,7 +119,7 @@ void AsyncProcThread::callback(ReqMessage * msg) try { ReqMessagePtr msgPtr = msg; - msg->callback->onDispatch(msgPtr); + msg->callback->dispatch(msgPtr); } catch (exception& e) { diff --git a/servant/libservant/CMakeLists.txt b/servant/libservant/CMakeLists.txt index 1048675a..3ab667fb 100755 --- a/servant/libservant/CMakeLists.txt +++ b/servant/libservant/CMakeLists.txt @@ -1,4 +1,4 @@ -if(_USE_OPENTRACKING) +if(TARS_OPENTRACKING) include_directories(${PROJECT_SOURCE_DIR} ${OPENTRACKING_INC}) else() include_directories(${PROJECT_SOURCE_DIR}) diff --git a/servant/libservant/Communicator.cpp b/servant/libservant/Communicator.cpp index 23b94d09..e54cde3a 100644 --- a/servant/libservant/Communicator.cpp +++ b/servant/libservant/Communicator.cpp @@ -18,7 +18,7 @@ #include "servant/Communicator.h" #include "servant/Application.h" #include "servant/StatReport.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" namespace tars { @@ -46,7 +46,7 @@ Communicator::Communicator() , _statReport(NULL) , _timeoutLogFlag(true) , _minTimeout(100) -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING , _traceManager(NULL) #endif { @@ -61,7 +61,7 @@ Communicator::Communicator(TC_Config& conf, const string& domain/* = CONFIG_ROOT : _initialized(false) , _terminating(false) , _timeoutLogFlag(true) -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING , _traceManager(NULL) #endif { @@ -120,6 +120,13 @@ string Communicator::getServantProperty(const string &sObj, const string& name) return ""; } +void Communicator::setServantCustomCallback(const string &sObj, Communicator::custom_callback callback) +{ + TC_LockT lock(_callbackLock); + + _callback[sObj] = callback; +} + #if TARS_SSL shared_ptr Communicator::newClientSSL(const string & objName) { @@ -131,6 +138,10 @@ shared_ptr Communicator::newClientSSL(const string & objName) return TC_OpenSSL::newSSL(it->second); } + if(!_ctx) { + _ctx = TC_OpenSSL::newCtx("", "", "", false, ""); + } + return TC_OpenSSL::newSSL(_ctx); } @@ -161,11 +172,13 @@ void Communicator::setProperty(TC_Config& conf, const string& domain/* = CONFIG_ data["ca"] = conf.get("/tars/application/client/" + auths[i] + ""); data["cert"] = conf.get("/tars/application/client/" + auths[i] + ""); data["key"] = conf.get("/tars/application/client/" + auths[i] + ""); + data["ciphers"] = conf.get("/tars/application/client/" + auths[i] + ""); + #if TARS_SSL if(!data["ca"].empty()) { - shared_ptr ctx = TC_OpenSSL::newCtx( data["ca"], data["cert"], data["key"], false); + shared_ptr ctx = TC_OpenSSL::newCtx( data["ca"], data["cert"], data["key"], false, data["ciphers"]); if(!ctx) { TLOGERROR("[TARS]load obj:" << auths[i] << ", ssl error, ca:" << data["ca"] << endl); @@ -244,9 +257,10 @@ void Communicator::initialize() string ca = getProperty("ca"); string cert = getProperty("cert"); string key = getProperty("key"); + string ciphers = getProperty("ciphers"); if(!ca.empty()) { - _ctx = TC_OpenSSL::newCtx(ca, cert, key, false); + _ctx = TC_OpenSSL::newCtx(ca, cert, key, false, ciphers); if(!_ctx) { @@ -317,9 +331,9 @@ void Communicator::initialize() int iReportTimeout = TC_Common::strto(getProperty("report-timeout", "5000")); - int iSampleRate = TC_Common::strto(getProperty("sample-rate", "1000")); + // int iSampleRate = TC_Common::strto(getProperty("sample-rate", "1000")); - int iMaxSampleCount = TC_Common::strto(getProperty("max-sample-count", "100")); + // int iMaxSampleCount = TC_Common::strto(getProperty("max-sample-count", "100")); int iMaxReportSize = TC_Common::strto(getProperty("max-report-size", "1400")); @@ -343,9 +357,9 @@ void Communicator::initialize() } string sSetDivision = ClientConfig::SetOpen?ClientConfig::SetDivision:""; - _statReport->setReportInfo(statPrx, propertyPrx, ClientConfig::ModuleName, ClientConfig::LocalIp, sSetDivision, iReportInterval, iSampleRate, iMaxSampleCount, iMaxReportSize, iReportTimeout); + _statReport->setReportInfo(statPrx, propertyPrx, ClientConfig::ModuleName, ClientConfig::LocalIp, sSetDivision, iReportInterval, 0, 0, iMaxReportSize, iReportTimeout); -#if _USE_OPENTRACKING +#if TARS_OPENTRACKING string collector_host = getProperty("collector_host", ""); string collector_port = getProperty("collector_port", ""); if(!collector_host.empty() && !collector_port.empty()) @@ -412,9 +426,9 @@ int Communicator::reloadProperty(string & sResult) int iReportTimeout = TC_Common::strto(getProperty("report-timeout", "5000")); - int iSampleRate = TC_Common::strto(getProperty("sample-rate", "1000")); + // int iSampleRate = TC_Common::strto(getProperty("sample-rate", "1000")); - int iMaxSampleCount = TC_Common::strto(getProperty("max-sample-count", "100")); + // int iMaxSampleCount = TC_Common::strto(getProperty("max-sample-count", "100")); int iMaxReportSize = TC_Common::strto(getProperty("max-report-size", "1400")); @@ -437,15 +451,15 @@ int Communicator::reloadProperty(string & sResult) } string sSetDivision = ClientConfig::SetOpen?ClientConfig::SetDivision:""; - _statReport->setReportInfo(statPrx, propertyPrx, ClientConfig::ModuleName, ClientConfig::LocalIp, sSetDivision, iReportInterval, iSampleRate, iMaxSampleCount, iMaxReportSize, iReportTimeout); + _statReport->setReportInfo(statPrx, propertyPrx, ClientConfig::ModuleName, ClientConfig::LocalIp, sSetDivision, iReportInterval, 0, 0, iMaxReportSize, iReportTimeout); sResult = "locator=" + getProperty("locator", "") + "\r\n" + "stat=" + statObj + "\r\n" + "property=" + propertyObj + "\r\n" + "SetDivision=" + sSetDivision + "\r\n" + "report-interval=" + TC_Common::tostr(iReportInterval) + "\r\n" + - "report-timeout=" + TC_Common::tostr(iReportTimeout) + "\r\n" + - "sample-rate=" + TC_Common::tostr(iSampleRate) + "\r\n" + - "max-sample-count=" + TC_Common::tostr(iMaxSampleCount) + "\r\n"; + "report-timeout=" + TC_Common::tostr(iReportTimeout) + "\r\n"; + // "sample-rate=" + TC_Common::tostr(iSampleRate) + "\r\n" + + // "max-sample-count=" + TC_Common::tostr(iMaxSampleCount) + "\r\n"; return 0; } @@ -462,13 +476,13 @@ vector Communicator::getEndpoint4All(const string & objName) return pServantProxy->getEndpoint4All(); } -string Communicator::getResouresInfo() +string Communicator::getResourcesInfo() { ostringstream os; for (size_t i = 0; i < _clientThreadNum; ++i) { os << OUT_LINE << endl; - os << _communicatorEpoll[i]->getResouresInfo(); + os << _communicatorEpoll[i]->getResourcesInfo(); } return os.str(); } @@ -542,8 +556,19 @@ void Communicator::terminate() void Communicator::pushAsyncThreadQueue(ReqMessage * msg) { - //先不考虑每个线程队列数目不一致的情况 - _asyncThread[(_asyncSeq++)%_asyncThreadNum]->push_back(msg); + { + TC_LockT lock(_callbackLock); + + auto it = _callback.find(msg->request.sServantName); + if (it != _callback.end()) { + ReqMessagePtr msgPtr = msg; + it->second(msgPtr); + return; + } + } + + //先不考虑每个线程队列数目不一致的情况 + _asyncThread[(_asyncSeq++) % _asyncThreadNum]->push_back(msg); } void Communicator::doStat() diff --git a/servant/libservant/CommunicatorEpoll.cpp b/servant/libservant/CommunicatorEpoll.cpp index 436a5760..954ea5a9 100755 --- a/servant/libservant/CommunicatorEpoll.cpp +++ b/servant/libservant/CommunicatorEpoll.cpp @@ -17,7 +17,7 @@ #include "servant/CommunicatorEpoll.h" #include "servant/Communicator.h" #include "servant/Application.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" #include "servant/StatReport.h" using namespace std; @@ -388,7 +388,7 @@ void CommunicatorEpoll::reConnect(int64_t ms, Transceiver*p) _reconnect[ms] = p; } -string CommunicatorEpoll::getResouresInfo() +string CommunicatorEpoll::getResourcesInfo() { ostringstream desc; desc << TC_Common::outfill("index") << _netThreadSeq << endl; diff --git a/servant/libservant/CoroutineScheduler.cpp b/servant/libservant/CoroutineScheduler.cpp index 633d90c2..8091fbf5 100644 --- a/servant/libservant/CoroutineScheduler.cpp +++ b/servant/libservant/CoroutineScheduler.cpp @@ -33,7 +33,7 @@ #include #include "util/tc_timeprovider.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" #include "servant/ServantHandle.h" namespace tars diff --git a/servant/libservant/EndpointInfo.cpp b/servant/libservant/EndpointInfo.cpp index 2d48fff2..d851d830 100755 --- a/servant/libservant/EndpointInfo.cpp +++ b/servant/libservant/EndpointInfo.cpp @@ -15,7 +15,7 @@ */ #include "servant/EndpointInfo.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" #include "servant/NetworkUtil.h" #include "util/tc_socket.h" diff --git a/servant/libservant/EndpointManager.cpp b/servant/libservant/EndpointManager.cpp index 7a74694d..2dbbb9e8 100644 --- a/servant/libservant/EndpointManager.cpp +++ b/servant/libservant/EndpointManager.cpp @@ -16,7 +16,7 @@ #include "util/tc_port.h" #include "servant/EndpointManager.h" #include "servant/ObjectProxy.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" #include "servant/AppCache.h" #include "servant/Application.h" #include "servant/StatReport.h" @@ -34,6 +34,7 @@ QueryEpBase::QueryEpBase(Communicator * pComm, bool bFirstNetThread,bool bInterf , _locator("") , _valid(false) , _weightType(E_LOOP) +, _rootServant(true) , _requestRegistry(false) , _requestTimeout(0) , _timeoutInterval(5*1000) @@ -158,12 +159,19 @@ void QueryEpBase::setObjName(const string & sObjName) if (pos != string::npos) { //[直接连接]指定服务的IP和端口列表 - _objName = sObjName.substr(0,pos); sEndpoints = sObjName.substr(pos + 1); - _direct = true; + pos = _objName.find_first_of("#"); + + if(pos != string::npos) + { + _rootServant = false; + _objName = _objName.substr(0, pos); + } + + _direct = true; _valid = true; } @@ -182,6 +190,13 @@ void QueryEpBase::setObjName(const string & sObjName) throw TarsRegistryException("locator is not valid,_locator:" + _locator); } + pos = _objName.find_first_of("#"); + if(pos != string::npos) + { + _objName = _objName.substr(0, pos); + } + + _queryFPrx = _communicator->stringToProxy(_locator); string sLocatorKey = _locator; @@ -378,6 +393,9 @@ void QueryEpBase::refreshReg(GetEndpointType type, const string & sName) //内部请求主控都是异步请求 //接口请求主控第一次是同步请求 bool bSync = (!_valid && _interfaceReq); + //如果是异步且不是根servant(通过#1创建的servant, 不主动更新主控信息) + if(!bSync && !_rootServant) + return; try { if(bSync) @@ -704,7 +722,7 @@ EndpointManager::~EndpointManager() } } -void EndpointManager::notifyEndpoints(const set & active, const set & inactive, bool bSync) +void EndpointManager::updateEndpoints(const set & active, const set & inactive) { set::const_iterator iter; map::iterator iterAdapter; @@ -788,6 +806,13 @@ void EndpointManager::notifyEndpoints(const set & active, const se _update = true; } +void EndpointManager::notifyEndpoints(const set & active,const set & inactive,bool bNotify) +{ + updateEndpoints(active, inactive); + + _objectProxy->onNotifyEndpoints(active, inactive); +} + void EndpointManager::doNotify() { _objectProxy->doInvoke(); diff --git a/servant/libservant/NetworkUtil.cpp b/servant/libservant/NetworkUtil.cpp index 67ab7418..812b2662 100644 --- a/servant/libservant/NetworkUtil.cpp +++ b/servant/libservant/NetworkUtil.cpp @@ -42,6 +42,7 @@ int NetworkUtil::createSocket(bool udp, bool isLocal, bool isIpv6) { s.setTcpNoDelay(); s.setKeepAlive(); + s.setNoCloseWait(); } else { @@ -58,25 +59,6 @@ void NetworkUtil::closeSocketNoThrow(int fd) TC_Port::closeSocket(fd); } -//bool NetworkUtil::doConnect(int fd, const struct sockaddr& addr) -//{ -// bool bConnected = false; -// -// int iRet = ::connect(fd, (struct sockaddr*)(&addr), int(sizeof(addr))); -// -// if (iRet == 0) -// { -// bConnected = true; -// } -// else if (!TC_Socket::isInProgress()) -// { -// closeSocketNoThrow(fd); -// TARS_THROW_EXCEPTION_SYSCODE(TafNetConnectException, "NetworkUtil::doConnect error"); -// } -// -// return bConnected; -//} - bool NetworkUtil::doConnect(int fd, const struct sockaddr *addr, socklen_t len) { bool bConnected = false; @@ -90,7 +72,7 @@ bool NetworkUtil::doConnect(int fd, const struct sockaddr *addr, socklen_t len) else if (!TC_Socket::isInProgress()) { closeSocketNoThrow(fd); - TARS_THROW_EXCEPTION_SYSCODE(TarsNetConnectException, "NetworkUtil::doConnect error"); + THROW_EXCEPTION_SYSCODE(TarsNetConnectException, "NetworkUtil::doConnect error"); } return bConnected; diff --git a/servant/libservant/ObjectProxy.cpp b/servant/libservant/ObjectProxy.cpp index 691e8d3d..7e40d137 100755 --- a/servant/libservant/ObjectProxy.cpp +++ b/servant/libservant/ObjectProxy.cpp @@ -21,7 +21,7 @@ #include "servant/AppCache.h" #include "util/tc_common.h" #include "util/tc_clientsocket.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" namespace tars { @@ -39,7 +39,8 @@ ObjectProxy::ObjectProxy(CommunicatorEpoll * pCommunicatorEpoll, const string & if(pos != string::npos) { - _name = sObjectProxyName.substr(0,pos); + _name = sObjectProxyName.substr(0,pos); + _address = sObjectProxyName.substr(pos+1); } else { @@ -53,9 +54,18 @@ ObjectProxy::ObjectProxy(CommunicatorEpoll * pCommunicatorEpoll, const string & } } - _proxyProtocol.requestFunc = ProxyProtocol::tarsRequest; + pos = _name.find_first_of('#'); + + if(pos != string::npos) + { + _hash = _name.substr(pos+1); + _name = _name.substr(0,pos); + } + + _proxyProtocol.requestFunc = ProxyProtocol::tarsRequest; _proxyProtocol.responseFunc = ProxyProtocol::tarsResponse; + _endpointManger.reset(new EndpointManager(this, _communicatorEpoll->getCommunicator(), sObjectProxyName, pCommunicatorEpoll->isFirstNetThread(), setName)); } @@ -107,12 +117,6 @@ ServantProxyCallbackPtr ObjectProxy::getPushCallback() return _pushCallback; } -// -//const string& ObjectProxy::name() const -//{ -// return _name; -//} - void ObjectProxy::setProxyProtocol(const ProxyProtocol& protocol) { if(_hasSetProtocol) @@ -149,7 +153,7 @@ vector& ObjectProxy::getSocketOpt() // //bool ObjectProxy::invoke_sync(ReqMessage * msg) //{ -// TLOGTAF("[TAF][ObjectProxy::invoke_sync, " << _name << ", begin]" << endl); +// TLOGTARS("[TARS][ObjectProxy::invoke_sync, " << _name << ", begin]" << endl); // // //选择一个远程服务的Adapter来调用 // AdapterProxy * pAdapterProxy = NULL; @@ -198,42 +202,106 @@ void ObjectProxy::invoke(ReqMessage * msg) } msg->adapter = pAdapterProxy; - pAdapterProxy->invoke(msg); -} -void ObjectProxy::doInvoke() -{ - TLOGTARS("[TARS][ObjectProxy::doInvoke, objname:" << _name << ", begin...]" << endl); - - while(!_reqTimeoutQueue.empty()) + //连接还没有建立, 暂时先放队列里面 + if(!msg->adapter->getTransceiver()->hasConnected()) { - TLOGTARS("[TARS][ObjectProxy::doInvoke, objname:" << _name << ", pop...]" << endl); + bool bRet = _reqTimeoutQueue.push(msg,msg->request.iTimeout+msg->iBeginTime); - ReqMessage * msg = NULL; - _reqTimeoutQueue.pop(msg); + assert(bRet); - assert(msg != NULL); + //把数据缓存在obj里面 + TLOGTARS("[TARS][ObjectProxy::invoke, " << _name << ", select adapter proxy not connected (have not inovoke reg)]" << endl); + return; + } - //选择一个远程服务的Adapter来调用 - AdapterProxy * pAdapterProxy = NULL; - _endpointManger->selectAdapterProxy(msg,pAdapterProxy, false); + pAdapterProxy->invoke(msg); +} - if(!pAdapterProxy) - { - //这里肯定是请求过主控 - TLOGERROR("[TARS][ObjectProxy::doInvoke, objname:" << _name << ", selectAdapterProxy is null]" << endl); - msg->response->iRet = TARSADAPTERNULL; +void ObjectProxy::onConnect(AdapterProxy *adapterProxy) +{ + while(!_reqTimeoutQueue.empty()) + { + TLOGTARS("[TARS][ObjectProxy::doInvoke, " << _name << ", pop...]" << endl); + + ReqMessage * msg = NULL; + _reqTimeoutQueue.pop(msg); + + assert(msg != NULL); + + if(msg->adapter != NULL && msg->adapter != adapterProxy) + { + //选择一个远程服务的Adapter来调用 + _endpointManger->selectAdapterProxy(msg, adapterProxy, false); + + if (!adapterProxy) + { + //这里肯定是请求过主控 + TLOGERROR("[TARS][ObjectProxy::doInvoke, " << _name << ", selectAdapterProxy is null]" << endl); + msg->response->iRet = TARSADAPTERNULL; + doInvokeException(msg); + return; + } + + msg->adapter = adapterProxy; + } + else + { + msg->adapter = adapterProxy; + } + + adapterProxy->invoke(msg); + } +} - doInvokeException(msg); +void ObjectProxy::onNotifyEndpoints(const set & active,const set & inactive) +{ + if(_servantProxy) { + _servantProxy->onNotifyEndpoints(active, inactive); + } +} - return; - } +void ObjectProxy::doInvoke() +{ + TLOGTARS("[TARS][ObjectProxy::doInvoke, objname:" << _name << ", begin...]" << endl); - msg->adapter = pAdapterProxy; + for(auto it = _reqTimeoutQueue.begin(); it != _reqTimeoutQueue.end(); ++it) + { + ReqMessage * msg = (*it).ptr; - pAdapterProxy->invoke(msg); - } + AdapterProxy* adapterProxy; + + //选择一个远程服务的Adapter来调用, selectAdapterProxy会发起连接 + _endpointManger->selectAdapterProxy(msg, adapterProxy, false); + } +// +// while(!_reqTimeoutQueue.empty()) +// { +// TLOGTARS("[TARS][ObjectProxy::doInvoke, " << _name << ", pop...]" << endl); +// +// ReqMessage * msg = NULL; +// _reqTimeoutQueue.pop(msg); +// +// assert(msg != NULL); +// +// AdapterProxy* adapterProxy; +// +// //选择一个远程服务的Adapter来调用 +// _endpointManger->selectAdapterProxy(msg, adapterProxy, false); +// +// if (!adapterProxy) { +// //这里肯定是请求过主控 +// TLOGERROR("[TARS][ObjectProxy::doInvoke, " << _name << ", selectAdapterProxy is null]" << endl); +// msg->response->iRet = JCEADAPTERNULL; +// doInvokeException(msg); +// return; +// } +// +// msg->adapter = adapterProxy; +// +// adapterProxy->invoke(msg); +// } } void ObjectProxy::doInvokeException(ReqMessage * msg) @@ -280,7 +348,7 @@ void ObjectProxy::doInvokeException(ReqMessage * msg) //比如获取endpoint try { - msg->callback->onDispatch(msgPtr); + msg->callback->dispatch(msgPtr); } catch(exception & e) { @@ -346,5 +414,16 @@ void ObjectProxy::mergeStat(map & mStatMicMsg) } } +void ObjectProxy::onSetInactive(const EndpointInfo& ep) +{ + const vector & vAdapterProxy = _endpointManger->getAdapters(); + for(size_t iAdapter=0; iAdapter< vAdapterProxy.size();++iAdapter) + { + if(vAdapterProxy[iAdapter]->endpoint() == ep) + { + vAdapterProxy[iAdapter]->onSetInactive(); + } + } +} //////////////////////////////////////////////////////////////////////////////////////////////// } diff --git a/servant/libservant/Servant.cpp b/servant/libservant/Servant.cpp index ef986b77..8272beaa 100644 --- a/servant/libservant/Servant.cpp +++ b/servant/libservant/Servant.cpp @@ -18,7 +18,7 @@ #include "servant/BaseF.h" #include "servant/Application.h" #include "servant/AppCache.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" #include diff --git a/servant/libservant/ServantHandle.cpp b/servant/libservant/ServantHandle.cpp index e2503abe..b4ef2667 100644 --- a/servant/libservant/ServantHandle.cpp +++ b/servant/libservant/ServantHandle.cpp @@ -21,9 +21,9 @@ #include "servant/ServantHelper.h" #include "servant/AppProtocol.h" #include "servant/BaseF.h" -#include "servant/TarsNodeF.h" -#include "servant/TarsCookie.h" -#ifdef _USE_OPENTRACKING +#include "servant/KeepAliveNodeF.h" +#include "servant/Cookie.h" +#ifdef TARS_OPENTRACKING #include "servant/text_map_carrier.h" #endif @@ -352,7 +352,7 @@ void ServantHandle::initialize() TLOGERROR("[TARS]ServantHandle initialize createServant ret null, for adapter `" +_bindAdapter->getName() + "`" << endl); cerr << "[TARS]ServantHandle initialize createServant ret null, for adapter `" +_bindAdapter->getName() + "`" << endl; - TarsRemoteNotify::getInstance()->report("initialize createServant error: no adapter:" + _bindAdapter->getName()); + RemoteNotify::getInstance()->report("initialize createServant error: no adapter:" + _bindAdapter->getName()); TC_Common::msleep(100); @@ -365,7 +365,7 @@ void ServantHandle::initialize() { TLOGERROR("[TARS]initialize error: no servant exists." << endl); - TarsRemoteNotify::getInstance()->report("initialize error: no servant exists."); + RemoteNotify::getInstance()->report("initialize error: no servant exists."); TC_Common::msleep(100); @@ -386,7 +386,7 @@ void ServantHandle::initialize() { TLOGERROR("[TARS]initialize error:" << ex.what() << endl); - TarsRemoteNotify::getInstance()->report("initialize error:" + string(ex.what())); + RemoteNotify::getInstance()->report("initialize error:" + string(ex.what())); TC_Common::msleep(100); @@ -396,7 +396,7 @@ void ServantHandle::initialize() { TLOGERROR("[TARS]initialize unknown exception error" << endl); - TarsRemoteNotify::getInstance()->report("initialize unknown exception error"); + RemoteNotify::getInstance()->report("initialize unknown exception error"); TC_Common::msleep(100); @@ -434,7 +434,7 @@ void ServantHandle::heartbeat() TarsCurrentPtr ServantHandle::createCurrent(const shared_ptr &data) { - TarsCurrentPtr current = new TarsCurrent(this); + TarsCurrentPtr current = new Current(this); try { @@ -478,7 +478,7 @@ TarsCurrentPtr ServantHandle::createCurrent(const shared_ptr &data) { - TarsCurrentPtr current = new TarsCurrent(this); + TarsCurrentPtr current = new Current(this); current->initializeClose(data); current->setReportStat(false); @@ -580,7 +580,7 @@ void ServantHandle::handle(const shared_ptr &data) } -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING void ServantHandle::processTracking(const TarsCurrentPtr ¤t) { if(!(Application::getCommunicator()->_traceManager)) @@ -686,21 +686,7 @@ bool ServantHandle::processDye(const TarsCurrentPtr ¤t, string& dyeingKey) return true; } -// //servant已经被染色, 开启染色日志 -// if (ServantHelperManager::getInstance()->isDyeing()) -// { -// map::const_iterator dyeingKeyIt = current->getRequestStatus().find(ServantProxy::STATUS_GRID_KEY); -// -// if (dyeingKeyIt != current->getRequestStatus().end() && -// ServantHelperManager::getInstance()->isDyeingReq(dyeingKeyIt->second, current->getServantName(), current->getFuncName())) -// { -// TLOGTARS("[TARS] dyeing servant got a dyeing req, key:" << dyeingKeyIt->second << endl); -// -// dyeingKey = dyeingKeyIt->second; -// -// return true; -// } -// } + return false; } @@ -845,14 +831,14 @@ void ServantHandle::handleTarsProtocol(const TarsCurrentPtr ¤t) //处理cookie map cookie; - TarsCookieOp cookieOp; + CookieOp cookieOp; if (processCookie(current, cookie)) { cookieOp.setCookie(cookie); current->setCookie(cookie); } -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING //处理tracking信息 processTracking(current); #endif @@ -861,7 +847,7 @@ void ServantHandle::handleTarsProtocol(const TarsCurrentPtr ¤t) if (sit == _servants.end()) { current->sendResponse(TARSSERVERNOSERVANTERR); -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING finishTracking(TARSSERVERNOSERVANTERR, current); #endif return; @@ -913,9 +899,9 @@ void ServantHandle::handleTarsProtocol(const TarsCurrentPtr ¤t) //单向调用或者业务不需要同步返回 if (current->isResponse()) { - current->sendResponse(ret, buffer, TarsCurrent::TARS_STATUS(), sResultDesc); + current->sendResponse(ret, buffer, Current::TARS_STATUS(), sResultDesc); } -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING finishTracking(ret, current); #endif } @@ -947,7 +933,7 @@ void ServantHandle::handleNoTarsProtocol(const TarsCurrentPtr ¤t) TLOGERROR("[TARS]ServantHandle::handleNoTarsProtocol unknown error" << endl); } - if (current->isResponse()) + if (current->isResponse() && !buffer.empty()) { current->sendResponse((const char*)buffer.data(), buffer.size()); } diff --git a/servant/libservant/ServantProxy.cpp b/servant/libservant/ServantProxy.cpp index fe9cff9d..86d802bd 100644 --- a/servant/libservant/ServantProxy.cpp +++ b/servant/libservant/ServantProxy.cpp @@ -19,7 +19,7 @@ #include "servant/StatReport.h" #include "servant/Application.h" #include "servant/BaseF.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" #include "servant/Message.h" #include "servant/EndpointManager.h" @@ -49,7 +49,7 @@ SeqManager::SeqManager(uint16_t iNum) for(uint16_t i=0;i<(uint16_t)iNum;i++) { _p[i].free = true; - _p[i].next = i+1; + _p[i].next = i + 1; } _p[iNum-1].next = MAX_UNSIGN_SHORT; _num = iNum; @@ -155,12 +155,20 @@ ServantProxyThreadData * ServantProxyThreadData::getData() return g_sp.get(); } -/////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////// + ServantProxyCallback::ServantProxyCallback() : _bNetThreadProcess(false) { } +int ServantProxyCallback::dispatch(ReqMessagePtr msg) +{ + return onDispatch(msg); +} + +/////////////////////////////////////////////////////////////////////////////////////////// + int HttpServantProxyCallback::onDispatch(ReqMessagePtr msg) { if (msg->response->iRet != TARSSERVERSUCCESS) @@ -178,12 +186,23 @@ HttpServantProxyCallback::HttpServantProxyCallback(const HttpCallbackPtr& cb) : int HttpServantProxyCallback::onDispatchException(const RequestPacket &request, const ResponsePacket &response) { - return _httpCb->onHttpResponseException(request.context, response.iRet); + if(_httpCb) + return _httpCb->onHttpResponseException(response.iRet); + + return 0; } int HttpServantProxyCallback::onDispatchResponse(const RequestPacket &request, const ResponsePacket &response) { - return _httpCb->onHttpResponse(request.context, response.status, response.sBuffer); + assert(response.sBuffer.size() == sizeof(shared_ptr)); + + shared_ptr rsp = *(shared_ptr*)(response.sBuffer.data()); + + + if(_httpCb) + return _httpCb->onHttpResponse(rsp); + + return 0; } /////////////////////////////////////////////////////////////// @@ -212,7 +231,7 @@ void coroWhenAll(const CoroParallelBasePtr &ptr) for(size_t i = 0; i < vMsg.size(); ++i) { ReqMessagePtr msgPtr = vMsg[i]; - vMsg[i]->callback->onDispatch(msgPtr); + vMsg[i]->callback->dispatch(msgPtr); } } @@ -233,7 +252,7 @@ string ServantProxy::STATUS_SETNAME_VALUE = "STATUS_SETNAME_VALUE"; string ServantProxy::STATUS_TRACK_KEY = "STATUS_TRACK_KEY"; -string ServantProxy::STATUS_COOKIE = "STATUS_COOKIE"; +// string ServantProxy::STATUS_COOKIE = "STATUS_COOKIE"; //////////////////////////////////// @@ -291,6 +310,16 @@ string ServantProxy::tars_name() const return "NULL"; } +string ServantProxy::tars_full_name() const +{ + if (_objectProxyNum >= 1 && (*_objectProxy != NULL)) + { + return (*_objectProxy)->name() +"#" + (*_objectProxy)->hash() + "@" + (*_objectProxy)->address(); + } + return "NULL"; +} + + void ServantProxy::tars_reconnect(int second) { if (_objectProxyNum >= 1 && (*_objectProxy != NULL)) @@ -356,17 +385,68 @@ int ServantProxy::tars_async_timeout() const return _asyncTimeout; } +void ServantProxy::tars_connection_serial(int connectionSerial) +{ + assert(!_rootPrx); + _connectionSerial = connectionSerial; +} + +int ServantProxy::tars_connection_serial() const +{ + if(_rootPrx) { + return _rootPrx->tars_connection_serial(); + } + + return _connectionSerial; +} -void ServantProxy::tars_set_protocol(const ProxyProtocol& protocol) +void ServantProxy::tars_set_protocol(SERVANT_PROTOCOL protocol, int connectionSerial) +{ + ProxyProtocol proto; + + switch(protocol) + { + case PROTOCOL_HTTP1: + proto.requestFunc = ProxyProtocol::http1Request; + proto.responseFunc = ProxyProtocol::http1Response; + + if(connectionSerial <= 0) + connectionSerial = DEFAULT_CONNECTION_SERIAL; + break; +#if TARS_HTTP2 + case PROTOCOL_HTTP2: + proto.requestFunc = ProxyProtocol::http2Request; + proto.responseFunc = ProxyProtocol::http2Response; + connectionSerial = 0; + break; +#endif + case PROTOCOL_TARS: + default: + proto.requestFunc = ProxyProtocol::tarsRequest; + proto.responseFunc = ProxyProtocol::tarsResponse; + break; + } + tars_set_protocol(proto, connectionSerial); +} + +void ServantProxy::tars_set_protocol(const ProxyProtocol& protocol, int connectionSerial) { TC_LockT lock(*this); - for(size_t i = 0;i < _objectProxyNum; ++i) + for (size_t i = 0; i < _objectProxyNum; ++i) { (*(_objectProxy + i))->setProxyProtocol(protocol); } + + _connectionSerial = connectionSerial; } +ProxyProtocol ServantProxy::tars_get_protocol() +{ + TC_LockT lock(*this); + + return (*(_objectProxy + 0))->getProxyProtocol(); +} void ServantProxy::tars_set_sockopt(int level, int optname, const void * optval, SOCKET_LEN_TYPE optlen) { @@ -518,7 +598,7 @@ void ServantProxy::tars_set_push_callback(const ServantProxyCallbackPtr & cb) // } // else // { -// TLOGERROR("[TAF][ServantProxy::invoke_async use coroutine's callback not set CoroParallelBasePtr]" << endl); +// TLOGERROR("[TARS][ServantProxy::invoke_async use coroutine's callback not set CoroParallelBasePtr]" << endl); // delete msg; // msg = NULL; // throw TarsUseCoroException("ServantProxy::invoke_async use coroutine's callback not set CoroParallelBasePtr"); @@ -526,7 +606,7 @@ void ServantProxy::tars_set_push_callback(const ServantProxyCallbackPtr & cb) // } // else // { -// TLOGERROR("[TAF][ServantProxy::invoke coroutine mode invoke not open]" << endl); +// TLOGERROR("[TARS][ServantProxy::invoke coroutine mode invoke not open]" << endl); // delete msg; // msg = NULL; // throw TarsUseCoroException("coroutine mode invoke not open"); @@ -537,7 +617,7 @@ void ServantProxy::tars_set_push_callback(const ServantProxyCallbackPtr & cb) // bool bEmpty; // if (!pReqQ->push_back(msg, bEmpty)) // { -// TLOGERROR("[TAF][ServantProxy::invoke_async msgQueue push_back error num:" << pSptd->_netSeq << "]" << endl); +// TLOGERROR("[TARS][ServantProxy::invoke_async msgQueue push_back error num:" << pSptd->_netSeq << "]" << endl); // msg->pObjectProxy->getCommunicatorEpoll()->notify(pSptd->_reqQNo, pReqQ); // delete msg; // throw TarsClientQueueException("client queue full"); @@ -575,7 +655,7 @@ void ServantProxy::invoke(ReqMessage * msg, bool bCoroAsync) msg->cookie = pSptd->_cookie; -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING msg->trackInfoMap = pSptd->_trackInfoMap; #endif @@ -784,8 +864,7 @@ void ServantProxy::tars_invoke_async(char cPacketType, checkDye(msg->request); checkCookie(msg->request); - - invoke(msg, bCoro); + servant_invoke(msg, bCoro); } shared_ptr ServantProxy::tars_invoke(char cPacketType, @@ -842,13 +921,13 @@ void ServantProxy::rpc_call(uint32_t iRequestId, msg->init(ReqMessage::SYNC_CALL); msg->bFromRpc = true; - msg->request.sFuncName = sFuncName; - + msg->request.sServantName = (*_objectProxy)->name(); + msg->request.sFuncName = sFuncName; msg->request.iRequestId = iRequestId; msg->request.sBuffer.assign(buff, buff + len); - invoke(msg); + servant_invoke(msg, false); rsp = *msg->response.get(); @@ -866,66 +945,183 @@ void ServantProxy::rpc_call_async(uint32_t iRequestId, ReqMessage * msg = new ReqMessage(); msg->init(callback?ReqMessage::ASYNC_CALL:ReqMessage::ONE_WAY); - msg->request.sFuncName = sFuncName; + msg->bFromRpc = true; msg->callback = callback; + msg->request.sServantName = (*_objectProxy)->name(); + msg->request.sFuncName = sFuncName; msg->request.iRequestId = iRequestId; msg->request.sBuffer.assign(buff, buff + len); - invoke(msg, bCoro); + servant_invoke(msg, bCoro); } -void ServantProxy::http_call(const std::string& method, - const std::string& uri, - const std::map& headers, - const std::string& body, - std::map& rheaders, - std::string& rbody) +ServantPrx ServantProxy::getServantPrx(ReqMessage *msg) { - ReqMessage* msg = new ReqMessage(); + if(_connectionSerial <= 0) + return this; - msg->init(ReqMessage::SYNC_CALL); + if(_servantId == 0) + { + std::lock_guard m(_servantMutex); + + if(_servantId == 0) + { + if(_servantList.empty()) + { + for(int i = 0; i < _connectionSerial; ++i) + { + string obj = tars_name() + "#" + TC_Common::tostr(i); + if (!(*_objectProxy)->address().empty()) + { + obj += "@" + (*_objectProxy)->address(); + } + + ServantPrx prx = _communicator->stringToProxy(obj); + prx->tars_set_protocol(tars_get_protocol()); + prx->_rootPrx = this; + + _servantList.push_back(prx); + } + } + ++_servantId; + } + } - msg->bFromRpc = true; - msg->request.sServantName = uri; - msg->request.sFuncName = method; - // 使用下面两个字段保存头部和包体 - msg->request.context = headers; + return _servantList[(_servantId++) % _servantList.size()]; +} - msg->request.sBuffer.assign(body.begin(), body.end()); +void ServantProxy::onNotifyEndpoints(const set & active,const set & inactive) +{ + if(_rootPrx) + { + for (size_t i = 0; i < _rootPrx->_servantList.size(); i++) + { + _rootPrx->_servantList[i]->onNotifyEndpoints(active, inactive); + } + } + else + { + for (size_t i = 0; i < _objectProxyNum; ++i) + { + _objectProxy[i]->getEndpointManager()->updateEndpoints(active, inactive); + } + } +} - invoke(msg); +void ServantProxy::onSetInactive(const EndpointInfo& ep) +{ + if(!_rootPrx) + return; - rheaders.swap(msg->response->status); - rbody.assign(msg->response->sBuffer.begin(), msg->response->sBuffer.end()); + for (size_t i = 0; i < _rootPrx->_servantList.size(); i++) + { + ServantPrx &prx = _rootPrx->_servantList[i]; - delete msg; - msg = NULL; + for (size_t i = 0; i < prx->_objectProxyNum; ++i) + { + prx->_objectProxy[i]->onSetInactive(ep); + } + } } -void ServantProxy::http_call_async(const std::string& method, - const std::string& uri, - const std::map& headers, - const std::string& body, - const HttpCallbackPtr &cb) +int ServantProxy::servant_invoke(ReqMessage *msg, bool bCoroAsync) { - ReqMessage * msg = new ReqMessage(); + ServantPrx prx = getServantPrx(msg); - msg->init(ReqMessage::ASYNC_CALL); + if(msg->callback) + { + msg->callback->setServantPrx(prx); + } - msg->bFromRpc = true; - msg->request.sServantName = uri; - msg->request.sFuncName = method; - // 使用下面两个字段保存头部和包体 - msg->request.context = headers; - msg->request.sBuffer.assign(body.begin(), body.end()); + prx->invoke(msg, bCoroAsync); - ServantProxyCallbackPtr callback = new HttpServantProxyCallback(cb); - msg->callback = callback; + return 0; +} - invoke(msg); +void ServantProxy::http_call(const string &funcName, shared_ptr &request, shared_ptr &response) +{ + // if(_connectionSerial <= 0) { + // _connectionSerial = DEFAULT_CONNECTION_SERIAL; + // } + + ReqMessage* msg = new ReqMessage(); + + msg->init(ReqMessage::SYNC_CALL); + + msg->bFromRpc = true; + + msg->request.sServantName = (*_objectProxy)->name(); + msg->request.sFuncName = funcName; + + msg->request.sBuffer.resize(sizeof(shared_ptr)); + + msg->deconstructor = [msg] { + shared_ptr & data = *(shared_ptr *) (msg->request.sBuffer.data()); + data.reset(); + + if(!msg->response->sBuffer.empty()) + { + shared_ptr & rsp = *(shared_ptr *) (msg->response->sBuffer.data()); + //主动reset一次 + rsp.reset(); + + msg->response->sBuffer.clear(); + } + }; + + shared_ptr & data = *(shared_ptr *) (msg->request.sBuffer.data()); + + data = request; + + servant_invoke(msg, false); + + response = *(shared_ptr*)(msg->response->sBuffer.data()); + + delete msg; + msg = NULL; +} + +void ServantProxy::http_call_async(const string &funcName, shared_ptr &request, const HttpCallbackPtr &cb, bool bCoro) +{ + // if(_connectionSerial <= 0) { + // _connectionSerial = DEFAULT_CONNECTION_SERIAL; + // } + + ReqMessage* msg = new ReqMessage(); + + msg->init(ReqMessage::ASYNC_CALL); + + msg->bFromRpc = true; + + msg->request.sServantName = (*_objectProxy)->name(); + msg->request.sFuncName = funcName; + + msg->request.sBuffer.resize(sizeof(shared_ptr)); + + msg->deconstructor = [msg] { + shared_ptr & data = *(shared_ptr *) (msg->request.sBuffer.data()); + data.reset(); + + if(!msg->response->sBuffer.empty()) + { + shared_ptr & rsp = *(shared_ptr *) (msg->response->sBuffer.data()); + //主动reset一次 + rsp.reset(); + + msg->response->sBuffer.clear(); + } + }; + + *(shared_ptr*)(msg->request.sBuffer.data()) = request; + + ServantProxyCallbackPtr callback = new HttpServantProxyCallback(cb); + + msg->callback = callback; + + servant_invoke(msg, bCoro); } //选取一个网络线程对应的信息 diff --git a/servant/libservant/ServantProxyFactory.cpp b/servant/libservant/ServantProxyFactory.cpp index 4d588f80..bd889394 100644 --- a/servant/libservant/ServantProxyFactory.cpp +++ b/servant/libservant/ServantProxyFactory.cpp @@ -15,7 +15,7 @@ */ #include "servant/ServantProxyFactory.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" namespace tars { diff --git a/servant/libservant/StatReport.cpp b/servant/libservant/StatReport.cpp index 5fda8524..87689adb 100755 --- a/servant/libservant/StatReport.cpp +++ b/servant/libservant/StatReport.cpp @@ -17,7 +17,7 @@ #include "servant/StatReport.h" #include "util/tc_common.h" #include "util/tc_timeprovider.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" #include "servant/Communicator.h" #include "servant/Application.h" #include @@ -485,7 +485,7 @@ int StatReport::reportMicMsg(MapStatMicMsg& msg,bool bFromClient) } mTemp[head] = it->second; - if(LOG->isNeedLog(TarsRollLogger::INFO_LOG)) + if(LOG->isNeedLog(LocalRollLogger::INFO_LOG)) { ostringstream os; os.str(""); @@ -607,7 +607,7 @@ int StatReport::reportPropMsg() } } mStatMsg[head] = body; - if(LOG->isNeedLog(TarsRollLogger::INFO_LOG)) + if(LOG->isNeedLog(LocalRollLogger::INFO_LOG)) { ostringstream os; os.str(""); diff --git a/servant/libservant/TarsConfig.cpp b/servant/libservant/TarsConfig.cpp deleted file mode 100755 index 077d17e2..00000000 --- a/servant/libservant/TarsConfig.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/** - * Tencent is pleased to support the open source community by making Tars available. - * - * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -#include "servant/TarsConfig.h" -#include "util/tc_file.h" -#include "servant/Communicator.h" -#include "servant/TarsNotify.h" -#include "servant/Application.h" -#include - -namespace tars -{ - -int TarsRemoteConfig::setConfigInfo(const CommunicatorPtr &comm, const string &obj, const string & app, const string &serverName, const string& basePath,const string& setdivision, int maxBakNum) -{ - _comm = comm; - if(!obj.empty()) - { - _configPrx = _comm->stringToProxy(obj); - } - _app = app; - _serverName = serverName; - _basePath = basePath; - _maxBakNum = maxBakNum; - _setdivision = setdivision; - return 0; -} - -bool TarsRemoteConfig::addConfig(const string & sFileName, string &buffer, bool bAppConfigOnly) -{ - TC_LockT lock(_mutex); - - try - { - string sFullFileName = _basePath + FILE_SEP + sFileName; - - string newFile = getRemoteFile(sFileName, bAppConfigOnly); - - if (newFile.empty() || !TC_File::isFileExist(newFile))//拉取不到配置中心的配置文件 - { - if(!TC_File::isFileExist(newFile)) //获取本地配置成功,返回成功,但需要告警一下。 - { - buffer = "[fail] get remote config:" + sFileName + "fail,use the local config."; - - return true; - } - throw runtime_error("access file error:" + newFile); - } - - if (TC_File::load2str(newFile) != TC_File::load2str(sFullFileName)) - { - for (int i = _maxBakNum - 1; i >= 1; --i) - { - if (TC_File::isFileExist(index2file(sFullFileName, i))) - { - localRename(index2file(sFullFileName, i), index2file(sFullFileName, i+1)); - } - } - - if (TC_File::isFileExist(sFullFileName)) - { - localRename(sFullFileName, index2file(sFullFileName, 1)); - } - } - - localRename(newFile, sFullFileName); - - assert(TC_File::isFileExist(sFullFileName)); - //assert(!access(sFullFileName.c_str(), R_OK)); - - buffer = "[succ] get remote config:" + sFileName; - - return true; - } - catch (std::exception& e) - { - buffer = "[fail] get remote config '" + sFileName + "' error:" + string(e.what()); - } - catch (...) - { - buffer = "[fail] get remote config '" + sFileName + "' unknown error"; - } - - return false; -} - -string TarsRemoteConfig::getRemoteFile(const string &sFileName, bool bAppConfigOnly) -{ - if (_configPrx) - { - string stream; - int ret = -1; - for(int i = 0; i < 2;i++) - { - try - { - if(_setdivision.empty()) - { - ret = _configPrx->loadConfig(_app, (bAppConfigOnly ? "" : _serverName), sFileName, stream, ServerConfig::Context); - } - else - { - struct ConfigInfo confInfo; - confInfo.appname = _app; - confInfo.servername = (bAppConfigOnly ? "" : _serverName); - confInfo.filename = sFileName; - confInfo.bAppOnly = bAppConfigOnly; - confInfo.setdivision = _setdivision; - ret = _configPrx->loadConfigByInfo(confInfo,stream, ServerConfig::Context); - } - - break; - }catch(std::exception& e){ - // - }catch (...){ - // - } - } - - if (ret != 0 || stream.empty()) - { - throw runtime_error("remote config file is empty:" + sFileName); - } - - - string newFile = _basePath + "/" + sFileName + "." + TC_Common::tostr(time(NULL)); - - std::ofstream out(newFile.c_str()); - - string result; - if (out) - { - out << stream;//如果硬盘满了,是否能写入成功需要进行判断。 - out.flush(); - if(out.bad()) - { - out.close(); - result = "[fail] copy stream to disk error." ; - TarsRemoteNotify::getInstance()->report(result); - return ""; - } - else - { - out.close(); - return newFile; - } - } - } - return ""; -} - -string TarsRemoteConfig::index2file(const string & sFullFileName, int index) -{ - return sFullFileName + "." + TC_Common::tostr(index) + ".bak"; -} - -void TarsRemoteConfig::localRename(const string& oldFile, const string& newFile) -{ -#if TARGET_PLATFORM_WINDOWS - //by goodenpei,windows下面先remove后rename,否则rename会失败 - if (TC_File::isFileExist(oldFile) && TC_File::isFileExist(newFile)) - { - ::remove(newFile.c_str()); - } -#endif - if (::rename(oldFile.c_str(), newFile.c_str()) != 0) - { - throw runtime_error("rename file error:" + oldFile + "->" + newFile); - } -} - -string TarsRemoteConfig::recoverSysConfig(const string & sFullFileName) -{ - try - { - for (int i = 1; i <= _maxBakNum; ++i) - { - if (TC_File::isFileExist(index2file(sFullFileName, i))) - { - localRename(index2file(sFullFileName, i), sFullFileName); - - return "[succ] recover file:" + index2file(sFullFileName, i); - } - } - } - catch (std::exception& e) - { - return "[fail] recover config error:" + string(e.what()); - } - catch (...) - { - return "[fail] recover config error"; - } - - return "[fail] no backup file."; -} - -} - - diff --git a/servant/libservant/TarsCurrent.cpp b/servant/libservant/TarsCurrent.cpp deleted file mode 100644 index df5e440b..00000000 --- a/servant/libservant/TarsCurrent.cpp +++ /dev/null @@ -1,437 +0,0 @@ -/** - * Tencent is pleased to support the open source community by making Tars available. - * - * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -#include "servant/TarsCurrent.h" -#include "servant/ServantHandle.h" -#include "servant/BaseF.h" -#include "servant/Application.h" -#include "tup/tup.h" -#include - -namespace tars -{ -////////////////////////////////////////////////////////////////// -TarsCurrent::TarsCurrent(ServantHandle *pServantHandle) -: _servantHandle(pServantHandle) -// , _bindAdapter(NULL) -// , _uid(0) -// , _ip("NULL") -// , _port(0) -// , _fd(-1) -, _response(true) -// , _begintime(0) -, _ret(0) -, _reportStat(true) -// , _closeType(-1) -{ -} - -TarsCurrent::~TarsCurrent() -{ - //TUP调用或单向调用,从服务端上报调用信息 - if(_reportStat) - { - if(_request.iVersion == TUPVERSION ) - { - reportToStat("tup_client"); - } - else if(_request.cPacketType == TARSONEWAY) - { - reportToStat("one_way_client"); - } - else if(!_data->adapter()->isTarsProtocol() && ServerConfig::ReportFlow) - { - //非tars客户端 从服务端上报调用信息 - reportToStat("not_tars_client"); - } - } -} - -const string &TarsCurrent::getHostName() const -{ - auto it = _request.context.find("node_name"); - if(it != _request.context.end()) - { - return it->second; - } - return _data->ip(); - -} - -const string &TarsCurrent::getIp() const -{ - return _data->ip(); -} - -int TarsCurrent::getPort() const -{ - return _data->port(); - // return _port; -} - -uint32_t TarsCurrent::getUId() const -{ - return _data->uid(); - // return _uid; -} - -string TarsCurrent::getServantName() const -{ - return _request.sServantName; -} - -short TarsCurrent::getRequestVersion() const -{ - return _request.iVersion; -} - -map& TarsCurrent::getContext() -{ - return _request.context; -} - -const map& TarsCurrent::getRequestStatus() const -{ - return _request.status; -} - -string TarsCurrent::getFuncName() const -{ - return _request.sFuncName; -} - -uint32_t TarsCurrent::getRequestId() const -{ - return _request.iRequestId; -} - -char TarsCurrent::getPacketType() const -{ - return _request.cPacketType; -} - -tars::Int32 TarsCurrent::getMessageType() const -{ - return _request.iMessageType; -} - -struct timeval TarsCurrent::getRecvTime() const -{ - timeval tm; - tm.tv_sec = _data->recvTimeStamp()/1000; - tm.tv_usec = (_data->recvTimeStamp()%1000)*1000; - - return tm; -} - -void TarsCurrent::setReportStat(bool bReport) -{ - _reportStat = bReport; -} - -const vector& TarsCurrent::getRequestBuffer() const -{ - if (_data->adapter()->isTarsProtocol()) - { - return _request.sBuffer; - } - else - { - return _data->buffer(); - } - - // return _request.sBuffer; -} - -bool TarsCurrent::isResponse() const -{ - return _response; -} - -void TarsCurrent::setCloseType(int type) -{ - _data->setCloseType(type); -} - -int TarsCurrent::getCloseType() const -{ - return _data->closeType(); -} - -void TarsCurrent::initialize(const shared_ptr &data) -// void TarsCurrent::initialize(const TC_EpollServer::tagRecvData &stRecvData) -{ - _data = data; - - _request.sServantName = ServantHelperManager::getInstance()->getAdapterServant(_data->adapter()->getName()); - - if (_data->adapter()->isTarsProtocol()) - { - initialize(_data->buffer()); - } - // initialize(stRecvData, begintime); -} - - -void TarsCurrent::initializeClose(const shared_ptr &data) -{ - _data = data; - - _request.sServantName = ServantHelperManager::getInstance()->getAdapterServant(_data->adapter()->getName()); - -} - -void TarsCurrent::initialize(const vector& sRecvBuffer) -{ - TarsInputStream is; - - is.setBuffer(sRecvBuffer.data(), sRecvBuffer.size()); - - _request.readFrom(is); -} - -// void TarsCurrent::initialize(const TC_EpollServer::tagRecvData &stRecvData, int64_t beginTime) -// { -// _ip = stRecvData.ip; - -// _port = stRecvData.port; - -// _uid = stRecvData.uid; - -// _fd = stRecvData.fd; - -// _bindAdapter = stRecvData.adapter.get(); - -// _begintime = beginTime; - -// _request.sServantName = ServantHelperManager::getInstance()->getAdapterServant(stRecvData.adapter->getName()); - -// if (_bindAdapter->isTarsProtocol()) -// { -// initialize(stRecvData.buffer); -// } -// else -// { -// _request.sBuffer.reserve(stRecvData.buffer.length()); - -// _request.sBuffer.resize(stRecvData.buffer.length()); - -// ::memcpy(&_request.sBuffer[0], stRecvData.buffer.c_str(), stRecvData.buffer.length()); -// } -// } - -// void TarsCurrent::initializeClose(const TC_EpollServer::tagRecvData &stRecvData) -// { -// _ip = stRecvData.ip; - -// _port = stRecvData.port; - -// _uid = stRecvData.uid; - -// _fd = stRecvData.fd; - -// _bindAdapter = stRecvData.adapter.get(); - -// _request.sServantName = ServantHelperManager::getInstance()->getAdapterServant(stRecvData.adapter->getName()); - -// _begintime = TNOWMS; -// } - -// void TarsCurrent::initialize(const string &sRecvBuffer) -// { -// TarsInputStream is; - -// is.setBuffer(sRecvBuffer.c_str(), sRecvBuffer.length()); - -// _request.readFrom(is); -// } - -void TarsCurrent::sendResponse(const char* buff, uint32_t len) -{ - // _servantHandle->sendResponse(_uid, string(buff, len), _ip, _port, _fd); - shared_ptr send = _data->createSendContext(); - send->buffer()->assign(buff, len); - _servantHandle->sendResponse(send); -} - - -void TarsCurrent::sendResponse(int iRet, const vector &buff) -{ - //单向调用不需要返回 - if (_request.cPacketType == TARSONEWAY) - { - return; - } - - // ResponsePacket response; - // response.sBuffer = buff; - sendResponse(iRet, buff, TARS_STATUS(), ""); -} - -void TarsCurrent::sendResponse(int iRet) -{ - // ResponsePacket response; - sendResponse(iRet, vector(), TARS_STATUS(), ""); -} - -void TarsCurrent::sendResponse(int iRet, tars::TarsOutputStream& os) -{ - // ResponsePacket response; - // os.swap(response.sBuffer); - sendResponse(iRet, os.getByteBuffer(), TARS_STATUS(), ""); -} - -void TarsCurrent::sendResponse(int iRet, tup::UniAttribute& attr) -{ - ResponsePacket response; - attr.encode(response.sBuffer); - sendResponse(iRet, response.sBuffer, TARS_STATUS(), ""); -} - -void TarsCurrent::sendResponse(int iRet, const vector &buffer, const map& status, const string & sResultDesc) -{ - _ret = iRet; - - //单向调用不需要返回 - if (_request.cPacketType == TARSONEWAY) - { - return; - } - - shared_ptr send = _data->createSendContext(); - - tars::Int32 iHeaderLen = 0; - - TarsOutputStream os; - - //先预留4个字节长度 - os.writeBuf((const char *)&iHeaderLen, sizeof(iHeaderLen)); - - if (_request.iVersion != TUPVERSION) - { - ResponsePacket response; - - response.iRequestId = _request.iRequestId; - response.iMessageType = _request.iMessageType; - response.cPacketType = TARSNORMAL; - - response.iVersion = _request.iVersion; - response.status = status; - response.sBuffer = std::move(buffer); - response.sResultDesc = sResultDesc; - response.context = _responseContext; - response.iRet = iRet; - - TLOGTARS("[TARS]TarsCurrent::sendResponse :" - << response.iMessageType << "|" - << _request.sServantName << "|" - << _request.sFuncName << "|" - << response.iRequestId << endl); - - response.writeTo(os); - } - else - { - //tup回应包用请求包的结构(这里和新版本TAF是有区别的) - RequestPacket response; - - response.iRequestId = _request.iRequestId; - response.iMessageType = _request.iMessageType; - response.cPacketType = TARSNORMAL; - - response.iVersion = _request.iVersion; - response.status = status; - response.context = _responseContext; - response.sBuffer = std::move(buffer); - response.sServantName = _request.sServantName; - response.sFuncName = _request.sFuncName; - - //异常的情况下buffer可能为空,要保证有一个空UniAttribute的编码内容 - if(response.sBuffer.size() == 0) - { - tup::UniAttribute<> tarsAttr; - tarsAttr.setVersion(_request.iVersion); - tarsAttr.encode(response.sBuffer); - } - //iRet为0时,不记录在status里面,节省空间 - if(iRet != 0) - { - response.status[ServantProxy::STATUS_RESULT_CODE] = TC_Common::tostr(iRet); - } - //sResultDesc为空时,不记录在status里面,节省空间 - if(!sResultDesc.empty()) - { - response.status[ServantProxy::STATUS_RESULT_DESC] = sResultDesc; - } - - TLOGTARS("[TARS]TarsCurrent::sendResponse :" - << response.iMessageType << "|" - << _request.sServantName << "|" - << _request.sFuncName << "|" - << response.iRequestId << endl); - - response.writeTo(os); - } - - assert(os.getLength() >= 4); - - iHeaderLen = htonl((int)(os.getLength())); - - memcpy(os.getByteBuffer().data(), (const char *)&iHeaderLen, sizeof(iHeaderLen)); - - send->buffer()->swap(os.getByteBuffer()); - - _servantHandle->sendResponse(send); - -} - - -void TarsCurrent::close() -{ - if (_servantHandle) - { - _servantHandle->close(_data); - } -} - -ServantHandle* TarsCurrent::getServantHandle() -{ - return _servantHandle; -} - -TC_EpollServer::BindAdapter* TarsCurrent::getBindAdapter() -{ - return _data->adapter().get(); -} - -void TarsCurrent::reportToStat(const string& sObj) -{ - StatReport* stat = Application::getCommunicator()->getStatReport(); - - if(stat && stat->getStatPrx()) - { - // int64_t endtime = TNOWMS; - // int sptime = endtime - _begintime; - - //被调上报自己的set信息,set信息在setReportInfo设置 - // stat->report(sObj, "" , _request.sServantName, _data->ip(), 0, _request.sFuncName, (StatReport::StatResult)_ret, TNOWMS - _data->recvTimeStamp(), 0); - - stat->report(sObj, "", _request.sFuncName, _data->ip(), 0, (StatReport::StatResult)_ret, TNOWMS - _data->recvTimeStamp(), 0, false); - } -} - -//////////////////////////////////////////////////////////////////////////// -} diff --git a/servant/libservant/TarsLogger.cpp b/servant/libservant/TarsLogger.cpp deleted file mode 100644 index 0669f822..00000000 --- a/servant/libservant/TarsLogger.cpp +++ /dev/null @@ -1,723 +0,0 @@ -/** - * Tencent is pleased to support the open source community by making Tars available. - * - * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -#include "servant/TarsLogger.h" -#include "servant/Communicator.h" -#include "servant/Application.h" - -namespace tars -{ - -int RollWriteT::_dyeingThread = 0; -int TimeWriteT::_dyeing = 0; - -///////////////////////////////////////////////////////////////////////////////////// - -RollWriteT::RollWriteT():_dyeingRollLogger(NULL), _maxSize(10000), _maxNum(1), _logPrx(NULL) -{ -} - -RollWriteT::~RollWriteT() -{ - if(_dyeingRollLogger) - { - delete _dyeingRollLogger; - } -} - -void RollWriteT::operator()(ostream &of, const deque > &ds) -{ - vector vRemoteDyeing; - - deque >::const_iterator it = ds.begin(); - while(it != ds.end()) - { - of << it->second; - - //染色线程id不存在 - if(it->first != 0) - { - if(!_dyeingRollLogger) - { - string sDyeingDir = _logPath; - sDyeingDir += "/"; - sDyeingDir += DYEING_DIR; - sDyeingDir += "/"; - - string sDyeingFile = sDyeingDir; - sDyeingFile += DYEING_FILE; - - TC_File::makeDirRecursive(sDyeingDir); - - //初始化染色循环日志 - _dyeingRollLogger = new TC_RollLogger(); - - _dyeingRollLogger->init(sDyeingFile, _maxSize, _maxNum); - _dyeingRollLogger->modFlag(TC_DayLogger::HAS_TIME, false); - _dyeingRollLogger->modFlag(TC_DayLogger::HAS_TIME|TC_DayLogger::HAS_LEVEL|TC_DayLogger::HAS_PID, true); - _dyeingRollLogger->setLogLevel("DEBUG"); - } - - _dyeingRollLogger->roll(make_pair(it->first, _app + "." + _server + "|" + it->second )); - - vRemoteDyeing.push_back(_app + "." + _server + "|" + it->second); - } - - ++it; - } - of.flush(); - - if(_logPrx && vRemoteDyeing.size() > 0) - { - try - { - _logPrx->logger(DYEING_DIR, DYEING_FILE, "roll", "%Y%m%d", vRemoteDyeing, ServerConfig::Context); - } - catch(exception &ex) - { - TLOGERROR("[TARS] dyeing log write to remote log server error:" << ex.what() << endl); - } - } -} - -void RollWriteT::setDyeingLogInfo(const string &sApp, const string &sServer, const string & sLogPath, int iMaxSize, int iMaxNum, const CommunicatorPtr &comm, const string &sLogObj) -{ - _app = sApp; - _server = sServer; - _logPath = sLogPath; - _maxSize = iMaxSize; - _maxNum = iMaxNum; - - if(comm && !sLogObj.empty()) - { - _logPrx = comm->stringToProxy(sLogObj); - //单独设置超时时间 - _logPrx->tars_timeout(3000); - } -} - - -///////////////////////////////////////////////////////////////////////////////////// - -void TarsRollLogger::setLogInfo(const string &sApp, const string &sServer, const string &sLogpath, int iMaxSize, int iMaxNum, const CommunicatorPtr &comm, const string &sLogObj) -{ - _app = sApp; - _server = sServer; - _logpath = sLogpath; - - //生成目录 - TC_File::makeDirRecursive(_logpath + "/" + _app + "/" + _server); - - _local.start(1); - - //初始化本地循环日志 - _logger.init(_logpath + "/" + _app + "/" + _server + "/" + _app + "." + _server, iMaxSize, iMaxNum); - _logger.modFlag(TC_DayLogger::HAS_TIME, false); - _logger.modFlag(TC_DayLogger::HAS_TIME|TC_DayLogger::HAS_LEVEL|TC_DayLogger::HAS_PID, true); - - //设置为异步 - sync(false); - - - //设置染色日志信息 - _logger.getWriteT().setDyeingLogInfo(sApp, sServer, sLogpath, iMaxSize, iMaxNum, comm, sLogObj); - -} - - -void TarsRollLogger::sync(bool bSync) -{ - if(bSync) - { - _logger.unSetupThread(); - } - else - { - _logger.setupThread(&_local); - } -} - -void TarsRollLogger::enableDyeing(bool bEnable, const string& sDyeingKey/* = ""*/) -{ - _logger.getRoll()->enableDyeing(bEnable, sDyeingKey); -} - -///////////////////////////////////////////////////////////////////////////////////// - -TarsLoggerThread::TarsLoggerThread() -{ - _local.start(1); - _remote.start(1); -} - -TarsLoggerThread::~TarsLoggerThread() -{ - //先刷新本地日志 - _local.flush(); - - //再刷新远程日志, 保证不会丢日志 - _remote.flush(); -} - -TC_LoggerThreadGroup* TarsLoggerThread::local() -{ - return &_local; -} - -TC_LoggerThreadGroup* TarsLoggerThread::remote() -{ - return &_remote; -} - -///////////////////////////////////////////////////////////////////////////////////// -RemoteTimeWriteT::RemoteTimeWriteT():_timeWrite(NULL) -{ -} - -RemoteTimeWriteT::~RemoteTimeWriteT() -{ -} - -void RemoteTimeWriteT::setTimeWriteT(TimeWriteT *pTimeWrite) -{ - _timeWrite = pTimeWrite; -} - -void RemoteTimeWriteT::operator()(ostream &of, const deque > &buffer) -{ - const static uint32_t len = 2000; - - //写远程日志 - if(_timeWrite->_logPrx && !buffer.empty()) - { - //大于50w条, 直接抛弃掉,否则容易导致内存泄漏 - if(buffer.size() > 500000) - { - _timeWrite->writeError(buffer); - return; - } - - vector v; - v.reserve(len); - - deque >::const_iterator it = buffer.begin(); - while(it != buffer.end()) - { - v.push_back(it->second); - - ++it; - - //每次最多同步len条 - if(v.size() >= len) - { - sync2remote(v); - v.clear(); - v.reserve(len); - } - } - - if(v.size() > 0) - { - sync2remote(v); - } - } -} - -void RemoteTimeWriteT::sync2remote(const vector &v) -{ - try - { - //此处传递set信息到远程logserver - LogInfo stInfo; - stInfo.appname = _timeWrite->_app; - stInfo.servername = _timeWrite->_server; - stInfo.sFilename = _timeWrite->_file; - stInfo.sFormat = _timeWrite->_format; - stInfo.setdivision = _timeWrite->_setDivision; - stInfo.bHasSufix = _timeWrite->_hasSufix; - stInfo.bHasAppNamePrefix = _timeWrite->_hasAppNamePrefix; - stInfo.sConcatStr = _timeWrite->_concatStr; - stInfo.bHasSquareBracket = _timeWrite->_hasSquareBracket; - stInfo.sSepar = _timeWrite->_separ; - stInfo.sLogType = _timeWrite->_logType; - - _timeWrite->_logPrx->loggerbyInfo(stInfo,v, ServerConfig::Context); - - if (_timeWrite->_reportSuccPtr) - { - _timeWrite->_reportSuccPtr->report(v.size()); - } - } - catch(exception &ex) - { - TLOGERROR("[TARS] write to remote log server error:" << ex.what() << ": buffer size:" << v.size() << endl); - _timeWrite->writeError(v); - if (_timeWrite->_reportFailPtr) - { - _timeWrite->_reportFailPtr->report(v.size()); - } - } -} - -void RemoteTimeWriteT::sync2remoteDyeing(const vector &v) -{ - try - { - _timeWrite->_logPrx->logger(DYEING_DIR, DYEING_FILE, "", _timeWrite->_format, v, ServerConfig::Context); - } - catch(exception &ex) - { - TLOGERROR("[TARS] write dyeing log to remote log server error:" << ex.what() << ": buffer size:" << v.size() << endl); - _timeWrite->writeError(v); - } -} -///////////////////////////////////////////////////////////////////////////////////// -// -TimeWriteT::~TimeWriteT() -{ - if(_remoteTimeLogger) - { - delete _remoteTimeLogger; - } -} - -TimeWriteT::TimeWriteT() : _remoteTimeLogger(NULL), _local(true), _remote(true), _dyeingTimeLogger(NULL),_setDivision(""), - _hasSufix(true),_hasAppNamePrefix(true),_concatStr("_"),_separ("|"),_hasSquareBracket(false),_logType("") -{ -} - -void TimeWriteT::setLogInfo(const LogPrx &logPrx, const string &sApp, const string &sServer, const string &sFile, const string &sLogpath, const string &sFormat, const string& setdivision, const string& sLogType, const PropertyReportPtr &reportSuccPtr, const PropertyReportPtr &reportFailPtr) -{ - _logPrx = logPrx; - _app = sApp; - _server = sServer; - _format = sFormat; - _file = sFile; - _setDivision = setdivision; - _logType = sLogType; - _reportSuccPtr = reportSuccPtr; - _reportFailPtr = reportFailPtr; - - string sAppSrvName = _hasAppNamePrefix?(_app + "." + _server):""; - - _filePath = sLogpath + "/" + _app + "/" + _server + "/" + sAppSrvName; - if(!_file.empty()) - { - _filePath += (_hasAppNamePrefix?_concatStr:"") + sFile; - } - - string sDyeingDir = sLogpath; - sDyeingDir += "/"; - sDyeingDir += DYEING_DIR; - sDyeingDir += "/"; - - _dyeingFilePath = sDyeingDir; - - _remoteTimeLogger = new RemoteTimeLogger(); - _remoteTimeLogger->init(_filePath, _format,_hasSufix,_concatStr,NULL,true); - _remoteTimeLogger->modFlag(0xffff, false); - _remoteTimeLogger->setSeparator(_separ); - _remoteTimeLogger->enableSqareWrapper(_hasSquareBracket); - _remoteTimeLogger->setupThread(TarsLoggerThread::getInstance()->remote()); - _remoteTimeLogger->getWriteT().setTimeWriteT(this); - - if(!_local) - { - initError(); - } -} - -void TimeWriteT::initDyeingLog() -{ - TC_File::makeDirRecursive(_dyeingFilePath); - - string sDyeingFile = _dyeingFilePath; - sDyeingFile += "/"; - sDyeingFile += DYEING_FILE; - - _dyeingTimeLogger = new DyeingTimeLogger(); - _dyeingTimeLogger->init(sDyeingFile, _format); - _dyeingTimeLogger->modFlag(0xffff, false); -} - -void TimeWriteT::setLogPrx(const LogPrx &logPrx) -{ - _logPrx = logPrx; -} - -void TimeWriteT::initError() -{ - //远程错误日志 - _logger.init(_filePath + ".remote.error", _format); - _logger.modFlag(0xffff, false); -} - -void TimeWriteT::enableLocal(bool bEnable) -{ - _local = bEnable; - if(!_local) - { - initError(); - } -} - -void TimeWriteT::operator()(ostream &of, const deque > &buffer) -{ - - if(_local && of && !buffer.empty()) - { - try - { - _wt(of, buffer); - } - catch(...) - { - } - } - - if(_remote && _remoteTimeLogger && !buffer.empty()) - { - deque >::const_iterator it = buffer.begin(); - while(it != buffer.end()) - { - _remoteTimeLogger->any() << it->second; - ++it; - } - } - - vector vDyeingLog; - deque >::const_iterator it = buffer.begin(); - while(it != buffer.end()) - { - if(it->first != 0) - { - if(!_dyeingTimeLogger) - { - initDyeingLog(); - } - _dyeingTimeLogger->any() << _app << "." << _server << "|" << it->second; - - vDyeingLog.push_back(_app + "." + _server + "|" + it->second); - } - ++it; - } - if(_logPrx && !vDyeingLog.empty()) - { - try - { - _logPrx->logger(DYEING_DIR, DYEING_FILE, "day", "%Y%m%d", vDyeingLog, ServerConfig::Context); - } - catch(exception &ex) - { - TLOGERROR("[TARS] dyeing log write to remote log server error:" << ex.what() << endl); - } - } -} - -void TimeWriteT::writeError(const vector &buffer) -{ - if(!_local) - { - for(size_t i = 0; i < buffer.size(); i++) - { - _logger.any() << buffer[i]; - } - } - - //告警 - string sInfo = _app + "." + _server + "|"; - sInfo += ServerConfig::LocalIp + "|sync log to remote tarslog error"; - FDLOG("tarserror") << sInfo < > &buffer) -{ - if(!_local) - { - deque >::const_iterator it = buffer.begin(); - while(it != buffer.end()) - { - _logger.any() << it->second; - ++it; - } - } - - //告警 - string sInfo = _app + "." + _server + "|"; - sInfo += ServerConfig::LocalIp + "|sync log to remote tarslog error(buffer.size>500000)"; - FDLOG("tarserror") << sInfo <::iterator it = _loggers.begin(); - while(it != _loggers.end()) - { - delete it->second; - ++it; - } - _loggers.clear(); -} - -void TarsTimeLogger::initTimeLogger(TimeLogger *pTimeLogger, const string &sFile, const string &sFormat,const TarsLogTypePtr& logTypePtr) -{ - string sAppSrvName = _hasAppNamePrefix?(_app + "." + _server):""; - string sFilePath = _logpath + "/" + _app + "/" + _server + "/" + sAppSrvName; - - if(!sFile.empty()) - { - sFilePath += (_hasAppNamePrefix?_concatStr:"") + sFile; - } - - //本地日志格式 - pTimeLogger->init(sFilePath, sFormat,_hasSufix,_concatStr,logTypePtr,!_local); - pTimeLogger->modFlag(0xffff, false); - pTimeLogger->modFlag(TC_DayLogger::HAS_TIME, true); - pTimeLogger->setSeparator(_separ); - pTimeLogger->enableSqareWrapper(_hasSquareBracket); - pTimeLogger->setupThread(TarsLoggerThread::getInstance()->local()); - - //远程日志格式 - pTimeLogger->getWriteT().enableSufix(_hasSufix); - pTimeLogger->getWriteT().enablePrefix(_hasAppNamePrefix); - pTimeLogger->getWriteT().setFileNameConcatStr(_concatStr); - pTimeLogger->getWriteT().setSeparator(_separ); - pTimeLogger->getWriteT().enableSqareWrapper(_hasSquareBracket); - pTimeLogger->getWriteT().enableLocal(_local); - pTimeLogger->getWriteT().enableRemote(_remote); - - string sLogType = ""; - if(logTypePtr) - { - sLogType = logTypePtr->toString(); - } - - PropertyReportPtr reportSuccPtr = NULL; - PropertyReportPtr reportFailPtr = NULL; - if (_remote && _logStatReport) - { - string sKey = _app + "." + _server + "." + sFile; - reportSuccPtr = _comm->getStatReport()->createPropertyReport(sKey + "_log_send_succ", PropertyReport::sum()); - reportFailPtr = _comm->getStatReport()->createPropertyReport(sKey + "_log_send_fail", PropertyReport::sum()); - } - - pTimeLogger->getWriteT().setLogInfo(_logPrx, _app, _server, sFile, _logpath, sFormat, _setDivision, sLogType, reportSuccPtr, reportFailPtr); -} - -void TarsTimeLogger::initTimeLogger(TimeLogger *pTimeLogger,const string &sApp, const string &sServer, const string &sFile, const string &sFormat,const TarsLogTypePtr& logTypePtr) -{ - string sAppSrvName = _hasAppNamePrefix?(sApp + "." + sServer):""; - string sFilePath = _logpath + "/" + sApp + "/" + sServer + "/" + sAppSrvName; - - if(!sFile.empty()) - { - sFilePath += (_hasAppNamePrefix?_concatStr:"") + sFile; - - } - - //本地日志格式 - pTimeLogger->init(sFilePath,sFormat,_hasSufix,_concatStr,logTypePtr,!_local); - pTimeLogger->modFlag(0xffff, false); - pTimeLogger->modFlag(TC_DayLogger::HAS_TIME, true); - pTimeLogger->setSeparator(_separ); - pTimeLogger->enableSqareWrapper(_hasSquareBracket); - pTimeLogger->setupThread(TarsLoggerThread::getInstance()->local()); - - //远程日志格式 - pTimeLogger->getWriteT().enableSufix(_hasSufix); - pTimeLogger->getWriteT().enablePrefix(_hasAppNamePrefix); - pTimeLogger->getWriteT().setFileNameConcatStr(_concatStr); - pTimeLogger->getWriteT().setSeparator(_separ); - pTimeLogger->getWriteT().enableSqareWrapper(_hasSquareBracket); - pTimeLogger->getWriteT().enableLocal(_local); - pTimeLogger->getWriteT().enableRemote(_remote); - string sLogType = ""; - if(logTypePtr) - { - sLogType = logTypePtr->toString(); - } - - PropertyReportPtr reportSuccPtr = NULL; - PropertyReportPtr reportFailPtr = NULL; - if (_remote && _logStatReport) - { - string sKey = _app + "." + _server + "." + sFile; - reportSuccPtr = _comm->getStatReport()->createPropertyReport(sKey + "_log_send_succ", PropertyReport::sum()); - reportFailPtr = _comm->getStatReport()->createPropertyReport(sKey + "_log_send_fail", PropertyReport::sum()); - } - - pTimeLogger->getWriteT().setLogInfo(_logPrx, sApp, sServer, sFile, _logpath, sFormat, _setDivision, sLogType, reportSuccPtr, reportFailPtr); -} - -void TarsTimeLogger::setLogInfo(const CommunicatorPtr &comm, const string &obj, const string &sApp, const string &sServer, const string &sLogpath, const string& setdivision, const bool &bLogStatReport) -{ - _app = sApp; - _server = sServer; - _logpath = sLogpath; - _comm = comm; - _setDivision = setdivision; - _logStatReport = bLogStatReport; - if(!obj.empty()) - { - _logPrx = _comm->stringToProxy(obj); - //单独设置超时时间 - _logPrx->tars_timeout(3000); - - if(_defaultLogger) - { - _defaultLogger->getWriteT().setLogPrx(_logPrx); - } - } - - //创建本地目录 - TC_File::makeDirRecursive(_logpath + "/" + _app + "/" + _server); -} - -void TarsTimeLogger::initFormat(const string &sFile, const string &sFormat,const TarsLogTypePtr& logTypePtr) -{ - if(sFile.empty()) - { - if(!_defaultLogger) - { - _defaultLogger = new TimeLogger(); - - } - initTimeLogger(_defaultLogger, "", sFormat,logTypePtr); - } - else - { - string s = _app + "/" + _server + "/"+ sFile; - Lock lock(*this); - map::iterator it = _loggers.find(s); - if( it == _loggers.end()) - { - TimeLogger *p = new TimeLogger(); - initTimeLogger(p, sFile, sFormat,logTypePtr); - _loggers[s] = p; - return; - } - - initTimeLogger(it->second, sFile, sFormat,logTypePtr); - } -} -void TarsTimeLogger::initFormat(const string &sApp, const string &sServer,const string &sFile, const string &sFormat,const TarsLogTypePtr& logTypePtr) -{ - string s = sApp + "/" + sServer + "/"+ sFile; - Lock lock(*this); - map::iterator it = _loggers.find(s); - if( it == _loggers.end()) - { - TimeLogger *p = new TimeLogger(); - initTimeLogger(p, sApp, sServer, sFile, sFormat,logTypePtr); - _loggers[s] = p; - return; - } - - initTimeLogger(it->second, sApp, sServer, sFile, sFormat,logTypePtr); -} - -TarsTimeLogger::TimeLogger* TarsTimeLogger::logger(const string &sFile) -{ - if(sFile.empty()) - { - if(!_defaultLogger) - { - _defaultLogger = new TimeLogger(); - initTimeLogger(_defaultLogger, "", "%Y%m%d"); - } - return _defaultLogger; - } - - string s = _app + "/" + _server + "/"+ sFile; - Lock lock(*this); - map::iterator it = _loggers.find(s); - if( it == _loggers.end()) - { - TimeLogger *p = new TimeLogger(); - initTimeLogger(p, sFile, "%Y%m%d"); - _loggers[s] = p; - return p; - } - - return it->second; -} - -TarsTimeLogger::TimeLogger* TarsTimeLogger::logger(const string &sApp, const string &sServer,const string &sFile) -{ - string s = sApp + "/" + sServer + "/"+ sFile; - - Lock lock(*this); - map::iterator it = _loggers.find(s); - if( it == _loggers.end()) - { - TimeLogger *p = new TimeLogger(); - initTimeLogger(p, sApp, sServer, sFile, "%Y%m%d"); - _loggers[s] = p; - return p; - } - - return it->second; -} - - -void TarsTimeLogger::sync(const string &sFile, bool bSync) -{ - if(bSync) - { - logger(sFile)->unSetupThread(); - } - else - { - logger(sFile)->setupThread(TarsLoggerThread::getInstance()->local()); - } -} - -void TarsTimeLogger::enableRemote(const string &sFile, bool bEnable) -{ - logger(sFile)->getWriteT().enableRemote(bEnable); -} - -void TarsTimeLogger::enableRemoteEx(const string &sApp, const string &sServer,const string &sFile, bool bEnable) -{ - logger(sApp,sServer,sFile)->getWriteT().enableRemote(bEnable); -} -void TarsTimeLogger::enableLocal(const string &sFile, bool bEnable) -{ - logger(sFile)->getWriteT().enableLocal(bEnable); - logger(sFile)->setRemote(!bEnable); -} - -void TarsTimeLogger::enableLocalEx(const string &sApp, const string &sServer,const string &sFile, bool bEnable) -{ - logger(sApp,sServer,sFile)->getWriteT().enableLocal(bEnable); - logger(sApp,sServer,sFile)->setRemote(!bEnable); -} - -} diff --git a/servant/libservant/TarsNodeF.cpp b/servant/libservant/TarsNodeF.cpp deleted file mode 100755 index a0aa12cf..00000000 --- a/servant/libservant/TarsNodeF.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Tencent is pleased to support the open source community by making Tars available. - * - * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -#include "util/tc_port.h" -#include "servant/TarsNodeF.h" -#include "servant/TarsLogger.h" -#include "servant/Communicator.h" - -namespace tars -{ - -void TarsNodeFHelper::setNodeInfo(const CommunicatorPtr &comm, const string &obj, const string &app, const string &server) -{ - _comm = comm; - if(!obj.empty()) - { - _nodePrx = _comm->stringToProxy(obj); - } - - _si.application = app; - _si.serverName = server; - _si.pid = TC_Port::getpid(); -} - -void TarsNodeFHelper::keepAlive(const string &adapter) -{ - try - { - if(_nodePrx) - { - set s; - { - TC_LockT lock(*this); - - _adapterSet.insert(adapter); - - if(adapter != "AdminAdapter") - { - return; - } - s.swap(_adapterSet); - } - ServerInfo si = _si; - set::const_iterator it = s.begin(); - while(it != s.end()) - { - si.adapter = *it; - _nodePrx->async_keepAlive(NULL,si); - ++it; - } - - } - } - catch(exception &ex) - { - TLOGERROR("TarsNodeFHelper::keepAlive error:" << ex.what() << endl); - } - catch(...) - { - TLOGERROR("TarsNodeFHelper::keepAlive unknown error" << endl); - } -} - -void TarsNodeFHelper::keepActiving() -{ - try - { - if(_nodePrx) - { - _nodePrx->async_keepActiving(NULL, _si); - } - } - catch(exception &ex) - { - LOG->error() << "TafNodeFHelper::keepAlive error:" << ex.what() << endl; - } - catch(...) - { - LOG->error() << "TafNodeFHelper::keepAlive unknown error" << endl; - } -} - -void TarsNodeFHelper::reportVersion(const string &version) -{ - try - { - if(_nodePrx) - { - _nodePrx->async_reportVersion(NULL, _si.application, _si.serverName, version); - } - } - catch(exception &ex) - { - TLOGERROR("TarsNodeFHelper::reportVersion error:" << ex.what() << endl); - } - catch(...) - { - TLOGERROR("TarsNodeFHelper::reportVersion unknown error" << endl); - } -} - -} - diff --git a/servant/libservant/TarsNotify.cpp b/servant/libservant/TarsNotify.cpp deleted file mode 100644 index bb267a63..00000000 --- a/servant/libservant/TarsNotify.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Tencent is pleased to support the open source community by making Tars available. - * - * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -#include "servant/TarsNotify.h" -#include "servant/Communicator.h" -#include "servant/TarsLogger.h" - -namespace tars -{ - -int TarsRemoteNotify::setNotifyInfo(const CommunicatorPtr &comm, const string &obj, const string & app, const string &serverName, const string &sSetName, const string &nodeName) -{ - _comm = comm; - if(!obj.empty()) - { - _notifyPrx = _comm->stringToProxy(obj); - _notifyPrx->tars_timeout(500); - } - - _setName = sSetName; - _app = app; - _serverName = serverName; - _nodeName = nodeName; - return 0; -} - -void TarsRemoteNotify::report(const string &sResult, bool bSync) -{ - try - { - if(_notifyPrx) - { - ReportInfo info; - info.sApp = _app; - info.sServer = _serverName; - info.sSet = _setName; - info.sThreadId = TC_Common::tostr(std::this_thread::get_id()); - info.sMessage = sResult; - info.sNodeName = _nodeName; - if(!bSync) - { - //_notifyPrx->async_reportServer(NULL, _app + "." + _serverName, TC_Common::tostr(std::this_thread::get_id()), sResult); - _notifyPrx->async_reportNotifyInfo(NULL, info); - } - else - { - //_notifyPrx->reportServer(_app + "." + _serverName, TC_Common::tostr(std::this_thread::get_id()), sResult); - _notifyPrx->reportNotifyInfo(info); - } - } - } - catch(exception &ex) - { - TLOGERROR("TarsRemoteNotify::report error:" << ex.what() << endl); - } - catch(...) - { - TLOGERROR("TarsRemoteNotify::report unknown error" << endl); - } -} - -void TarsRemoteNotify::notify(NOTIFYLEVEL level, const string &sMessage) -{ - try - { - if(_notifyPrx) - { - ReportInfo info; - // info.eType = 0; - info.sApp = _app; - info.sServer = _serverName; - info.sSet = _setName; - info.sThreadId = TC_Common::tostr(std::this_thread::get_id()); - info.sMessage = sMessage; - info.eLevel = level; - info.sNodeName = _nodeName; - //_notifyPrx->async_notifyServer(NULL, _app + "." + _serverName, level, sMessage); - _notifyPrx->async_reportNotifyInfo(NULL, info); - } - } - catch(exception &ex) - { - TLOGERROR("TarsRemoteNotify::notify error:" << ex.what() << endl); - } - catch(...) - { - TLOGERROR("TarsRemoteNotify::notify unknown error" << endl); - } -} - -void TarsRemoteNotify::report(const string &sMessage, const string & app, const string &serverName, const string &sNodeName) -{ - try - { - if(_notifyPrx) - { - ReportInfo info; - // info.eType = 0; - info.sApp = app; - info.sServer = serverName; - info.sSet = ""; - info.sMessage = sMessage; - info.sNodeName = sNodeName; - _notifyPrx->async_reportNotifyInfo(NULL, info); - } - } - catch(exception &ex) - { - TLOGERROR("TarsRemoteNotify::notify error:" << ex.what() << endl); - } - catch(...) - { - TLOGERROR("TarsRemoteNotify::notify unknown error" << endl); - } -} - -} - - diff --git a/servant/libservant/Transceiver.cpp b/servant/libservant/Transceiver.cpp index 9aafa40d..5876cc1e 100755 --- a/servant/libservant/Transceiver.cpp +++ b/servant/libservant/Transceiver.cpp @@ -17,7 +17,7 @@ #include "servant/Transceiver.h" #include "servant/AdapterProxy.h" #include "servant/Application.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" #include "servant/AuthLogic.h" #if TARS_SSL @@ -160,6 +160,7 @@ void Transceiver::setConnected() { _adapterProxy->getObjProxy()->getPushCallback()->onConnect(_ep.getEndpoint()); } + _adapterProxy->onConnect(); } void Transceiver::onConnect() @@ -181,6 +182,7 @@ void Transceiver::onConnect() _openssl->setReadBufferSize(1024 * 8); _openssl->setWriteBufferSize(1024 * 8); + _openssl->recvBuffer()->setConnection(this); int ret = _openssl->doHandshake(_sendBuffer); if (ret != 0) { @@ -212,7 +214,7 @@ void Transceiver::doAuthReq() if (_adapterProxy->endpoint().authType() == AUTH_TYPENONE) { _authState = AUTH_SUCC; - _adapterProxy->doInvoke(); + _adapterProxy->doInvoke(true); } else { @@ -284,7 +286,7 @@ void Transceiver::doAuthReq() // // if (ret == TC_NetWorkBuffer::PACKET_ERR) // { -// TLOGERROR("[TAF][tcp doResponse," << _pAdapterProxy->getObjProxy()->name() << ",fd:" << _iFd << "," << _ep.desc() << ",tcp recv decode error" << endl); +// TLOGERROR("[TARS][tcp doResponse," << _pAdapterProxy->getObjProxy()->name() << ",fd:" << _iFd << "," << _ep.desc() << ",tcp recv decode error" << endl); // msg->eStatus = ReqMessage::REQ_NET; // msg->response->sResultDesc = "recv packet decode failed"; // @@ -298,7 +300,7 @@ void Transceiver::doAuthReq() // } // catch (exception & ex) { // TLOGERROR( -// "[TAF][tcp doResponse," << _pAdapterProxy->getObjProxy()->name() << ",fd:" << _iFd << "," << _ep.desc() << ",tcp recv decode error:" << ex.what() << endl); +// "[TARS][tcp doResponse," << _pAdapterProxy->getObjProxy()->name() << ",fd:" << _iFd << "," << _ep.desc() << ",tcp recv decode error:" << ex.what() << endl); // msg->eStatus = ReqMessage::REQ_NET; // msg->response->sResultDesc = "recv packet decode failed"; // @@ -306,7 +308,7 @@ void Transceiver::doAuthReq() // } // catch (...) { // TLOGERROR( -// "[TAF][tcp doResponse," << _pAdapterProxy->getObjProxy()->name() << ",fd:" << _iFd << "," << _ep.desc() << ",tcp recv decode error." << endl); +// "[TARS][tcp doResponse," << _pAdapterProxy->getObjProxy()->name() << ",fd:" << _iFd << "," << _ep.desc() << ",tcp recv decode error." << endl); // msg->eStatus = ReqMessage::REQ_NET; // msg->response->sResultDesc = "recv packet decode failed"; // } @@ -323,7 +325,7 @@ void Transceiver::doAuthReq() void Transceiver::finishInvoke(shared_ptr &rsp) { - if (_authState != AUTH_SUCC) + if (_adapterProxy->endpoint().authType() == AUTH_TYPELOCAL && _authState != AUTH_SUCC) { std::string ret(rsp->sBuffer.begin(), rsp->sBuffer.end()); tars::AUTH_STATE tmp = AUTH_SUCC; @@ -336,7 +338,7 @@ void Transceiver::finishInvoke(shared_ptr &rsp) if (newstate == AUTH_SUCC) { // flush old buffered msg when auth is not complete - _adapterProxy->doInvoke(); + _adapterProxy->doInvoke(true); } else { @@ -406,7 +408,7 @@ void Transceiver::close() if(!isValid()) return; -#if TAF_SSL +#if TARS_SSL if (_openssl) { _openssl->release(); @@ -437,11 +439,11 @@ void Transceiver::close() if(second > 0) { _adapterProxy->getObjProxy()->getCommunicatorEpoll()->reConnect(TNOWMS + second * 1000, this); - TLOGERROR("[TAF][trans close:" << _adapterProxy->getObjProxy()->name() << "," << _ep.desc() << ", reconnect:" << second << "]" << endl); + TLOGERROR("[TARS][trans close:" << _adapterProxy->getObjProxy()->name() << "," << _ep.desc() << ", reconnect:" << second << "]" << endl); } // else // { -// TLOGERROR("[TAF][trans close:" << _adapterProxy->getObjProxy()->name() << "," << _ep.desc() << "]" << endl); +// TLOGERROR("[TARS][trans close:" << _adapterProxy->getObjProxy()->name() << "," << _ep.desc() << "]" << endl); // } } @@ -467,7 +469,7 @@ int Transceiver::doRequest() //取adapter里面积攒的数据 if(_sendBuffer.empty()) { - _adapterProxy->doInvoke(); + _adapterProxy->doInvoke(false); } //object里面应该是空的 @@ -939,7 +941,7 @@ UdpTransceiver::UdpTransceiver(AdapterProxy * pAdapterProxy, const EndpointInfo _pRecvBuffer = new char[DEFAULT_RECV_BUFFERSIZE]; if(!_pRecvBuffer) { - throw TC_Exception("objproxy '" + _adapterProxy->getObjProxy()->name() + "' malloc udp receive buffer fail"); + throw TC_Exception("obj: '" + _adapterProxy->getObjProxy()->name() + "' malloc udp receive buffer fail"); } } diff --git a/servant/makefile/makefile.tars b/servant/makefile/makefile.tars index 36a91bed..9a64ccb2 100644 --- a/servant/makefile/makefile.tars +++ b/servant/makefile/makefile.tars @@ -42,8 +42,8 @@ MYSQL_LIB_DIR += -L/usr/local/mysql/lib/mysql -L/usr/local/mysql/lib -L/usr/li LIB_DIR += ${MYSQL_LIB_DIR} INC_DIR += ${MYSQL_INC} -ifneq ($(_USE_OPENTRACKING), 0) -ifneq ($(_USE_OPENTRACKING), ) +ifneq ($(TARS_OPENTRACKING), 0) +ifneq ($(TARS_OPENTRACKING), ) OPENTRACKING_INC += -I/usr/local/include OPENTRACKING_LIB_DIR += -L/usr/local/lib LIB_DIR += ${OPENTRACKING_LIB_DIR} @@ -72,8 +72,8 @@ ifneq ($(TARS_HTTP2), ) endif endif -ifneq ($(_USE_OPENTRACKING), 0) -ifneq ($(_USE_OPENTRACKING), ) +ifneq ($(TARS_OPENTRACKING), 0) +ifneq ($(TARS_OPENTRACKING), ) #业务编译 CFLAGS += -D_USE_OPENTRACKING=1 LIB += -lopentracing -lzipkin_opentracing -lzipkin -lcurl diff --git a/servant/servant/AdapterProxy.h b/servant/servant/AdapterProxy.h index a2d11c55..21ff424e 100644 --- a/servant/servant/AdapterProxy.h +++ b/servant/servant/AdapterProxy.h @@ -26,7 +26,9 @@ #include "servant/Message.h" #include "servant/StatReport.h" #include -#ifdef _USE_OPENTRACKING +#include + +#ifdef TARS_OPENTRACKING #include #endif namespace tars @@ -52,14 +54,30 @@ class AdapterProxy /** * 调用server端对象方法 + * @param req + * @return int */ - int invoke(ReqMessage * msg); + int invoke(ReqMessage * msg); + +// /** +// * 同步阻塞调用server +// * @param msg +// * @return +// */ +// bool invoke_sync(ReqMessage * msg); + + /** + * + */ + void onConnect(); /** * 发送请求 * 发送挤压的数据 + * @param req + * @return */ - void doInvoke(); + void doInvoke(bool initInvoke); /** * server端的响应包返回 @@ -91,9 +109,9 @@ class AdapterProxy /** * 处理采样 */ - void sample(ReqMessage * msg); +// void sample(ReqMessage * msg); -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING /** * Zipkin调用链 */ @@ -169,6 +187,17 @@ class AdapterProxy */ inline int getId() const { return _id; } + /** + * + * @return + */ + inline Transceiver* getTransceiver() const { return _trans.get(); } + + /** + * 屏蔽结点 + */ + void onSetInactive(); + private: /** @@ -204,9 +233,31 @@ class AdapterProxy void merge(const StatMicMsgBody& inBody, StatMicMsgBody& outBody); /** - * 获取被调名 + * 连接串行模式 + * @param msg + * @return */ - string getSlaveName(const string& sSlaveName); + int invoke_connection_serial(ReqMessage * msg); + + /** + * 连接并行模式 + * @param msg + * @return + */ + int invoke_connection_parallel(ReqMessage * msg); + + void finishInvoke_serial(shared_ptr & rsp); + + void finishInvoke_parallel(shared_ptr & rsp); + + void doInvoke_serial(); + + void doInvoke_parallel(); + + /** + * 获取被调名 + */ + string getSlaveName(const string& sSlaveName); private: @@ -225,6 +276,11 @@ class AdapterProxy */ EndpointInfo _endpoint; + /** + * in request + */ + ReqMessage* _requestMsg = NULL; + /* * 收发包处理 */ @@ -315,20 +371,10 @@ class AdapterProxy */ map _statBody; - /* - * 最大采样次数 - */ - uint32_t _maxSampleCount; - - /* - * 采样比率 - */ - int _sampleRate; - /* * 调用链信息 */ -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING map> _spanMap; #endif int _id; diff --git a/servant/servant/AdminServant.h b/servant/servant/AdminServant.h index 5ba42262..3eec5083 100644 --- a/servant/servant/AdminServant.h +++ b/servant/servant/AdminServant.h @@ -22,7 +22,7 @@ namespace tars { -class TarsCurrent; +class Current; class Application; //////////////////////////////////////////////////////////////////////// diff --git a/servant/servant/AppCache.h b/servant/servant/AppCache.h index b58232c8..b974dc50 100644 --- a/servant/servant/AppCache.h +++ b/servant/servant/AppCache.h @@ -26,7 +26,7 @@ #include "util/tc_timeprovider.h" #include "util/tc_file.h" #include "util/tc_thread_mutex.h" -#include "servant/TarsLogger.h" +#include "servant/RemoteLogger.h" #define APPCACHE_ROOT_PATH "/cache" @@ -38,7 +38,7 @@ namespace tars /** * 缓存 */ -class AppCache : public TC_Singleton, public TC_ThreadMutex +class SVT_DLL_API AppCache : public TC_Singleton, public TC_ThreadMutex { public: AppCache() diff --git a/servant/servant/AppProtocol.h b/servant/servant/AppProtocol.h index c9a73ed1..c48241cc 100644 --- a/servant/servant/AppProtocol.h +++ b/servant/servant/AppProtocol.h @@ -143,6 +143,8 @@ class ProxyProtocol static vector http1Request(tars::RequestPacket& request, Transceiver *); static TC_NetWorkBuffer::PACKET_TYPE http1Response(TC_NetWorkBuffer &in, ResponsePacket& done); + // static vector httpJceRequest(taf::RequestPacket& request, Transceiver *); + // static TC_NetWorkBuffer::PACKET_TYPE httpJceResponse(TC_NetWorkBuffer &in, ResponsePacket& done); #if TARS_HTTP2 // ENCODE function, called by network thread diff --git a/servant/servant/Application.h b/servant/servant/Application.h index 66aca636..7980ab31 100644 --- a/servant/servant/Application.h +++ b/servant/servant/Application.h @@ -30,9 +30,9 @@ #include "servant/ServantHandle.h" #include "servant/StatReport.h" #include "servant/CommunicatorFactory.h" -#include "servant/TarsLogger.h" -#include "servant/TarsConfig.h" -#include "servant/TarsNotify.h" +#include "servant/RemoteLogger.h" +#include "servant/RemoteConfig.h" +#include "servant/RemoteNotify.h" #if TARS_SSL #include "util/tc_openssl.h" @@ -62,27 +62,28 @@ namespace tars #define TARS_CMD_CLOSE_CORE "tars.closecore" //设置服务的core limit: tars.setlimit [yes|no] #define TARS_CMD_RELOAD_LOCATOR "tars.reloadlocator" //重新加载locator的配置信息 #define TARS_CMD_RESOURCE "tars.resource" //get resource +#define TARS_CMD_VIEW_BID "tars.bid" //查看服务编译时间,build id ////////////////////////////////////////////////////////////////////// /** * 通知信息给notify服务, 展示在页面上 */ //上报普通信息 -#define TARS_NOTIFY_NORMAL(info) {TarsRemoteNotify::getInstance()->notify(NOTIFYNORMAL, info);} +#define TARS_NOTIFY_NORMAL(info) {RemoteNotify::getInstance()->notify(NOTIFYNORMAL, info);} //上报警告信息 -#define TARS_NOTIFY_WARN(info) {TarsRemoteNotify::getInstance()->notify(NOTIFYWARN, info);} +#define TARS_NOTIFY_WARN(info) {RemoteNotify::getInstance()->notify(NOTIFYWARN, info);} //上报错误信息 -#define TARS_NOTIFY_ERROR(info) {TarsRemoteNotify::getInstance()->notify(NOTIFYERROR, info);} +#define TARS_NOTIFY_ERROR(info) {RemoteNotify::getInstance()->notify(NOTIFYERROR, info);} //发送心跳给node 多个adapter分别上报 -#define TARS_KEEPALIVE(adapter) {TarsNodeFHelper::getInstance()->keepAlive(adapter);} +#define TARS_KEEPALIVE(adapter) {KeepAliveNodeFHelper::getInstance()->keepAlive(adapter);} //发送激活信息 -#define TARS_KEEPACTIVING {TarsNodeFHelper::getInstance()->keepActiving();} +#define TARS_KEEPACTIVING {KeepAliveNodeFHelper::getInstance()->keepActiving();} //发送TARS版本给node -#define TARS_REPORTVERSION(x) {TarsNodeFHelper::getInstance()->reportVersion(TARS_VERSION);} +#define TARS_REPORTVERSION(x) {KeepAliveNodeFHelper::getInstance()->reportVersion(TARS_VERSION);} ////////////////////////////////////////////////////////////////////// /** @@ -105,7 +106,7 @@ namespace tars /** * 服务基本信息 */ -struct ServerConfig +struct SVT_DLL_API ServerConfig { static std::string TarsPath; static std::string Application; //应用名称 @@ -139,6 +140,7 @@ struct ServerConfig static std::string Cert; static std::string Key; static bool VerifyClient; + static std::string Ciphers; #endif static map Context; //框架内部用, 传递节点名称(以域名形式部署时) }; @@ -326,7 +328,17 @@ class Application : public BaseNotify * * @return bool */ - bool cmdViewVersion(const string& command, const string& params, string& result); + bool cmdViewVersion(const string &command, const string ¶ms, string &result); + + /** + * 查看服务的buildid(编译时间) + * @param command + * @param params + * @param result + * + * @return bool + */ + bool cmdViewBuildID(const string &command, const string ¶ms, string &result); /** * 使配置文件的property信息生效 diff --git a/servant/servant/Communicator.h b/servant/servant/Communicator.h index efa02534..3d232d63 100644 --- a/servant/servant/Communicator.h +++ b/servant/servant/Communicator.h @@ -26,8 +26,8 @@ #include "servant/ObjectProxyFactory.h" #include "servant/AsyncProcThread.h" #include "servant/CommunicatorEpoll.h" -#include "servant/TarsLogger.h" -#ifdef _USE_OPENTRACKING +#include "servant/RemoteLogger.h" +#ifdef TARS_OPENTRACKING #include "zipkin/opentracing.h" #include "zipkin/tracer.h" #include "zipkin/ip_address.h" @@ -77,10 +77,11 @@ struct ClientConfig /** * 通信器,用于创建和维护客户端proxy */ -class Communicator : public TC_HandleBase, public TC_ThreadRecMutex +class SVT_DLL_API Communicator : public TC_HandleBase, public TC_ThreadRecMutex { public: + typedef std::function custom_callback; /** * 构造函数 */ @@ -195,6 +196,11 @@ class Communicator : public TC_HandleBase, public TC_ThreadRecMutex */ string getServantProperty(const string &sObj, const string& name); + /** + * 设置自动回调对象 + */ + void setServantCustomCallback(const string &sObj, custom_callback callback); + /** * 上报统计 * @return StatReport* @@ -218,12 +224,12 @@ class Communicator : public TC_HandleBase, public TC_ThreadRecMutex */ vector getEndpoint(const string & objName); - /** - * 获取obj对应可用ip port列表 包括所有IDC的 - * @param sObjName - * @return vector - */ - vector getEndpoint4All(const string & objName); + /** + * 获取obj对应可用ip port列表 包括所有IDC的 + * @param sObjName + * @return vector + */ + vector getEndpoint4All(const string& objName); /** * 结束 @@ -244,7 +250,7 @@ class Communicator : public TC_HandleBase, public TC_ThreadRecMutex * get resource info * @return */ - string getResouresInfo(); + string getResourcesInfo(); protected: /** @@ -376,6 +382,16 @@ class Communicator : public TC_HandleBase, public TC_ThreadRecMutex unordered_map> _objCtx; #endif + /** + * + */ + TC_SpinLock _callbackLock; + + /** + * callback + */ + unordered_map _callback; + /* * 异步线程数组 */ @@ -396,7 +412,7 @@ class Communicator : public TC_HandleBase, public TC_ThreadRecMutex */ size_t _asyncSeq = 0; -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING public: struct TraceManager:public TC_HandleBase{ zipkin::ZipkinOtTracerOptions _zipkin_options; diff --git a/servant/servant/CommunicatorEpoll.h b/servant/servant/CommunicatorEpoll.h index bfc5f7fb..12742b55 100644 --- a/servant/servant/CommunicatorEpoll.h +++ b/servant/servant/CommunicatorEpoll.h @@ -65,13 +65,9 @@ struct FDInfo } size_t iSeq; - - int fd; - - int iType; - + int fd; + int iType; void * p; - TC_Epoller::NotifyInfo notify; }; @@ -82,6 +78,7 @@ struct FDInfo class CommunicatorEpoll : public TC_Thread ,public TC_ThreadRecMutex { public: + /** * 构造函数 */ @@ -190,7 +187,7 @@ class CommunicatorEpoll : public TC_Thread ,public TC_ThreadRecMutex * communicator resource desc * @return */ - string getResouresInfo(); + string getResourcesInfo(); protected: /** diff --git a/servant/servant/EndpointManager.h b/servant/servant/EndpointManager.h index 84e9e745..0ce8e9fa 100644 --- a/servant/servant/EndpointManager.h +++ b/servant/servant/EndpointManager.h @@ -33,8 +33,8 @@ namespace tars enum GetEndpointType { E_DEFAULT = 0, - E_ALL = 1, - E_SET = 2, + E_ALL = 1, + E_SET = 2, E_STATION = 3 }; @@ -129,9 +129,9 @@ class QueryEpBase : public QueryFPrxCallback */ virtual void doNotify() = 0; - /* - * 设置主控的代理 - */ + /* + * 设置主控的代理 + */ int setLocatorPrx(QueryFPrx prx); /* @@ -168,7 +168,7 @@ class QueryEpBase : public QueryFPrxCallback /* * 主控的请求的响应到了,做相应的处理 */ - void doEndpoints(const vector& activeEp, const vector& inactiveEp, int iRet, bool bSync = false); + void doEndpoints(const vector& activeEp, const vector& inactiveEp, int iRet, bool bSync = false); /* * 请求主控异常,做相应的处理 @@ -246,6 +246,11 @@ class QueryEpBase : public QueryFPrxCallback */ set _inactiveEndpoints; + /** + * 是否是root servant + */ + bool _rootServant; + private: /////////以下是请求主控的策略信息///////////////// @@ -334,7 +339,14 @@ class EndpointManager : public QueryEpBase */ void notifyEndpoints(const set & active, const set & inactive, bool bSync = false); - /* + /** + * 更新 + * @param active + * @param inactive + */ + void updateEndpoints(const set & active, const set & inactive); + + /* * 重写基类的实现 */ void doNotify(); diff --git a/servant/servant/Global.h b/servant/servant/Global.h index 89073b25..30a7e13c 100755 --- a/servant/servant/Global.h +++ b/servant/servant/Global.h @@ -50,7 +50,7 @@ class AdapterProxy; class ServantProxy; class ServantProxyCallback; class ObjectProxy; -class TarsCurrent; +class Current; class FDReactor; class Transceiver; class StatFProxy; @@ -58,19 +58,27 @@ class StatReport; class ServantProxyFactory; class ObjectProxyFactory; class AsyncProcThread; +class LocalRollLogger; +class RemoteConfig; +class RemoteTimeLogger; +class RemoteNotify; typedef TC_AutoPtr CommunicatorPtr; typedef TC_AutoPtr ServantPrx; typedef TC_AutoPtr ServantProxyCallbackPtr; typedef TC_AutoPtr ObjectPrx; -typedef TC_AutoPtr TarsCurrentPtr; +typedef TC_AutoPtr CurrentPtr; typedef TC_AutoPtr StatFPrx; typedef TC_AutoPtr StatReportPtr; typedef TC_AutoPtr FDReactorPtr; -// typedef TC_AutoPtr ServantProxyFactoryPtr; -//typedef TC_AutoPtr ObjectProxyFactoryPtr; typedef TC_AutoPtr AsyncProcThreadPtr; +typedef CurrentPtr TarsCurrentPtr; +typedef RemoteConfig TarsRemoteConfig; +typedef RemoteNotify TarsRemoteNotify; +typedef LocalRollLogger TarsRollLogger; +typedef RemoteTimeLogger TarsTimeLogger; + ////////////////////////////////////////////////////////////// /** * 定义TARS网络调用的异常基类 diff --git a/servant/servant/Message.h b/servant/servant/Message.h index d906a12f..ee922c8b 100644 --- a/servant/servant/Message.h +++ b/servant/servant/Message.h @@ -49,8 +49,8 @@ struct CheckTimeoutInfo , frequenceFailInvoke(5) , minFrequenceFailTime(5) , radio(0.5) - , tryTimeInterval(30) - , maxConnectExc(5) + , tryTimeInterval(10) + , maxConnectExc(1) { } @@ -90,61 +90,6 @@ struct CheckTimeoutInfo uint32_t maxConnectExc; }; -///////////////////////////////////////////////////////////////////////// -/* - * stat采样信息(用于调用链时序分析) - */ -struct SampleKey -{ - /* - * 构造函数 - */ - SampleKey() - : _root(true) - , _unid("") - , _depth(0) - , _width(0) - , _parentWidth(0) - {} - - /* - * 初始化 - */ - void init() - { - _root = true; - _unid.clear(); - _depth = 0; - _width = 0; - _parentWidth = 0; - } - - /* - * 是否根节点 在根节点产生唯一id - */ - bool _root; - - /* - * 唯一id - */ - string _unid; - - /* - * 深度 - */ - int _depth; - - /* - * 广度 - */ - int _width; - - /* - * 父节点广度值 - */ - int _parentWidth; -}; - ///////////////////////////////////////////////////////////////////////// /** * 用于同步调用时的条件变量 @@ -211,6 +156,11 @@ struct ReqMessage : public TC_HandleBase */ ~ReqMessage() { + if(deconstructor) + { + deconstructor(); + } + if(pMonitor != NULL) { delete pMonitor; @@ -263,6 +213,7 @@ struct ReqMessage : public TC_HandleBase ObjectProxy * pObjectProxy; //调用端的proxy对象 RequestPacket request; //请求消息体 + std::function deconstructor; //析构时调用 shared_ptr response; //响应消息体 // string sReqData; //请求消息体 shared_ptr sReqData; //请求消息体 @@ -289,7 +240,7 @@ struct ReqMessage : public TC_HandleBase uint32_t iCoroId; //协程的id -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING std::unordered_map trackInfoMap; //调用链信息 #endif @@ -299,7 +250,6 @@ struct ReqMessage : public TC_HandleBase typedef TC_AutoPtr ReqMessagePtr; typedef TC_LoopQueue ReqInfoQueue; -#define HTTP2 "http2" } diff --git a/servant/servant/NotifyObserver.h b/servant/servant/NotifyObserver.h index ab917236..2d3ca15d 100644 --- a/servant/servant/NotifyObserver.h +++ b/servant/servant/NotifyObserver.h @@ -18,7 +18,7 @@ #define __TARS_NOTIFY_OBSERVER_H_ #include "servant/Global.h" -#include "servant/TarsCurrent.h" +#include "servant/Current.h" #include "util/tc_singleton.h" namespace tars diff --git a/servant/servant/ObjectProxy.h b/servant/servant/ObjectProxy.h index 0a9502e1..d797375c 100644 --- a/servant/servant/ObjectProxy.h +++ b/servant/servant/ObjectProxy.h @@ -87,6 +87,19 @@ class ObjectProxy : public TC_HandleBase, public TC_ThreadMutex */ void doInvoke(); + /** + * + * @param adapterProxy + */ +// void doInvoke(AdapterProxy *adapterProxy); + + /** + * + * @param active + * @param inactive + */ + void onNotifyEndpoints(const set & active,const set & inactive); + /** * 设置协议解析器 * @return UserProtocol& @@ -121,10 +134,13 @@ class ObjectProxy : public TC_HandleBase, public TC_ThreadMutex ServantProxyCallbackPtr getPushCallback(); /** - * 获取所有的adapter + * connected */ - // const vector & getAdapters() const; + void onConnect(AdapterProxy *adapterProxy); + /** + * 获取所有的adapter + */ void mergeStat(map & mStatMicMsg); /** @@ -132,14 +148,6 @@ class ObjectProxy : public TC_HandleBase, public TC_ThreadMutex */ void doTimeout(); -// /** -// * Obj的超时队列的长度 -// */ -// size_t timeoutQSize() -// { -// return _reqTimeoutQueue.size(); -// } -// /** * 获取CommunicatorEpoll* */ @@ -157,6 +165,24 @@ class ObjectProxy : public TC_HandleBase, public TC_ThreadMutex return _name; } + /** + * address + * @return + */ + inline const string &hash() const + { + return _hash; + } + + /** + * address + * @return + */ + inline const string &address() const + { + return _address; + } + /** * reconnect * @param second @@ -233,18 +259,34 @@ class ObjectProxy : public TC_HandleBase, public TC_ThreadMutex _servantProxy = pServantProxy; } + /** + * + * @return + */ + inline EndpointManager* getEndpointManager() + { + return _endpointManger.get(); + } + /** * get all adapter proxy * @return */ const vector & getAdapters(); + /** + * + * @param ep + */ + void onSetInactive(const EndpointInfo& ep); + protected: - /** - * 处理请求异常 - */ - void doInvokeException(ReqMessage * msg); + /** + * 处理请求异常 + * + */ + void doInvokeException(ReqMessage * msg); private: /* @@ -253,10 +295,22 @@ class ObjectProxy : public TC_HandleBase, public TC_ThreadMutex CommunicatorEpoll * _communicatorEpoll; /* - * object的名称 + * [obname]#hash@tcp -h xxxx -p xxx */ string _name; + /** + * obname#[hash]@tcp -h xxxx -p xxx + * ever hash has one connection + */ + string _hash; + + /** + * obname#hash@[tcp -h xxxx -p xxx] + * ever hash has one connection + */ + string _address; + /* * 按set规则调用的set名称 */ @@ -268,7 +322,7 @@ class ObjectProxy : public TC_HandleBase, public TC_ThreadMutex bool _isInvokeBySet; /* - * 是否调用了tars_set_protocol设置过proxy的协议函数, + * 是否调用了taf_set_protocol设置过proxy的协议函数, * 设置过了就不在设置 */ bool _hasSetProtocol; diff --git a/servant/servant/PropertyReport.h b/servant/servant/PropertyReport.h index 6705ebdb..6674c70a 100755 --- a/servant/servant/PropertyReport.h +++ b/servant/servant/PropertyReport.h @@ -19,7 +19,7 @@ #include "util/tc_lock.h" #include "util/tc_autoptr.h" -//#include "util/tc_thread_mutex.h" +#include "util/tc_thread_mutex.h" #include "util/tc_spin_lock.h" #include #include @@ -80,7 +80,7 @@ class PropertyReport : public TC_HandleBase string get(); void set(int o) { _sum += o;++_count; } protected: - void clear() { _sum = 0; _count = 0; } + void clear() { _sum = 0; _count = 0; } private: int _sum; int _count; @@ -170,7 +170,7 @@ typedef TC_AutoPtr PropertyReportPtr; */ template -class PropertyReportImp : public PropertyReport, public TC_SpinLock +class PropertyReportImp : public PropertyReport, public TC_ThreadMutex { public: using PropertyReportData = std::tuple; @@ -195,7 +195,7 @@ class PropertyReportImp : public PropertyReport, public TC_SpinLock */ void report(int iValue) override { - TC_LockT lock(*this); + TC_LockT lock(*this); Helper::value>::Report(*this, iValue); } @@ -207,7 +207,7 @@ class PropertyReportImp : public PropertyReport, public TC_SpinLock */ vector > get() override { - TC_LockT lock(*this); + TC_LockT lock(*this); return Helper::value>::Get(*this); } diff --git a/servant/servant/Servant.h b/servant/servant/Servant.h index 91cb1abd..41f6160a 100644 --- a/servant/servant/Servant.h +++ b/servant/servant/Servant.h @@ -22,7 +22,7 @@ #include "util/tc_thread_pool.h" #include "util/tc_cas_queue.h" #include "servant/ServantProxy.h" -#include "servant/TarsCurrent.h" +#include "servant/Current.h" #include "servant/BaseNotify.h" namespace tars @@ -250,7 +250,7 @@ class ServantCallback : public ServantProxyCallback ServantPtr _servant; /* - * TarsCurrent + * Current */ TarsCurrentPtr _current; }; diff --git a/servant/servant/ServantHandle.h b/servant/servant/ServantHandle.h index d719c077..3dca3771 100644 --- a/servant/servant/ServantHandle.h +++ b/servant/servant/ServantHandle.h @@ -27,7 +27,7 @@ #include "servant/Servant.h" #include "servant/StatReport.h" #include "servant/CoroutineScheduler.h" -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING #include "opentracing/span.h" #endif @@ -58,10 +58,10 @@ class ServantHandle : public TC_EpollServer::Handle */ ~ServantHandle(); - /** - * 线程处理方法 - */ - virtual void run(); + /** + * 线程处理方法 + */ + virtual void run(); /** * 获取协程调度器 @@ -136,14 +136,14 @@ class ServantHandle : public TC_EpollServer::Handle /** * 创建上下文 * @param stRecvData - * @return TarsCurrent* + * @return Current* */ TarsCurrentPtr createCurrent(const shared_ptr &data); /** * 创建闭连接时的关上下文 * @param stRecvData - * @return TarsCurrent* + * @return Current* */ TarsCurrentPtr createCloseCurrent(const shared_ptr &data); @@ -161,14 +161,8 @@ class ServantHandle : public TC_EpollServer::Handle */ void handleNoTarsProtocol(const TarsCurrentPtr ¤t); - /** - * 处理TARS下的采样统计逻辑 - * - * @param current - */ - void processSample(const TarsCurrentPtr ¤t); -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING /** * 处理TARS下的调用链逻辑 * @@ -211,7 +205,7 @@ class ServantHandle : public TC_EpollServer::Handle */ CoroutineScheduler *_coroSched; -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING map> _spanMap; #endif }; diff --git a/servant/servant/ServantHelper.h b/servant/servant/ServantHelper.h index eae8c24b..1e64461b 100644 --- a/servant/servant/ServantHelper.h +++ b/servant/servant/ServantHelper.h @@ -56,7 +56,7 @@ struct ServantCreation : public ServantHelperCreation /** * Servant管理 */ -class ServantHelperManager : public TC_Singleton +class SVT_DLL_API ServantHelperManager : public TC_Singleton { public: /** @@ -77,8 +77,8 @@ class ServantHelperManager : public TC_Singleton { if(check && _servant_adapter.end() == _servant_adapter.find(id)) { - cerr<<"[TAF]ServantHelperManager::addServant "<< id <<" not find adapter.(maybe not conf in the web)"<(application); } @@ -188,7 +188,7 @@ class ServantHelperManager : public TC_Singleton /** * 是否染色 */ - bool _isDyeing; + bool _isDyeing; /** * 染色用户号码 diff --git a/servant/servant/ServantProxy.h b/servant/servant/ServantProxy.h index 1bc6c661..ad961511 100644 --- a/servant/servant/ServantProxy.h +++ b/servant/servant/ServantProxy.h @@ -21,7 +21,7 @@ #include "util/tc_autoptr.h" #include "servant/Message.h" #include "servant/AppProtocol.h" -#include "servant/TarsCurrent.h" +#include "servant/Current.h" //#include "servant/EndpointInfo.h" #include "servant/CommunicatorEpoll.h" @@ -148,7 +148,7 @@ class ServantProxyThreadData * objectProxy Pointer */ shared_ptr _objectProxyOwn; //保存ObjectProxy对象的指针数组 -#ifdef _USE_OPENTRACKING +#ifdef TARS_OPENTRACKING std::unordered_map _trackInfoMap; #endif @@ -264,6 +264,12 @@ class ServantProxyCallback : virtual public TC_HandleBase */ virtual ~ServantProxyCallback() {} + /** + * 设置发起调用的servant + * @param prx + */ + void setServantPrx(const ServantPrx &prx) { _servantPrx = prx; } + /** * 获取类型 * @return const string& @@ -288,7 +294,7 @@ class ServantProxyCallback : virtual public TC_HandleBase /** * 异步请求是否在网络线程处理 - * tars内部用的到 业务不能设置这个值 + * taf内部用的到 业务不能设置这个值 * */ inline void setNetThreadProcess(bool bNetThreadProcess) { @@ -301,23 +307,32 @@ class ServantProxyCallback : virtual public TC_HandleBase } public: + /** + * dispatch, call onDispatch + * @param msg + * @return + */ + int dispatch(ReqMessagePtr msg); + +protected: /** * 异步回调对象实现该方法,进行业务逻辑处理 * @param msg * @return int */ - virtual int onDispatch(ReqMessagePtr ptr) = 0; + virtual int onDispatch(ReqMessagePtr msg) = 0; /** - * 连接关闭掉了(只对PUSH callback生效) + * 连接关闭掉了(push callback 才有效) */ virtual void onClose(){}; /** - * 连接已建立(只对PUSH callback生效) + * 连接已建立(push callback 才有效) */ virtual void onConnect(const TC_Endpoint &ep){}; + friend class Transceiver; protected: /** @@ -334,18 +349,20 @@ class ServantProxyCallback : virtual public TC_HandleBase /** * 协程并行请求的共享智能指针 */ - tars::CoroParallelBasePtr _pPtr; + CoroParallelBasePtr _pPtr; + + /** + * servant prx + */ + ServantPrx _servantPrx; }; /////////////////////////////////////////////////////////////////////////////////////////////// // for http class HttpCallback : public TC_HandleBase { public: - virtual int onHttpResponse(const std::map& requestHeaders , - const std::map& responseHeaders , - const std::vector& rspBody) = 0; - virtual int onHttpResponseException(const std::map& requestHeaders, - int expCode) = 0; + virtual int onHttpResponse(const shared_ptr &rsp) = 0; + virtual int onHttpResponseException(int expCode) = 0; }; typedef TC_AutoPtr HttpCallbackPtr; @@ -411,7 +428,7 @@ class ServantProxy : public TC_HandleBase, public TC_ThreadMutex static string STATUS_TRACK_KEY; //track信息 - static string STATUS_COOKIE; //cookie信息 + // static string STATUS_COOKIE; //cookie信息 /** * 缺省的同步调用超时时间 @@ -419,6 +436,23 @@ class ServantProxy : public TC_HandleBase, public TC_ThreadMutex */ enum { DEFAULT_SYNCTIMEOUT = 3000, DEFAULT_ASYNCTIMEOUT=5000}; + /** + * default connection serial num + */ + const static int DEFAULT_CONNECTION_SERIAL = 10; + + /** + * 内置四种协议支持 + */ + enum SERVANT_PROTOCOL + { + PROTOCOL_TARS, //默认tars服务的协议 + PROTOCOL_HTTP1, //http协议 +#if TARS_HTTP2 + PROTOCOL_HTTP2, //http2协议 +#endif + }; + /** * 构造函数 * @param op @@ -528,19 +562,48 @@ class ServantProxy : public TC_HandleBase, public TC_ThreadMutex */ string tars_name() const; + /** + * 获取所属的Object名称#hash@address + * @return string + */ + string tars_full_name() const; + /** * 获取最近一次调用的IP地址和端口 * @return string */ static TC_Endpoint tars_invoke_endpoint(); + /** + * 设置连接为多连接, 串行模式 + * @param connectionSerial, <=0: 连接复用模式(一个连接上同时跑多个请求, 响应包), >0: 连接串行模式(连接个数), 同一个连接上并行只能跑一个包(http协议) + */ + void tars_connection_serial(int connectionSerial); + + /** + * 获取连接并发模式 + * @return int + */ + int tars_connection_serial() const; + + /** + * 直接设置内置支持的协议 + */ + void tars_set_protocol(SERVANT_PROTOCOL protocol, int connectionSerial = 0); + /** * 设置用户自定义协议 * @param protocol */ - void tars_set_protocol(const ProxyProtocol& protocol); + void tars_set_protocol(const ProxyProtocol& protocol, int connectionSerial = 0); /** + * get protocol + * @return + */ + ProxyProtocol tars_get_protocol(); + + /** *设置套接字选项 */ void tars_set_sockopt(int level, int optname, const void *optval, SOCKET_LEN_TYPE optlen); @@ -643,28 +706,19 @@ class ServantProxy : public TC_HandleBase, public TC_ThreadMutex // std::map& rheaders, // std::string& rbody); - /** - * http2协议同步远程调用 - */ - void http_call(const std::string& method, - const std::string& uri, - const std::map& headers, - const std::string& body, - std::map& rheaders, - std::string& rbody); - /** - * http2协议异步远程调用 - */ - void http_call_async(const std::string& method, - const std::string& uri, - const std::map& headers, - const std::string& body, - const HttpCallbackPtr &cb); + /** + * http1/2协议同步远程调用 + * @param funcName: 调用名称, 这里只是做统计用 + */ + void http_call(const string &funcName, shared_ptr &request, shared_ptr &response); - /** - * 在RequestPacket中的context设置主调信息标识 - */ - virtual void tars_setMasterFlag(bool bMasterFlag) {_masterFlag = bMasterFlag;} + /** + * http1/2协议异步远程调用 + * @param funcName: 调用名称, 这里只是做统计用 + */ + void http_call_async(const string &funcName, shared_ptr &request, const HttpCallbackPtr &cb, bool bCoro = false); + +protected: /** * TARS协议同步方法调用 @@ -686,6 +740,14 @@ class ServantProxy : public TC_HandleBase, public TC_ThreadMutex const ServantProxyCallbackPtr& callback, bool bCoro = false); + /** + * 获得可以复用的servant + * @return + */ + ServantPrx getServantPrx(ReqMessage *msg); + + friend class ServantProxyCallback; + private: /** * 远程方法调用 @@ -694,6 +756,13 @@ class ServantProxy : public TC_HandleBase, public TC_ThreadMutex */ void invoke(ReqMessage *msg, bool bCoroAsync = false); + /** + * 选择某个servant来发送 + * @param msg + * @param bCoroAsync + */ + int servant_invoke(ReqMessage *msg, bool bCoroAsync); + // /** // * invoke 异步 // * @param msg @@ -724,6 +793,17 @@ class ServantProxy : public TC_HandleBase, public TC_ThreadMutex */ void checkDye(RequestPacket& req); + /** + * 更新endpoint + * @param active + * @param inactive + */ + void onNotifyEndpoints(const set & active,const set & inactive); + + /** + * 端口不活跃 + */ + void onSetInactive(const EndpointInfo& ep); /** * 检查是否需要设置cookie * @param req @@ -737,29 +817,29 @@ class ServantProxy : public TC_HandleBase, public TC_ThreadMutex /** * 通信器 */ - Communicator * _communicator; + Communicator * _communicator; /** * 保存ObjectProxy对象的指针数组 */ - ObjectProxy ** _objectProxy; //保存ObjectProxy对象的指针数组 - shared_ptr _objectProxyOwn; //保存ObjectProxy对象的指针数组 + ObjectProxy ** _objectProxy; //保存ObjectProxy对象的指针数组 + shared_ptr _objectProxyOwn; //保存ObjectProxy对象的指针数组 /** * ObjectProxy对象的个数,其个数由客户端的网络线程数决定, * 每个网络线程有一个ObjectProxy */ - size_t _objectProxyNum; + size_t _objectProxyNum; /** * 同步调用超时(毫秒) */ - int _syncTimeout; + int _syncTimeout; /** * 同步调用超时(毫秒) */ - int _asyncTimeout; + int _asyncTimeout; /** * 唯一id @@ -780,6 +860,31 @@ class ServantProxy : public TC_HandleBase, public TC_ThreadMutex *最小的超时时间 */ int64_t _minTimeout; + + /** + * 最大连接串行数(默认0, 表示连接并行请求) + */ + int _connectionSerial = 0; + + /** + * 短连接使用http使用 + */ + ServantPrx _rootPrx; + + /** + * + */ + int _servantId = 0; + + /** + * + */ + std::mutex _servantMutex; + + /** + * + */ + vector _servantList; }; } #endif diff --git a/servant/servant/StatReport.h b/servant/servant/StatReport.h index 171ebf34..fe89b89a 100644 --- a/servant/servant/StatReport.h +++ b/servant/servant/StatReport.h @@ -42,6 +42,11 @@ namespace tars { +/** + * 状态上报类, 上报的信息包括: + * 1 模块间调用的信息 + * 2 业务自定义的属性统计 + */ struct StatSampleMsgHead { string slaveName; diff --git a/servant/servant/TarsConfig.h b/servant/servant/TarsConfig.h deleted file mode 100644 index 09b4a5af..00000000 --- a/servant/servant/TarsConfig.h +++ /dev/null @@ -1,154 +0,0 @@ -/** - * Tencent is pleased to support the open source community by making Tars available. - * - * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -#ifndef __TARS_CONFIG_H_ -#define __TARS_CONFIG_H_ - -#include "util/tc_autoptr.h" -#include "util/tc_singleton.h" -#include "servant/Global.h" -#include "servant/ConfigF.h" - -using namespace std; - -namespace tars -{ - -/** - * - * 功能:获取远程系统配置,生成本地文件,支持备份和回滚 - * - * 说明:该对象只实现将ConfigServer上指定的配置文件 - * 读取到本地(保存到应用程序执行目录),具体配置解析 - * 由客户端实现 - * - * 客户端通过调用addConfig接口为 - * 每个配置文件创建一个TarsRemoteConfig实例 - * - * 备份文件数目在对象创建时指定,缺省为5个, - * 能回滚的次数等于备份文件数目 - * - */ - -class TarsRemoteConfig : public TC_Singleton -{ -public: - /** - * 初始化 - * @param comm, 通信器 - * @param obj, 对象名称 - * @param app, 应用名称 - * @param serverName, 服务名称 - * @param basePath, 基本路径 - * @param maxBakNum, 最大备份文件个数 - * - * @return int - */ - int setConfigInfo(const CommunicatorPtr &comm, const string &obj, const string & app, const string &serverName, const string& basePath,const string& setdivision="",int maxBakNum = 5); - - /** - * 读取ConfigServer上配置文件到本地,并备份原文件 - * @param sFullFileName 文件名称 - * @param result 结果 - * @param bAppOnly 是否只获取应用级别的配置 - * - * @return bool - */ - bool addConfig(const string & filename, string &result, bool bAppConfigOnly = false); - -private: - /** - * 实现请求ConfigServer并将结果以文件形式保存到本地目录 - * @param sFullFileName 文件名称 - * @param bAppOnly 是否只获取应用级别的配置 - * - * @return string 生成的文件名称 - */ - string getRemoteFile(const string & sFullFileName, bool bAppConfigOnly = false); - - /** - * 实现本地文件的回滚,可回滚次数等于最大备份文件数,每次 - * 都使用最近的备份文件覆盖当前配置文件 - * - * @return string - */ - string recoverSysConfig(const string & sFullFileName); - - /** - * 备份文件名称 Config.conf.1.bak,Config.conf.2.bak ... - * 该方法提供下标到文件名的转化 - * - * @param index 第几个备份文件 - * - * @return string 配置文件全路径 - */ - inline string index2file(const string & sFullFileName, int index); - - /** - * rename系统操作的封装,当oldFile不存在时抛出异常 - * - * @param oldFile 原文件路径和名称 - * @param newFile 新文件逻辑和名称 - */ - inline void localRename(const string& oldFile, const string& newFile); - -protected: - - /** - * 通信器 - */ - CommunicatorPtr _comm; - - /** - * 配置代理 - */ - ConfigPrx _configPrx; - - /** - * 应用 - */ - string _app; - - /** - * 服务名称 - */ - string _serverName; - - /** - * 路径 - */ - string _basePath; - - /** - * set信息 - */ - - string _setdivision; - - /** - * 最大备份数 - */ - int _maxBakNum; - - /** - * 线程锁 - */ - TC_ThreadMutex _mutex; -}; - -} - -#endif diff --git a/servant/servant/TarsCookie.h b/servant/servant/TarsCookie.h deleted file mode 100644 index da2a6451..00000000 --- a/servant/servant/TarsCookie.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Tencent is pleased to support the open source community by making Tars available. - * - * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -#ifndef __TARS_COOKIE_H__ -#define __TARS_COOKIE_H__ - - -/** - * cookie操作类 - */ -class TarsCookieOp -{ -public: - /** - * 构造函数 - */ - TarsCookieOp() - { - } - - /** - * 析构函数,清理掉已设置的cookie - */ - ~TarsCookieOp() - { - ServantProxyThreadData * td = ServantProxyThreadData::getData(); - assert(NULL != td); - if (td) - { - td->_cookie.clear(); - } - } - - /** - * 获取cookie - */ - static map & getCookie() - { - ServantProxyThreadData * td = ServantProxyThreadData::getData(); - assert(NULL != td); - - return td->_cookie; - } - - /** - * 设置cookie - */ - void setCookie(const map &cookie) - { - ServantProxyThreadData * td = ServantProxyThreadData::getData(); - assert(NULL != td); - if(td) - { - td->_cookie = cookie; - } - } -}; - -#endif \ No newline at end of file diff --git a/servant/servant/TarsCurrent.h b/servant/servant/TarsCurrent.h deleted file mode 100644 index 3150c629..00000000 --- a/servant/servant/TarsCurrent.h +++ /dev/null @@ -1,330 +0,0 @@ -/** - * Tencent is pleased to support the open source community by making Tars available. - * - * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -#ifndef __TARS_CURRENT_H_ -#define __TARS_CURRENT_H_ - -#include "util/tc_epoll_server.h" -#include "tup/RequestF.h" -#include "tup/tup.h" -#include "servant/BaseF.h" - -namespace tars -{ - -class ServantHandle; - -////////////////////////////////////////////////////////////// -/** - * 当前请求的上下文 - */ -class TarsCurrent : public TC_HandleBase -{ -public: - typedef std::map TARS_STATUS; - - typedef std::vector TARS_BUFFER; - - /** - * 构造函数 - * @param pServantHandle - */ - TarsCurrent(ServantHandle *pServantHandle); - - /** - * 析构 - */ - ~TarsCurrent(); - - /** - * 获取IP - * @return string - */ - const string &getIp() const; - - /** - * get host name - * @return - */ - const string &getHostName() const; - - /** - * 获取端口 - * @return int - */ - int getPort() const; - - /** - * 获取uid - * @return uint32 - */ - uint32_t getUId() const; - - /** - * 获取fd - * @return int - */ - int getFd() const { return _data->fd(); } - - /** - * 是否函数返回时发送响应包给客户端 - * @return bool - */ - bool isResponse() const; - - /** - * 设置连接的关闭类型,详情参看TC_EpollServer::EM_CLOSE_T - */ - void setCloseType(int type); - - /** - * 获取连接关闭类型,详情请参考TC_EpollServer::EM_CLOSE_T类型 - */ - int getCloseType() const; - - /** - * 设置是否自动回响应包 - */ - void setResponse(bool value) { _response = value; } - - /** - * 设置返回的context(仅TARS协议有效) - */ - void setResponseContext(const map & context){_responseContext = context;} - - /** - * 获取返回的context(仅TARS协议有效) - */ - const map & getResponseContext() const {return _responseContext;} - - /** - * 关闭当前连接 - */ - void close(); - - /** - * 获取所属的ServantHandle - */ - ServantHandle* getServantHandle(); - - /** - * 获取来源的Adapter - * @return TC_EpollServer::BindAdapter* - */ - TC_EpollServer::BindAdapter* getBindAdapter(); - - /** - * 获取请求buffer - * @return string - */ - const vector &getRequestBuffer() const; - - /** - * 获取服务Servant名称 - * @return string - */ - string getServantName() const; - - /** - * 请求的协议的版本号(仅TARS协议有效) - * - * @return short - */ - short getRequestVersion() const; - - /** - * 扩展map(仅TARS协议有效) - * @return map& - */ - map& getContext(); - - /** - * 获取保存状态信息,比如染色等(仅TARS协议有效) - * @return map& - */ - const map& getRequestStatus() const; - - /** - * 函数名称(仅TARS协议有效) - * @return string - */ - string getFuncName() const; - - /** - * 请求ID(仅TARS协议有效) - * @return int - */ - uint32_t getRequestId() const; - - /** - * 获取包类型(仅TARS协议有效) - * @return char - */ - char getPacketType() const; - - /** - * 获取消息类型(仅TARS协议有效) - * @return tars::Int32 - */ - tars::Int32 getMessageType() const; - - /** - * 获取接收到请求的时间 - */ - struct timeval getRecvTime() const; - - /** - * 设置是否上报状态报告 - */ - void setReportStat(bool bReport); - - /** - * taf协议的发送响应数据(仅TAF协议有效) - * @param iRet - * @param status - * @param buffer - */ - void sendResponse(int iRet); - - /** - * taf协议的发送响应数据(仅TAF协议有效), 直接swapbuffer , 这样可以不用copy 数据 - * @param iRet - * @param status - * @param buffer - */ - void sendResponse(int iRet, tars::TarsOutputStream& os); - - /** - * taf协议的发送响应数据(仅TAF协议有效), 直接swapbuffer , 这样可以不用copy 数据 - * @param iRet - * @param status - * @param buffer - */ - void sendResponse(int iRet, tup::UniAttribute& attr); - - /** - * taf协议的发送响应数据(仅TAF协议有效) - * @param iRet - * @param buff - */ - void sendResponse(int iRet, const vector &buff); - - /** - * 普通协议的发送响应数据(非TAF协议有效) - * @param buff - * @param len - */ - void sendResponse(const char* buff, uint32_t len); - - /** - * 设置cookie - */ - void setCookie(const map &cookie) - { - _cookie = cookie; - } - - /** - * 获取cookie - */ - map & getCookie() - { - return _cookie; - } - -protected: - - friend class ServantHandle; - - friend class Application; - - /** - * 初始化 - * @param data - */ - void initialize(const shared_ptr &data); - - /** - * 初始化 - * @param data - */ - void initializeClose(const shared_ptr &data); - - /** - * 初始化 - * @param sRecvBuffer - */ - void initialize(const vector &sRecvBuffer); - - /** - * 服务端上报状态,针对单向调用及TUP调用(仅对TARS协议有效) - */ - void reportToStat(const string & sObj); - - /** - * 发送消息 - * @param iRet - * @param response - * @param status - * @param sResultDesc - * @param push - */ - void sendResponse(int iRet, const vector &buffer, const map& status, const string& sResultDesc); - -protected: - /** - * 操作类指针 - */ - ServantHandle* _servantHandle; - - /** - * 接收到的数据 - */ - shared_ptr _data; - - /** - * 客户端请求包 - */ - RequestPacket _request; - - /** - * 响应 - */ - bool _response; - - /** - * 接口处理的返回值 - */ - int _ret; - - /** - * 是否上报stat - */ - bool _reportStat; - - /** - * 设置额外返回的内容 - */ - map _responseContext; - - /** - * cookie - */ - map _cookie; -}; -////////////////////////////////////////////////////////////// -} -#endif diff --git a/servant/servant/TarsLogger.h b/servant/servant/TarsLogger.h deleted file mode 100755 index c948f038..00000000 --- a/servant/servant/TarsLogger.h +++ /dev/null @@ -1,893 +0,0 @@ -/** - * Tencent is pleased to support the open source community by making Tars available. - * - * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -#ifndef __TARS_LOGGER_H__ -#define __TARS_LOGGER_H__ - -#include "util/tc_logger.h" -#include "util/tc_file.h" -#include "util/tc_singleton.h" -#include "servant/Global.h" -#include "servant/LogF.h" -#include "servant/PropertyReport.h" - -#define DYEING_DIR "tars_dyeing" -#define DYEING_FILE "dyeing" - -namespace tars -{ - -/** - * LOG的库说明: - * 1 循环日志采用TLOGERROR(...),TLOGDEBUG(...) - * 2 循环日志不上传到服务器 - * 3 按天日志采用DLOG, FDLOG来记录 - * 4 按天日志也可以不上传到远程服务器:DLOG("")->disableRemote(); - * 5 按天日志可以改变每天一个文件的方式: - * DLOG("abc3")->setFormat("%Y%m%d%H"); - * 每个小时一个文件 - */ - -/***************************************************************************** -实现方式说明(只介绍按时间的日志, 会写到tarslog): - 1 自定义时间日志的WriteT类:RemoteTimeWriteT - 2 在RemoteTimeWriteT类中, 写入到远程 - 3 定义远程日志类:typedef TC_Logger RemoteTimeLogger; - 4 为了保证远程的写日志也是在单独线程处理,重新定义本地按天日志类 - 5 自定义时间日志的WriteT类:TimeWriteT - 6 在TimeWriteT类中包含RemoteTimeLogger对象 - 7 在TimeWriteT类的写入操作中, 写入本地文件后, 同时写入到RemoteTimeLogger对象中 - 8 RemoteTimeLogger会在RemoteTimeWriteT对象中, 异步写入到远程 - 9 从而本地文件写和远程写不在一个线程中. -*****************************************************************************/ - -/////////////////////////////////////////////////////////////////////////////// - -class RollWriteT -{ -public: - RollWriteT(); - ~RollWriteT(); - - void operator()(ostream &of, const deque > &ds); - - void setDyeingLogInfo(const string &sApp, const string &sServer, const string & sLogPath, - int iMaxSize, int iMaxNum, const CommunicatorPtr &comm, const string & sLogObj); - -protected: - - TC_RollLogger *_dyeingRollLogger; - - static int _dyeingThread; - - string _app; - string _server; - string _logPath; - int _maxSize; - int _maxNum; - - /** - * 染色远程滚动日志代理 - */ - LogPrx _logPrx; - - -}; - - -/** - * 本地日志帮助类, 单件 - * 循环日志单件是永生不死的, 保证任何地方都可以使用 - * 当该对象析够以后, 则直接cout出来 - */ -class TarsRollLogger : public TC_Singleton -{ -public: - enum - { - NONE_LOG = 1, /**所有的log都不写*/ - ERROR_LOG = 2, /**写错误log*/ - WARN_LOG = 3, /**写错误,警告log*/ - DEBUG_LOG = 4, /**写错误,警告,调试log*/ - INFO_LOG = 5, /**写错误,警告,调试,Info log*/ - TARS_LOG = 6 /**写错误,警告,调试,Info log*/ - }; -public: - typedef TC_Logger RollLogger; - - /** - * 设置本地信息 - * @param app, 业务名称 - * @param server, 服务名称 - * @param logpath, 日志路径 - * @param iMaxSize, 文件最大大小,字节 - * @param iMaxNum, 文件最大数 - */ - void setLogInfo(const string &sApp, const string &sServer, const string &sLogpath, int iMaxSize = 1024*1024*50, int iMaxNum = 10, const CommunicatorPtr &comm=NULL, const string &sLogObj=""); - - /** - * 设置同步写日志 - * - * @param bSync - */ - void sync(bool bSync = true); - - /** - * 获取循环日志 - * - * @return RollLogger - */ - RollLogger *logger() { return &_logger; } - - /** - * 染色日志是否启用 - * @param bEnable - */ - void enableDyeing(bool bEnable, const string& sDyeingKey = ""); - -protected: - - /** - * 应用 - */ - string _app; - - /** - * 服务名称 - */ - string _server; - - /** - * 日志路径 - */ - string _logpath; - - /** - * 循环日志 - */ - RollLogger _logger; - - /** - * 本地线程组 - */ - TC_LoggerThreadGroup _local; - -}; - -/////////////////////////////////////////////////////////////////////////////////////// -// -/** - * 写日志线程 - * 将写本地日志和远程分开到不同的线程 - * 作为单件存在, 且是永生不死的单件 - */ -class TarsLoggerThread : public TC_Singleton -{ -public: - /** - * 构造函数 - */ - TarsLoggerThread(); - - /** - * 析够函数 - */ - ~TarsLoggerThread(); - - /** - * 本地写日志线程 - */ - TC_LoggerThreadGroup* local(); - - /** - * 远程写日志线程 - * - * @return TC_LoggerThreadGroup* - */ - TC_LoggerThreadGroup* remote(); - -protected: - - /** - * 本地线程组 - */ - TC_LoggerThreadGroup _local; - - /** - * 远程写线程组 - */ - TC_LoggerThreadGroup _remote; -}; - -/////////////////////////////////////////////////////////////////////////////////////// -class TimeWriteT; - -/** - * 远程的Log写操作类 - */ -class RemoteTimeWriteT -{ -public: - RemoteTimeWriteT(); - ~RemoteTimeWriteT(); - - /** - * 构造函数 - */ - void setTimeWriteT(TimeWriteT *pTimeWrite); - - /** - * 具体调用 - * @param of - * @param buffer - */ - void operator()(ostream &of, const deque > &buffer); - -protected: - /** - * 同步到远程 - */ - void sync2remote(const vector &buffer); - - /** - * 染色日志同步到远程 - */ - void sync2remoteDyeing(const vector &buffer); - -protected: - /** - * 指针 - */ - TimeWriteT *_timeWrite; - -}; - -//////////////////////////////////////////////////////////////////////////// -/** - * 写Logger - */ -class TimeWriteT -{ -public: - typedef TC_Logger RemoteTimeLogger; - - typedef TC_Logger DyeingTimeLogger; - - /** - * 构造 - */ - TimeWriteT(); - - /** - * 析够 - */ - ~TimeWriteT(); - - /** - * 设置基本信息 - * @param app, 应用名称 - * @param server, 服务名称 - * @param file, 日志文件名 - * @param sFormat, 格式 - * @param setdivision,set名称 - * @param sLogType,日志记录类型 - */ - void setLogInfo(const LogPrx &logPrx, const string &sApp, const string &sServer, const string &sFile, const string &sLogpath, const string &sFormat, const string& setdivision = "", const string& sLogType = "", const PropertyReportPtr &reportSuccPtr = NULL, const PropertyReportPtr &reportFailPtr = NULL); - - /** - * 设置代理 - * @param logPrx 代理信息 - */ - void setLogPrx(const LogPrx &logPrx); - - /** - * 远程日志功能打开或关闭 - * @param bEnable - */ - void enableRemote(bool bEnable) { _remote = bEnable; } - - /** - * 本地日志功能功能打开或关闭 - * @param bEnable - */ - void enableLocal(bool bEnable); - - /** - * 染色日志功能打开或关闭 - * @param bEnable - */ - void enableDyeing (bool bEnable, const string& sDyeingKey = ""); - - - /** - * @brief 日志文件名是否带.log后缀 - * @param bEnable - */ - void enableSufix(bool bEnable=true){_hasSufix = bEnable;} - /** - * @brief 是否允许框架在日志文件名上增加业务相关的标识 - * @param bEnable - */ - void enablePrefix(bool bEnable=true){_hasAppNamePrefix = bEnable;} - /** - * @brief 日志文件名中用户自定义字符与日期字符间的连接符,默认是"_" - * @param str - */ - void setFileNameConcatStr(const string& str) {_concatStr = str;} - - /** - * @brief 框架中增加的日志内容之间的分割符,默认是"|" - * @param str - */ - void setSeparator(const string& str) {_separ = str;} - - /** - * @brief 框架中日期和时间之间是否需要加中括号[],有些统计由特殊需求;默认不加 - * @param bEnable - */ - void enableSqareWrapper(bool bEnable) {_hasSquareBracket = bEnable;} - - - /** - * 设置时间格式("%Y%m%d") - * @param sFormat - */ - void setFormat(const string &sFormat) { _format = sFormat;} - - /** - * 具体调用 - * @param of - * @param buffer - */ - void operator()(ostream &of, const deque > &buffer); - -protected: - - /** - * 友元 - */ - friend class RemoteTimeWriteT; - - /** - * 记录错误文件 - * @param buffer - */ - void writeError(const vector &buffer); - - /** - * 记录错误文件 - * @param buffer - */ - void writeError(const deque > &buffer); - - /** - * 初始化logger - */ - void initError(); - - /** - * 初始化染色日志 - */ - void initDyeingLog(); - -protected: - - /** - * 远程时间日志 - */ - RemoteTimeLogger *_remoteTimeLogger; - - /** - * 本地功能 - */ - bool _local; - - /** - * 远程功能 - */ - bool _remote; - - /** - * 远程服务句柄 - */ - LogPrx _logPrx; - - /** - * app名称 - */ - string _app; - - /** - * 服务名称 - */ - string _server; - - /** - * 日志文件名称 - */ - string _file; - - /** - * 时间格式 - */ - string _format; - - /** - * 具体文件 - */ - string _filePath; - - /** - * 错误文件 - */ - TC_DayLogger _logger; - - /** - * 缺省写模式 - */ - TC_DefaultWriteT _wt; - - /** - * 染色日志 - */ - static int _dyeing; - - /** - * 染色日志目录路径 - */ - string _dyeingFilePath; - - /** - * 远程时间日志 - */ - DyeingTimeLogger *_dyeingTimeLogger; - - /** - * set分组信息 - */ - string _setDivision; - - /** - * 日志文件名是否带.log后缀 - */ - bool _hasSufix; - /** - * 是否允许框架在日志文件名上增加业务相关的标识 - */ - bool _hasAppNamePrefix; - - /** - * 日志文件名中用户自定义字符与日期字符间的连接符,默认是"_" - */ - string _concatStr; - /** - * 分隔符 - */ - string _separ; - /** - * 日期部分是否加上[] - */ - bool _hasSquareBracket; - - /* - * 本地日志的记录类型,格式为TarsLogType.toString()返回值,如果不采用TarsLogType,则该值为"" - */ - string _logType; - - /* - * 对于远程日志,上报同步到logser的成功量,默认不上报 - */ - PropertyReportPtr _reportSuccPtr; - - /* - * 对于远程日志,上报同步到logser的失败量,默认不上报 - */ - PropertyReportPtr _reportFailPtr; -}; - -//////////////////////////////////////////////////////////////////////////// -/** - * 远程日志帮助类, 单件 - */ -class TarsTimeLogger : public TC_HandleBase - , public TC_ThreadLock - , public TC_Singleton -{ -public: - - //定义按时间滚动的日志 - typedef TC_Logger TimeLogger; - - /** - * 构造 - */ - TarsTimeLogger(); - - /** - * 析够 - */ - ~TarsTimeLogger(); - - /** - * 设置本地信息 - * @param comm, 通信器 - * @param obj, 日志对象名称 - * @param app, 业务名称 - * @param server, 服务名称 - * @param logpath, 日志路径 - */ - void setLogInfo(const CommunicatorPtr &comm, const string &obj, const string &sApp, const string &sServer, const string &sLogpath,const string& setdivision="", const bool &bLogStatReport=false); - - /** - * 初始化设置时间格式("%Y%m%d") - * 不要动态修改, 线程不安全 - * 如果有需要, 初始化后直接修改 - * @param sFormat, 文件名称, 为空表示缺省的时间日志 - */ - void initFormat(const string &sFile, const string &sFormat,const TarsLogTypePtr& logTypePtr=NULL); - void initFormat(const string &sApp, const string &sServer,const string &sFile, const string &sFormat,const TarsLogTypePtr& logTypePtr=NULL); - /** - * 初始化设置时间格式("%Y%m%d") - * 不要动态修改, 线程不安全 - * 如果有需要, 初始化后直接修改 - * @param sFormat, 文件名称, 为空表示缺省的时间日志 - * @param frequency 支持每多少天/小时/分钟,详见TC_logger.h中关于TarsLogByDay,TarsLogByHour,TarsLogByMinute的描述 - * - * 用法: 按两个小时记录日志 - * initFormat("logfile",TarsLogByHour::FORMAT,2); - */ - template - void initFormatWithType(const string &sFile, const string &sFormat,size_t frequency) - { - TarsLogTypePtr logTypePtr = new TarsLogType(sFormat,frequency); - initFormat(sFile,sFormat,logTypePtr); - } - - template - void initFormatWithType(const string &sApp, const string &sServer,const string &sFile, const string &sFormat,size_t frequency) - { - TarsLogTypePtr logTypePtr = new TarsLogType(sFormat,frequency); - initFormat(sApp,sServer,sFile,sFormat,logTypePtr); - } - /** - * 获取时间日志 - * @param file - */ - TimeLogger *logger(const string &sFile = ""); - - /** - * 获取时间日志 - * @param app, 业务名称 - * @param server, 服务名称 - * @param file - */ - TimeLogger *logger(const string &sApp, const string &sServer,const string &sFile = ""); - - /** - * 同步写本地时间日志(远程日志一定是异步写的, 无法调整) - * @param bSync - */ - void sync(const string &sFile, bool bSync); - - /** - * 远程时间日志 - * @param sFile, 文件名称, 为空表示缺省的时间日志 - * @param bEnable - */ - void enableRemote(const string &sFile, bool bEnable); - - /** - * 远程时间日志 - * @param sApp,应用名称 - * @param sServer,服务名称 - * @param sFile, 文件名称, 为空表示缺省的时间日志 - * @param bEnable - */ - void enableRemoteEx(const string &sApp, const string &sServer,const string &sFile, bool bEnable); - /** - * 本地时间日志 - * @param sFile,文件名称, 为空表示缺省的时间日志 - * @param bEnable - */ - void enableLocal(const string &sFile, bool bEnable); - /** - * 本地时间日志 - * @param sApp,应用名称 - * @param sServer,服务名称 - * @param sFile, 文件名称, 为空表示缺省的时间日志 - * @param bEnable - */ - void enableLocalEx(const string &sApp, const string &sServer,const string &sFile, bool bEnable); - - /** - * @brief 日志文件名是否带.log后缀,影响全部日志文件 - * @param bEnable - */ - void enableSufix(bool bEnable=true){_hasSufix = bEnable;} - /** - * @brief 是否允许框架在日志文件名上增加业务相关的标识,影响全部日志文件 - * @param bEnable - */ - void enablePrefix(bool bEnable=true){_hasAppNamePrefix = bEnable;} - /** - * @brief 日志文件名中用户自定义字符与日期字符间的连接符,默认是"_",影响全部日志文件 - * @param str - */ - void setFileNameConcatStr(const string& str) {_concatStr = str;} - - /** - * @brief 框架中增加的日志内容之间的分割符,默认是"|",影响全部日志文件 - * @param str - */ - void setSeparator(const string& str) {_separ = str;} - - /** - * @brief 框架中日期和时间之间是否需要加中括号[],有些统计由特殊需求;默认不加,影响全部日志文件 - * @param bEnable - */ - void enableSqareWrapper(bool bEnable) {_hasSquareBracket = bEnable;} - /** - * @brief 是否输出本地日志文件,影响全部日志文件 - * @param bEnable - */ - void enableLocalLog(bool bEnable) {_local = bEnable;} - /** - * @brief 是否输出远程日志文件,影响全部日志文件 - * @param bEnable - */ - void enableRemoteLog(bool bEnable) {_remote = bEnable;} -protected: - - /** - * 初始化时间日志 - * @param pTimeLogger - * @param sFile - * @param sFormat - * @param frequence, 每多少天/小时/分钟,单位是秒 - */ - void initTimeLogger(TimeLogger *pTimeLogger, const string &sFile, const string &sFormat,const TarsLogTypePtr& logTypePtr=NULL); - - /** - * 初始化时间日志 - * @param pTimeLogger - * @param sApp - * @param sServer - * @param sFile - * @param sFormat - * @param frequence, 每多少天/小时/分钟,单位是秒 - */ - - void initTimeLogger(TimeLogger *pTimeLogger,const string &sApp, const string &sServer, const string &sFile, const string &sFormat,const TarsLogTypePtr& logTypePtr=NULL); - -protected: - - /** - * 通信器 - */ - CommunicatorPtr _comm; - - /** - * 远程服务句柄 - */ - LogPrx _logPrx; - - /** - * 应用 - */ - string _app; - - /** - * 服务名称 - */ - string _server; - - /** - * 日志路径 - */ - string _logpath; - - /** - * 缺省按天日志 - */ - TimeLogger *_defaultLogger; - - /** - * 远程日志 - */ - map _loggers; - /** - * set分组信息 - */ - string _setDivision; - - /** - * 是否带.log后缀 - */ - bool _hasSufix; - /** - * 是否允许框架在日志文件名上增加业务相关的标识 - */ - bool _hasAppNamePrefix; - - /** - * 日志文件名中用户自定义字符与日期字符间的连接符,默认是"_" - */ - string _concatStr; - /** - * 分隔符 - */ - string _separ; - /** - * 日期部分是否加上[] - */ - bool _hasSquareBracket; - /** - * 是否输出本地日志 - */ - bool _local; - /** - * 是否输出远程日志 - */ - bool _remote; - - /* - * 服务日志上报logser是否上报成功数量 - */ - bool _logStatReport; -}; - -/** - * 染色开关类,析构时关闭 - */ -class TarsDyeingSwitch -{ -public: - /** - * 构造函数,默认不打开染色日志 - */ - TarsDyeingSwitch() - :_needDyeing(false) - { - } - - /** - * 析构函数,关闭已打开的染色日志 - */ - ~TarsDyeingSwitch() - { - if(_needDyeing) - { - TarsRollLogger::getInstance()->enableDyeing(false); - - ServantProxyThreadData * td = ServantProxyThreadData::getData(); - assert(NULL != td); - if (td) - { - td->_dyeing = false; - td->_dyeingKey = ""; - } - } - } - - /** - * 获取染色的key - * - * @param key - * @return bool - */ - static bool getDyeingKey(string & sDyeingkey) - { - ServantProxyThreadData * td = ServantProxyThreadData::getData(); - assert(NULL != td); - - if (td && td->_dyeing == true) - { - sDyeingkey = td->_dyeingKey; - return true; - } - return false; - } - - /** - * 启用染色日志 - */ - void enableDyeing(const string & sDyeingKey = "") - { - TarsRollLogger::getInstance()->enableDyeing(true); - - ServantProxyThreadData * td = ServantProxyThreadData::getData(); - assert(NULL != td); - if(td) - - { - td->_dyeing = true; - td->_dyeingKey = sDyeingKey; - } - _needDyeing = true; - _dyeingKey = sDyeingKey; - } - -protected: - bool _needDyeing; - string _dyeingKey; -}; - -/** - * 循环日志 - */ -#define LOG (TarsRollLogger::getInstance()->logger()) - -/** - * @brief 按级别循环日志宏 - * - * @param level 日志等级,TarsRollLogger::INFO_LOG,TarsRollLogger::DEBUG_LOG,TarsRollLogger::WARN_LOG,TarsRollLogger::ERROR_LOG - * @msg 日志内容语句,包括<<重定向符连接的语句,如 "Demo begin" << " testing !" <isNeedLog(level)) LOG->log(level)<<__VA_ARGS__;}while(0) -#else -#define LOGMSG(level,msg...) do{ if(LOG->isNeedLog(level)) LOG->log(level)<logger()->any()) -#define FDLOG(x) (TarsTimeLogger::getInstance()->logger(x)->any()) -#define FFDLOG(x,y,z) (TarsTimeLogger::getInstance()->logger(x,y,z)->any()) - -/** - * 按天日志局部使能开关,针对单个日志文件进行使能,请在所有按天日志输出前调用 - */ -#define TENREMOTE_FDLOG(swith,sApp,sServer,sFile) (TarsTimeLogger::getInstance()->enableRemoteEx(sApp,sServer,sFile,swith)) -#define TENLOCAL_FDLOG(swith,sApp,sServer,sFile) (TarsTimeLogger::getInstance()->enableLocalEx(sApp,sServer,sFile,swith)) - -/** - * 按天日志全局使能开关,请在所有按天日志输出前调用 - */ -#define TENREMOTE(swith) (TarsTimeLogger::getInstance()->enableRemoteLog(swith)) -#define TENLOCAL(swith) (TarsTimeLogger::getInstance()->enableLocalLog(swith)) -} - -#endif - diff --git a/servant/servant/TarsNodeF.h b/servant/servant/TarsNodeF.h deleted file mode 100644 index 7dde2229..00000000 --- a/servant/servant/TarsNodeF.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Tencent is pleased to support the open source community by making Tars available. - * - * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -#ifndef __TARS_NODEF_H__ -#define __TARS_NODEF_H__ - -#include "servant/NodeF.h" -#include "servant/Global.h" -#include "util/tc_singleton.h" - -namespace tars -{ - -/** - * 给node发送心跳 - * 调用keepAlive异步发送心跳给node - */ -class TarsNodeFHelper : public TC_Singleton,public TC_ThreadMutex -{ -public: - - /** - * 设置node信息 - * @param comm, 通信器 - * @param obj, - * @param app - * @param server - */ - void setNodeInfo(const CommunicatorPtr &comm, const string &obj, const string &app, const string &server); - - /** - * keepAlive - */ - void keepAlive(const string &adapter = ""); - - void keepActiving(); - - /** - * 上报TARS的编译版本 - * @param version - */ - void reportVersion(const string &version); - -protected: - /** - * 通信器 - */ - CommunicatorPtr _comm; - - /** - * Node - */ - ServerFPrx _nodePrx; - - /** - * 信息 - */ - ServerInfo _si; - - set _adapterSet; - -}; - -} - -#endif - diff --git a/servant/servant/TarsNotify.h b/servant/servant/TarsNotify.h deleted file mode 100644 index 9b692cad..00000000 --- a/servant/servant/TarsNotify.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Tencent is pleased to support the open source community by making Tars available. - * - * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -#ifndef __TARS_NOTIFY_H_ -#define __TARS_NOTIFY_H_ - -#include "servant/NotifyF.h" -#include "servant/Global.h" -#include "util/tc_singleton.h" - -using namespace std; - -namespace tars -{ - -/** - * 上报信息给Notify服务 - * 异步上报给notify服务 - */ -class TarsRemoteNotify : public TC_Singleton -{ -public: - /** - * 初始化 - * @param comm, 通信器 - * @param obj, 对象名称 - * @param notifyPrx - * @param app - * @param serverName - * - * @return int - */ - int setNotifyInfo(const CommunicatorPtr &comm, const string &obj, const string & app, const string &serverName, const string &nodeName, const string &sSetName=""); - - /** - * 通知, 一定是异步上报的 - * @param message - */ - void notify(NOTIFYLEVEL level, const string &sMesage); - - /** - * 上报 - * @param sResult - * @param bSync - */ - void report(const string &sResult, bool bSync = false); - - /** - * 指定通知到某个服务, 一定是异步上报的 - * @param message - */ - void report(const string &sMesage, const string & app, const string &serverName, const string &sNodeName); - -protected: - /** - * 通信器 - */ - CommunicatorPtr _comm; - - /** - * 通知代理 - */ - NotifyPrx _notifyPrx; - - /** - * 应用 - */ - string _app; - - /** - * 服务名称 - */ - string _serverName; - - /* - *set 名字 - */ - string _setName; - - /* - *节点 - */ - string _nodeName; -}; - -} - -#endif diff --git a/servant/servant/Transceiver.h b/servant/servant/Transceiver.h index 1c5dd174..59c19ea1 100755 --- a/servant/servant/Transceiver.h +++ b/servant/servant/Transceiver.h @@ -183,8 +183,8 @@ class Transceiver /* * 获取端口信息 */ - EndpointInfo& getEndpointInfo() - { + const EndpointInfo& getEndpointInfo() const + { return _ep; } diff --git a/tools/tars2node/gen_server_ts.cpp b/tools/tars2node/gen_server_ts.cpp index bd37611a..c8693e17 100644 --- a/tools/tars2node/gen_server_ts.cpp +++ b/tools/tars2node/gen_server_ts.cpp @@ -38,7 +38,7 @@ string CodeGenerator::generateTSServerAsync(const NamespacePtr &nPtr, const Inte sParams += ": " + getTsType(vParamDecl[i]->getTypeIdPtr()->getTypePtr()); } - str << TAB << "protected static __" << oPtr->getId() << "_responser(this: " << IDL_NAMESPACE_STR << "Rpc.TarsCurrent, " << sParams << ") {" << endl; + str << TAB << "protected static __" << oPtr->getId() << "_responser(this: " << IDL_NAMESPACE_STR << "Rpc.Current, " << sParams << ") {" << endl; INC_TAB; @@ -105,7 +105,7 @@ string CodeGenerator::generateTSServerDispatch(const NamespacePtr &nPtr, const I ostringstream str; vector & vParamDecl = oPtr->getAllParamDeclPtr(); - str << TAB << "protected __" << oPtr->getId() << "(current: " << IDL_NAMESPACE_STR << "Rpc.TarsCurrent"; + str << TAB << "protected __" << oPtr->getId() << "(current: " << IDL_NAMESPACE_STR << "Rpc.Current"; if (vParamDecl.size() != 0) str << ", binBuffer: " << IDL_NAMESPACE_STR << "Stream.BinBuffer"; str << ") {" << endl; @@ -228,7 +228,7 @@ string CodeGenerator::generateTSServer(const InterfacePtr &pPtr, const Namespace str << TAB << "initialize(): PromiseLike | void {}" << endl << endl; // generate the dispatch function - str << TAB << "onDispatch(current: " << IDL_NAMESPACE_STR << "Rpc.TarsCurrent, funcName: string, binBuffer: " << IDL_NAMESPACE_STR << "Stream.BinBuffer) { " << endl; + str << TAB << "onDispatch(current: " << IDL_NAMESPACE_STR << "Rpc.Current, funcName: string, binBuffer: " << IDL_NAMESPACE_STR << "Stream.BinBuffer) { " << endl; INC_TAB; str << TAB << "if (\"__\" + funcName in this) {" << endl; INC_TAB; @@ -243,7 +243,7 @@ string CodeGenerator::generateTSServer(const InterfacePtr &pPtr, const Namespace str << TAB << "}" << endl << endl; // generate the ping function - str << TAB << "__" << TC_Common::lower(IDL_NAMESPACE_STR) << "_ping(current: " << IDL_NAMESPACE_STR << "Rpc.TarsCurrent) { " << endl; + str << TAB << "__" << TC_Common::lower(IDL_NAMESPACE_STR) << "_ping(current: " << IDL_NAMESPACE_STR << "Rpc.Current) { " << endl; INC_TAB; str << TAB << "const _ret = 0;" << endl; str << TAB << "if (current.getRequestVersion() === " << PROTOCOL_SIMPLE << " || current.getRequestVersion() === " << PROTOCOL_COMPLEX << ") {" << endl; diff --git a/tools/tarsparse/tars.lex.cpp b/tools/tarsparse/tars.lex.cpp index 8265e741..bf257929 100644 --- a/tools/tarsparse/tars.lex.cpp +++ b/tools/tarsparse/tars.lex.cpp @@ -513,7 +513,7 @@ int yy_flex_debug = 0; #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#line 1 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 1 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" /** * Tencent is pleased to support the open source community by making Tars available. * @@ -529,7 +529,7 @@ char *yytext; * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -#line 20 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 20 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" #include #include #include @@ -742,7 +742,7 @@ YY_DECL register char *yy_cp, *yy_bp; register int yy_act; -#line 67 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 67 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" #line 749 "tars.lex.cpp" @@ -840,12 +840,12 @@ YY_DECL case 1: YY_RULE_SETUP -#line 69 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 69 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { BEGIN(INCL); } YY_BREAK case 2: YY_RULE_SETUP -#line 71 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 71 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { if ( include_file_stack_ptr >= MAX_INCLUDE_DEPTH ) { @@ -878,7 +878,7 @@ YY_RULE_SETUP YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(INCL): -#line 101 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 101 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { --include_file_stack_ptr; if ( include_file_stack_ptr < 0 ) @@ -897,14 +897,14 @@ case YY_STATE_EOF(INCL): YY_BREAK case 3: YY_RULE_SETUP -#line 117 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 117 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { return TARS_SCOPE_DELIMITER; } YY_BREAK case 4: YY_RULE_SETUP -#line 121 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 121 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { // C++ comment bool e = false; @@ -925,7 +925,7 @@ YY_RULE_SETUP YY_BREAK case 5: YY_RULE_SETUP -#line 139 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 139 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { // C comment bool e = false; @@ -976,7 +976,7 @@ YY_RULE_SETUP YY_BREAK case 6: YY_RULE_SETUP -#line 187 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 187 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { StringGrammarPtr ident = new StringGrammar; ident->v = yytext; @@ -987,7 +987,7 @@ YY_RULE_SETUP case 7: /* rule 7 can match eol */ YY_RULE_SETUP -#line 194 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 194 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { StringGrammarPtr ident = new StringGrammar; ident->v = yytext; @@ -1000,7 +1000,7 @@ YY_RULE_SETUP YY_BREAK case 8: YY_RULE_SETUP -#line 204 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 204 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { StringGrammarPtr str = new StringGrammar; bool e = false; @@ -1115,7 +1115,7 @@ YY_RULE_SETUP YY_BREAK case 9: YY_RULE_SETUP -#line 316 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 316 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { errno = 0; IntergerGrammarPtr ptr = new IntergerGrammar; @@ -1140,7 +1140,7 @@ YY_RULE_SETUP YY_BREAK case 10: YY_RULE_SETUP -#line 338 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 338 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { errno = 0; FloatGrammarPtr ptr = new FloatGrammar; @@ -1175,7 +1175,7 @@ YY_RULE_SETUP case 11: /* rule 11 can match eol */ YY_RULE_SETUP -#line 369 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 369 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { if(yytext[0] == '\n') { @@ -1185,7 +1185,7 @@ YY_RULE_SETUP YY_BREAK case 12: YY_RULE_SETUP -#line 376 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 376 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" { if(yytext[0] < 32 || yytext[0] > 126) { @@ -1204,7 +1204,7 @@ YY_RULE_SETUP YY_BREAK case 13: YY_RULE_SETUP -#line 392 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 392 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" ECHO; YY_BREAK #line 1211 "tars.lex.cpp" @@ -2214,7 +2214,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 392 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" +#line 392 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.l" diff --git a/tools/tarsparse/tars.tab.cpp b/tools/tarsparse/tars.tab.cpp index 234486d1..3d5e1136 100644 --- a/tools/tarsparse/tars.tab.cpp +++ b/tools/tarsparse/tars.tab.cpp @@ -136,7 +136,7 @@ /* Copy the first part of user declarations. */ -#line 17 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 17 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" #include #include @@ -1649,81 +1649,81 @@ yyparse () switch (yyn) { case 3: -#line 75 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 75 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 5: -#line 79 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 79 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { yyerrok; ;} break; case 7: -#line 84 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 84 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("`;' missing after definition"); ;} break; case 8: -#line 88 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 88 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 9: -#line 96 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 96 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { assert((yyvsp[(1) - (1)]) == 0 || NamespacePtr::dynamicCast((yyvsp[(1) - (1)]))); ;} break; case 10: -#line 100 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 100 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { assert((yyvsp[(1) - (1)]) == 0 || InterfacePtr::dynamicCast((yyvsp[(1) - (1)]))); ;} break; case 11: -#line 104 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 104 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { assert((yyvsp[(1) - (1)]) == 0 || StructPtr::dynamicCast((yyvsp[(1) - (1)]))); ;} break; case 12: -#line 108 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 108 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 13: -#line 111 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 111 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { assert((yyvsp[(1) - (1)]) == 0 || EnumPtr::dynamicCast((yyvsp[(1) - (1)]))); ;} break; case 14: -#line 115 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 115 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { assert((yyvsp[(1) - (1)]) == 0 || ConstPtr::dynamicCast((yyvsp[(1) - (1)]))); ;} break; case 15: -#line 124 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 124 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = (yyvsp[(1) - (1)]); ;} break; case 16: -#line 128 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 128 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { if((yyvsp[(3) - (5)])) { @@ -1740,7 +1740,7 @@ yyparse () break; case 17: -#line 147 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 147 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { NamespacePtr c = NamespacePtr::dynamicCast(g_parse->currentContainer()); if(!c) @@ -1756,7 +1756,7 @@ yyparse () break; case 18: -#line 160 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 160 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(2) - (2)])); g_parse->error("keyword `" + ident->v + "' cannot be used as enumeration name"); @@ -1765,20 +1765,20 @@ yyparse () break; case 19: -#line 171 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 171 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = (yyvsp[(2) - (3)]); ;} break; case 20: -#line 175 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 175 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 21: -#line 183 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 183 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { TypePtr type = TypePtr::dynamicCast(g_parse->createBuiltin(Builtin::KindLong)); StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(1) - (1)])); @@ -1792,7 +1792,7 @@ yyparse () break; case 22: -#line 194 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 194 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(1) - (1)])); g_parse->error("keyword `" + ident->v + "' cannot be used as enumerator"); @@ -1800,7 +1800,7 @@ yyparse () break; case 23: -#line 199 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 199 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { TypePtr type = TypePtr::dynamicCast(g_parse->createBuiltin(Builtin::KindLong)); StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(1) - (3)])); @@ -1816,13 +1816,13 @@ yyparse () break; case 24: -#line 212 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 212 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 25: -#line 220 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 220 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(2) - (2)])); ContainerPtr c = g_parse->currentContainer(); @@ -1840,7 +1840,7 @@ yyparse () break; case 26: -#line 235 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 235 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { if((yyvsp[(3) - (6)])) { @@ -1855,7 +1855,7 @@ yyparse () break; case 27: -#line 253 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 253 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(3) - (4)])); StructPtr sp = StructPtr::dynamicCast(g_parse->findUserType(ident->v)); @@ -1869,13 +1869,13 @@ yyparse () break; case 28: -#line 264 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 264 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 29: -#line 272 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 272 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(1) - (1)])); StructPtr np = g_parse->getKeyStruct(); @@ -1891,7 +1891,7 @@ yyparse () break; case 30: -#line 285 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 285 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(3) - (3)])); StructPtr np = g_parse->getKeyStruct(); @@ -1907,7 +1907,7 @@ yyparse () break; case 31: -#line 304 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 304 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(1) - (1)])); @@ -1927,7 +1927,7 @@ yyparse () break; case 32: -#line 321 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 321 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { if((yyvsp[(2) - (5)])) { @@ -1942,14 +1942,14 @@ yyparse () break; case 33: -#line 338 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 338 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = (yyvsp[(2) - (2)]); ;} break; case 34: -#line 342 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 342 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(2) - (2)])); g_parse->error("keyword `" + ident->v + "' cannot be used as interface name"); @@ -1958,32 +1958,32 @@ yyparse () break; case 35: -#line 353 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 353 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 36: -#line 356 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 356 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 37: -#line 359 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 359 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("`;' missing after definition"); ;} break; case 38: -#line 363 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 363 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 40: -#line 377 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 377 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { if((yyvsp[(1) - (3)])) { @@ -1998,7 +1998,7 @@ yyparse () break; case 41: -#line 394 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 394 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { TypePtr returnType = TypePtr::dynamicCast((yyvsp[(1) - (2)])); StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(2) - (2)])); @@ -2025,20 +2025,20 @@ yyparse () break; case 43: -#line 424 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 424 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = 0; ;} break; case 44: -#line 434 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 434 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 45: -#line 437 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 437 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { TypeIdPtr tsp = TypeIdPtr::dynamicCast((yyvsp[(1) - (1)])); @@ -2052,7 +2052,7 @@ yyparse () break; case 46: -#line 448 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 448 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { TypeIdPtr tsp = TypeIdPtr::dynamicCast((yyvsp[(3) - (3)])); @@ -2066,7 +2066,7 @@ yyparse () break; case 47: -#line 459 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 459 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { BoolGrammarPtr isOutParam = BoolGrammarPtr::dynamicCast((yyvsp[(1) - (2)])); TypeIdPtr tsp = TypeIdPtr::dynamicCast((yyvsp[(2) - (2)])); @@ -2081,7 +2081,7 @@ yyparse () break; case 48: -#line 471 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 471 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { BoolGrammarPtr isOutParam = BoolGrammarPtr::dynamicCast((yyvsp[(3) - (4)])); TypeIdPtr tsp = TypeIdPtr::dynamicCast((yyvsp[(4) - (4)])); @@ -2096,7 +2096,7 @@ yyparse () break; case 49: -#line 483 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 483 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { BoolGrammarPtr isRouteKeyParam = BoolGrammarPtr::dynamicCast((yyvsp[(1) - (2)])); TypeIdPtr tsp = TypeIdPtr::dynamicCast((yyvsp[(2) - (2)])); @@ -2111,7 +2111,7 @@ yyparse () break; case 50: -#line 495 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 495 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { BoolGrammarPtr isRouteKeyParam = BoolGrammarPtr::dynamicCast((yyvsp[(3) - (4)])); TypeIdPtr tsp = TypeIdPtr::dynamicCast((yyvsp[(4) - (4)])); @@ -2126,21 +2126,21 @@ yyparse () break; case 51: -#line 507 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 507 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("'out' must be defined with a type"); ;} break; case 52: -#line 511 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 511 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("'routekey' must be defined with a type"); ;} break; case 53: -#line 520 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 520 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { BoolGrammarPtr routekey = new BoolGrammar; routekey->v = true; @@ -2149,7 +2149,7 @@ yyparse () break; case 54: -#line 531 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 531 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { BoolGrammarPtr out = new BoolGrammar; out->v = true; @@ -2158,7 +2158,7 @@ yyparse () break; case 55: -#line 542 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 542 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(1) - (1)])); NamespacePtr np = NamespacePtr::dynamicCast(g_parse->currentContainer()); @@ -2183,7 +2183,7 @@ yyparse () break; case 56: -#line 564 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 564 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { if((yyvsp[(2) - (5)])) { @@ -2201,14 +2201,14 @@ yyparse () break; case 57: -#line 584 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 584 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = (yyvsp[(2) - (2)]); ;} break; case 58: -#line 588 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 588 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(2) - (2)])); @@ -2217,41 +2217,41 @@ yyparse () break; case 59: -#line 594 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 594 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("abstract declarator '' used as declaration"); ;} break; case 60: -#line 603 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 603 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 61: -#line 607 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 607 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("';' missing after definition"); ;} break; case 62: -#line 611 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 611 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 63: -#line 621 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 621 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = GrammarBasePtr::dynamicCast((yyvsp[(1) - (1)])); ;} break; case 64: -#line 630 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 630 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StructPtr np = StructPtr::dynamicCast(g_parse->currentContainer()); if(np) @@ -2272,7 +2272,7 @@ yyparse () break; case 65: -#line 648 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 648 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StructPtr np = StructPtr::dynamicCast(g_parse->currentContainer()); if(np) @@ -2297,7 +2297,7 @@ yyparse () break; case 66: -#line 670 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 670 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StructPtr np = StructPtr::dynamicCast(g_parse->currentContainer()); if(np) @@ -2322,7 +2322,7 @@ yyparse () break; case 67: -#line 692 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 692 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StructPtr np = StructPtr::dynamicCast(g_parse->currentContainer()); if(np) @@ -2342,35 +2342,35 @@ yyparse () break; case 68: -#line 709 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 709 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("struct member need 'tag'"); ;} break; case 69: -#line 713 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 713 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("struct member need 'tag'"); ;} break; case 70: -#line 717 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 717 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("struct member need 'require' or 'optional'"); ;} break; case 71: -#line 721 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 721 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("struct member need 'tag' or 'require' or 'optional'"); ;} break; case 72: -#line 730 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 730 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { IntergerGrammarPtr intVal = IntergerGrammarPtr::dynamicCast((yyvsp[(1) - (1)])); ostringstream sstr; @@ -2383,7 +2383,7 @@ yyparse () break; case 73: -#line 740 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 740 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { FloatGrammarPtr floatVal = FloatGrammarPtr::dynamicCast((yyvsp[(1) - (1)])); ostringstream sstr; @@ -2396,7 +2396,7 @@ yyparse () break; case 74: -#line 750 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 750 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(1) - (1)])); ConstGrammarPtr c = new ConstGrammar(); @@ -2407,7 +2407,7 @@ yyparse () break; case 75: -#line 758 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 758 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(1) - (1)])); ConstGrammarPtr c = new ConstGrammar(); @@ -2418,7 +2418,7 @@ yyparse () break; case 76: -#line 766 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 766 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(1) - (1)])); ConstGrammarPtr c = new ConstGrammar(); @@ -2429,7 +2429,7 @@ yyparse () break; case 77: -#line 774 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 774 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(1) - (1)])); @@ -2445,7 +2445,7 @@ yyparse () break; case 78: -#line 787 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 787 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr scoped = StringGrammarPtr::dynamicCast((yyvsp[(1) - (3)])); @@ -2463,7 +2463,7 @@ yyparse () break; case 79: -#line 807 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 807 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { NamespacePtr np = NamespacePtr::dynamicCast(g_parse->currentContainer()); if(!np) @@ -2479,7 +2479,7 @@ yyparse () break; case 80: -#line 825 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 825 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { TypePtr type = TypePtr::dynamicCast((yyvsp[(1) - (2)])); StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(2) - (2)])); @@ -2491,7 +2491,7 @@ yyparse () break; case 81: -#line 834 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 834 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { TypePtr type = g_parse->createVector(TypePtr::dynamicCast((yyvsp[(1) - (5)]))); IntergerGrammarPtr iPtrSize = IntergerGrammarPtr::dynamicCast((yyvsp[(4) - (5)])); @@ -2504,7 +2504,7 @@ yyparse () break; case 82: -#line 844 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 844 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { TypePtr type = g_parse->createVector(TypePtr::dynamicCast((yyvsp[(1) - (3)]))); //IntergerGrammarPtr iPtrSize = IntergerGrammarPtr::dynamicCast($4); @@ -2517,7 +2517,7 @@ yyparse () break; case 83: -#line 854 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 854 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { TypePtr type = TypePtr::dynamicCast((yyvsp[(1) - (4)])); StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(2) - (4)])); @@ -2529,7 +2529,7 @@ yyparse () break; case 84: -#line 863 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 863 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(2) - (2)])); g_parse->error("keyword `" + ident->v + "' cannot be used as data member name"); @@ -2537,21 +2537,21 @@ yyparse () break; case 85: -#line 868 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 868 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("missing data member name"); ;} break; case 86: -#line 872 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 872 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("unkown type"); ;} break; case 87: -#line 881 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 881 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { TypePtr type = TypePtr::dynamicCast((yyvsp[(1) - (3)])); @@ -2563,112 +2563,112 @@ yyparse () break; case 88: -#line 890 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 890 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = (yyvsp[(1) - (1)]); ;} break; case 89: -#line 894 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 894 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("array missing size"); ;} break; case 90: -#line 903 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 903 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = g_parse->createBuiltin(Builtin::KindBool); ;} break; case 91: -#line 907 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 907 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = g_parse->createBuiltin(Builtin::KindByte); ;} break; case 92: -#line 911 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 911 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = g_parse->createBuiltin(Builtin::KindShort,true); ;} break; case 93: -#line 915 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 915 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = g_parse->createBuiltin(Builtin::KindShort); ;} break; case 94: -#line 919 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 919 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = g_parse->createBuiltin(Builtin::KindInt,true); ;} break; case 95: -#line 923 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 923 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = g_parse->createBuiltin(Builtin::KindInt); ;} break; case 96: -#line 927 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 927 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = g_parse->createBuiltin(Builtin::KindLong,true); ;} break; case 97: -#line 931 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 931 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = g_parse->createBuiltin(Builtin::KindLong); ;} break; case 98: -#line 935 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 935 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = g_parse->createBuiltin(Builtin::KindFloat); ;} break; case 99: -#line 939 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 939 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = g_parse->createBuiltin(Builtin::KindDouble); ;} break; case 100: -#line 943 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 943 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = g_parse->createBuiltin(Builtin::KindString); ;} break; case 101: -#line 947 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 947 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = GrammarBasePtr::dynamicCast((yyvsp[(1) - (1)])); ;} break; case 102: -#line 951 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 951 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = GrammarBasePtr::dynamicCast((yyvsp[(1) - (1)])); ;} break; case 103: -#line 955 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 955 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(1) - (1)])); TypePtr sp = g_parse->findUserType(ident->v); @@ -2684,55 +2684,55 @@ yyparse () break; case 104: -#line 973 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 973 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = GrammarBasePtr::dynamicCast(g_parse->createVector(TypePtr::dynamicCast((yyvsp[(3) - (4)])))); ;} break; case 105: -#line 977 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 977 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("vector error"); ;} break; case 106: -#line 981 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 981 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("vector missing '>'"); ;} break; case 107: -#line 985 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 985 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("vector missing type"); ;} break; case 108: -#line 994 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 994 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { (yyval) = GrammarBasePtr::dynamicCast(g_parse->createMap(TypePtr::dynamicCast((yyvsp[(3) - (6)])), TypePtr::dynamicCast((yyvsp[(5) - (6)])))); ;} break; case 109: -#line 998 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 998 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { g_parse->error("map error"); ;} break; case 110: -#line 1007 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1007 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 111: -#line 1010 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1010 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(2) - (2)])); ident->v = "::" + ident->v; @@ -2741,7 +2741,7 @@ yyparse () break; case 112: -#line 1016 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1016 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { StringGrammarPtr scoped = StringGrammarPtr::dynamicCast((yyvsp[(1) - (3)])); StringGrammarPtr ident = StringGrammarPtr::dynamicCast((yyvsp[(3) - (3)])); @@ -2752,151 +2752,151 @@ yyparse () break; case 113: -#line 1029 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1029 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 114: -#line 1032 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1032 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 115: -#line 1035 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1035 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 116: -#line 1038 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1038 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 117: -#line 1041 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1041 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 118: -#line 1044 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1044 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 119: -#line 1047 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1047 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 120: -#line 1050 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1050 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 121: -#line 1053 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1053 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 122: -#line 1056 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1056 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 123: -#line 1059 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1059 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 124: -#line 1062 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1062 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 125: -#line 1065 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1065 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 126: -#line 1068 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1068 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 127: -#line 1071 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1071 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 128: -#line 1074 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1074 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 129: -#line 1077 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1077 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 130: -#line 1080 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1080 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 131: -#line 1083 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1083 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 132: -#line 1086 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1086 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 133: -#line 1089 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1089 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 134: -#line 1092 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1092 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 135: -#line 1095 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1095 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 136: -#line 1098 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1098 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; case 137: -#line 1101 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1101 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" { ;} break; @@ -3117,7 +3117,7 @@ yyparse () } -#line 1105 "/Users/jarod/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" +#line 1105 "/Volumes/MyData/centos/TarsCloud/framework/tarscpp/tools/tarsgrammar/tars.y" diff --git a/util/include/util/tc_autoptr.h b/util/include/util/tc_autoptr.h index 9b2f09c5..e1a46e87 100755 --- a/util/include/util/tc_autoptr.h +++ b/util/include/util/tc_autoptr.h @@ -18,7 +18,7 @@ #define __TC_AUTOPTR_H #include "util/tc_ex.h" -// #include "util/tc_atomic.h" +#include "util/tc_platform.h" #include #include @@ -40,7 +40,7 @@ struct TC_AutoPtrNull_Exception : public TC_Exception * 所有需要智能指针支持的类都需要从该对象继承, * */ -class TC_HandleBase +class UTIL_DLL_API TC_HandleBase { public: diff --git a/util/include/util/tc_common.h b/util/include/util/tc_common.h index 4f194801..3f8489fa 100644 --- a/util/include/util/tc_common.h +++ b/util/include/util/tc_common.h @@ -51,18 +51,18 @@ namespace tars */ ///////////////////////////////////////////////// - /** - * @brief 基础工具类,提供了一些非常基本的函数使用. - * - * 这些函数都是以静态函数提供。 包括以下几种函数: - * - * Trim类函数,大小写转换函数,分隔字符串函数(直接分隔字符串, - * - * 数字等),时间相关函数,字符串转换函数,二进制字符串互转函数, - * - * 替换字符串函数,Ip匹配函数,判断一个数是否是素数等 - */ -class TC_Common +/** +* @brief 基础工具类,提供了一些非常基本的函数使用. +* +* 这些函数都是以静态函数提供。 包括以下几种函数: +* +* Trim类函数,大小写转换函数,分隔字符串函数(直接分隔字符串, +* +* 数字等),时间相关函数,字符串转换函数,二进制字符串互转函数, +* +* 替换字符串函数,Ip匹配函数,判断一个数是否是素数等 +*/ +class UTIL_DLL_API TC_Common { public: diff --git a/util/include/util/tc_epoll_server.h b/util/include/util/tc_epoll_server.h index 30509cec..7ef0fa68 100644 --- a/util/include/util/tc_epoll_server.h +++ b/util/include/util/tc_epoll_server.h @@ -1170,6 +1170,12 @@ class TC_EpollServer : public TC_HandleBase */ TC_NetWorkBuffer &getSendBuffer() { return _sendBuffer; } + /** + * 发送buffer里面数据 + * @return + */ + int sendBuffer(); + friend class NetThread; protected: @@ -1197,12 +1203,6 @@ class TC_EpollServer : public TC_HandleBase */ int send(const shared_ptr &data); - /** - * 发送buffer里面数据 - * @return - */ - int sendBuffer(); - /** * 读取数据 * @param fd diff --git a/util/include/util/tc_ex.h b/util/include/util/tc_ex.h index 075b84e1..089d8a54 100644 --- a/util/include/util/tc_ex.h +++ b/util/include/util/tc_ex.h @@ -107,8 +107,7 @@ class TC_Exception : public exception //为了避免windows平台GetLastError()获取不对的问题, 因为抛异常, throw TC_Exception("xxxx", TC_Exception::getSystemCode())时 //回调用系统函数分配内存, 导致错误码被改写, 因此专门定义宏来抛出异常 //先获取到错误码, 再throw -#define TARS_THROW_EXCEPTION(EX_CLASS, buffer) throw EX_CLASS(buffer) -#define TARS_THROW_EXCEPTION_SYSCODE(EX_CLASS, buffer) \ +#define THROW_EXCEPTION_SYSCODE(EX_CLASS, buffer) \ { \ int ret = TC_Exception::getSystemCode(); \ throw EX_CLASS(buffer, ret); \ diff --git a/util/include/util/tc_http.h b/util/include/util/tc_http.h index 8334089c..507718ae 100755 --- a/util/include/util/tc_http.h +++ b/util/include/util/tc_http.h @@ -343,6 +343,9 @@ class TC_URL class TC_Http { public: + static unordered_map HEADER; + static unordered_map HEADER_REVERSE; + /** * @brief 构造函数 */ @@ -562,10 +565,25 @@ class TC_Http string getHeader(const string& sHeader) const; /** - * @brief 获取http头部map. - * - * @return http_header_type& + * 是否有header + * @param sHeader + * @return + */ + bool hasHeader(const char *sHeader) const; + + /** + * @brief 检查头部 + * @param sHeader + * @param value + * @return */ + bool checkHeader(const char *sHeader, const char *value) const; + + /** + * @brief 获取http头部map. + * + * @return http_header_type& + */ const http_header_type& getHeaders() const{return _headers;} /** @@ -579,82 +597,89 @@ class TC_Http */ void reset(); -// /** -// * @brief 读取一行. -// * -// * @param ppChar 读取位置指针 -// * @return string 读取的内容 -// */ -// static string getLine(const char** ppChar); - - /** - * @brief 读取一行. - * - * @param ppChar 读取位置指针 - * @param iBufLen 长度 - * @return string 读取的内容 - */ -// static string getLine(const char** ppChar, int iBufLen); - /** - * @brief 生成头部字符串(不包含第一行). + * @brief 生成头部字符串(不包含第一行), 直接累加到sHttpHeader后 * * @return string:头部字符串 */ - string genHeader() const; + void genHeader(string &sHttpHeader) const; /** - * @brief 该http原始数据包是否是chunk编码格式. - * - * @return bool:包含返回true,否则返回false + * @brief 生成头部字符串(不包含第一行) + * @return */ + string genHeader() const; + + /** + * @brief 该http原始数据包是否是chunk编码格式. + * + * @return bool:包含返回true,否则返回false + */ bool isChunked() const { return _bIsChunked; } /** * @brief 解析请求head,不解析第一行, * 第一行请求包和响应包不一样, 后面的数据解析为map格式 - * @param szBuffer + * @param szBuffer * @return const char*, 偏移的指针 */ // static const char* parseHeader(const char* szBuffer, http_header_type &sHeader); +// +// template +// static void parseHeader(const ForwardIterator1 &beginIt, const ForwardIterator2 &headerIt, http_header_type &sHeader) +// { +// sHeader.clear(); +// +// string sep = "\r\n"; +// string colon = ":"; +// +// bool first = true; +// auto lineStartIt= beginIt; +// +// while (true) +// { +// auto it = std::search(lineStartIt, headerIt, sep.c_str(), sep.c_str() + sep.size()); +// if(it == headerIt) +// { +// break; +// } +// +// //first line ignore +// if(!first) +// { +// auto itF = std::search(lineStartIt, it, colon.c_str(), colon.c_str() + colon.size()); +// if (itF != it) +// { +// string name; +// name.resize(itF - lineStartIt); +// std::copy(lineStartIt, itF, name.begin()); +// +// string value; +// value.resize(it - (itF + 1)); +// std::copy(itF + 1, it, value.begin()); +// +// sHeader.insert(multimap::value_type(TC_Common::trim(name, " "), +// TC_Common::trim(value, " "))); +// +// } +// } +// else +// { +// first = false; +// } +// +// lineStartIt = it + sep.size(); +// } +// } + + /** + * 解析, 尽量避免内存copy, 提升效率 + * @param beginIt + * @param headerIt + * @param sHeader + */ + static size_t parseHeaderString(const char *beginIt, const char *headerIt, http_header_type &sHeader); - template - static void parseHeader(const ForwardIterator1 &beginIt, const ForwardIterator2 &headerIt, http_header_type &sHeader) - { - sHeader.clear(); - string sep = "\r\n"; - string colon = ":"; - bool first = true; - auto lineStartIt= beginIt; - while (true) - { - auto it = std::search(lineStartIt, headerIt, sep.c_str(), sep.c_str() + sep.size()); - if(it == headerIt) - { - break; - } - if(!first) - { - auto itF = std::search(lineStartIt, it, colon.c_str(), colon.c_str() + colon.size()); - if (itF != it) - { - string name; - name.resize(itF - lineStartIt); - std::copy(lineStartIt, itF, name.begin()); - string value; - value.resize(it - (itF + 1)); - std::copy(itF + 1, it, value.begin()); - sHeader.insert(multimap::value_type(TC_Common::trim(name, " "), - TC_Common::trim(value, " "))); - } - } - else - { - first = false; - } - lineStartIt = it + sep.size(); - } - } protected: /** @@ -667,6 +692,11 @@ class TC_Http */ size_t _headLength; + /** + * 获取版本 + */ + string _version; + /** * http头部内容 */ @@ -989,45 +1019,67 @@ class TC_HttpResponse : public TC_Http /** * @brief 解析应答头. - * + * * @param szBuffer 应答头信息 * @return */ -// void parseResponseHeader(const char* szBuffer, const char* header); - - template - void parseResponseHeader(const ForwardIterator1 &beginIt, const ForwardIterator2 &headerIt) - { - string line = "\r\n"; - auto it = std::search(beginIt, headerIt, line.c_str(), line.c_str() + line.size()); - assert(it != headerIt); - string sep = " "; - auto f1 = std::search(beginIt, headerIt, sep.c_str(), sep.c_str() + sep.size()); - if(f1 == headerIt) - { - throw TC_HttpResponse_Exception("[TC_HttpResponse_Exception::parseResponeHeader] http response parse version format error : " + string(beginIt, it)); - } - auto f2 = std::search(f1 + 1, headerIt, sep.c_str(), sep.c_str() + sep.size()); - if(f1 == headerIt) - { - throw TC_HttpResponse_Exception("[TC_HttpResponse_Exception::parseResponeHeader] http response parse status format error : " + string(beginIt, it)); - } - _headerLine = string(beginIt, it); - if(TC_Port::strncasecmp(_headerLine.c_str(), "HTTP/", 5) != 0) - { - throw TC_HttpResponse_Exception("[TC_HttpResponse_Exception::parseResponeHeader] http response version is not start with 'HTTP/' : " + _headerLine); - } - _version = string(beginIt, f1); - _status = TC_Common::strto(string(f1 + 1, f2)); - _about = TC_Common::trim(string(f2 + 1, it)); - parseHeader(beginIt, headerIt, _headers); - } +// /** +// * +// * @param szBuffer +// */ +// template +// void parseResponseHeader(const ForwardIterator1 &beginIt, const ForwardIterator2 &headerIt) +// { +// string line = "\r\n"; +// +// auto it = std::search(beginIt, headerIt, line.c_str(), line.c_str() + line.size()); +// +// assert(it != headerIt); +// +// string sep = " "; +// +// auto f1 = std::search(beginIt, headerIt, sep.c_str(), sep.c_str() + sep.size()); +// if(f1 == headerIt) +// { +// throw TC_HttpResponse_Exception("[TC_HttpResponse_Exception::parseResponeHeader] http response parse version format error : " + string(beginIt, it)); +// } +// +// auto f2 = std::search(f1 + 1, headerIt, sep.c_str(), sep.c_str() + sep.size()); +// if(f1 == headerIt) +// { +// throw TC_HttpResponse_Exception("[TC_HttpResponse_Exception::parseResponeHeader] http response parse status format error : " + string(beginIt, it)); +// } +// +// _headerLine = string(beginIt, it); +// +// if(TC_Port::strncasecmp(_headerLine.c_str(), "HTTP/", 5) != 0) +// { +// throw TC_HttpResponse_Exception("[TC_HttpResponse_Exception::parseResponeHeader] http response version is not start with 'HTTP/' : " + _headerLine); +// } +// +// _version = string(beginIt, f1); +// +// _status = TC_Common::strto(string(f1 + 1, f2)); +// +// _about = TC_Common::trim(string(f2 + 1, it)); +// +// parseHeader(beginIt, headerIt, _headers); +// } + + size_t parseResponseHeaderString(const char *beginIt, const char *headerIt); + protected: /** - * 添加内容, 增量解析用到 + * 添加内容 * @param sBuffer */ void addContent(const string &sBuffer); + + /** + * 添加内容 + * @param buffer + * @param length + */ void addContent(const char *buffer, size_t length); protected: @@ -1042,11 +1094,6 @@ class TC_HttpResponse : public TC_Http */ string _about; - /** - * 获取版本 - */ - string _version; - /** * 获取第一行 */ @@ -1089,11 +1136,12 @@ class TC_HttpRequest : public TC_Http REQUEST_PUT, REQUEST_DELETE, REQUEST_PATCH, + REQUEST_PRI, }; /** * @brief 检查http请求是否收全. - * + * * @param sBuffer http请求 * @throws TC_HttpRequest_Exception, 不支持的http协议, 抛出异常 * @return true: 收全, false:不全 @@ -1142,7 +1190,16 @@ class TC_HttpRequest : public TC_Http */ bool decode(const string &sBuffer); - /** + /** + * @brief 解析http请求, 如果不是HTTP请求则抛出异常. + * + * @param sBuffer 要解析的http请求 + * @return sBuffer是否是完整的http请求 + * @throw TC_HttpRequest_Exception + */ + bool decode(const vector &sBuffer); + + /** * @brief 解析http请求, * 如果不是HTTP请求则抛出异常(采用vector方式). * @@ -1276,6 +1333,12 @@ class TC_HttpRequest : public TC_Http */ void setRequestType(int requestType) { _requestType = requestType ; } + /** + * get method + * @return + */ + const string &getMethod() const; + /** * set method * @param @@ -1335,10 +1398,9 @@ class TC_HttpRequest : public TC_Http * @return 是delete请求返回true,否则返回false */ bool isDELETE() const { return _requestType == REQUEST_DELETE; } - /** * @brief 获取请求的URL. - * + * * @return const TC_URL& */ const TC_URL &getURL() const { return _httpURL; } @@ -1379,13 +1441,13 @@ class TC_HttpRequest : public TC_Http */ void parseRequestHeader(const char* szBuffer, const char *header); - /** - * @brief 请求类型到字符串. - * - * @param iRequestType 请求 - * @return 解析后的字符串 - */ - string requestType2str(int iRequestType) const; +// /** +// * @brief 请求类型到字符串. +// * +// * @param iRequestType 请求 +// * @return 解析后的字符串 +// */ +// const char *requestType2str(int iRequestType) const; protected: @@ -1396,7 +1458,7 @@ class TC_HttpRequest : public TC_Http * @param iRequestType 编码后的输出流 * @return void */ - void encode(int iRequestType, ostream &os); +// void encode(int iRequestType, ostream &os); /** * @brief 解析URL diff --git a/util/include/util/tc_http2.h b/util/include/util/tc_http2.h index c465fd17..0aacd569 100644 --- a/util/include/util/tc_http2.h +++ b/util/include/util/tc_http2.h @@ -198,11 +198,12 @@ class TC_Http2Client : public TC_Http2 * @param buff * @return */ - int submit(const string &method, const string &path, const map &header, const vector &buff); +// int submit(const string &method, const string &path, const map &header, const vector &buff); + int submit(const TC_HttpRequest &request); - /** - * @brief response - */ + /** + * @brief response + */ std::unordered_map> &responses() { return _responses; } /** diff --git a/util/include/util/tc_logger.h b/util/include/util/tc_logger.h index 4d7aaa54..2237bc8e 100644 --- a/util/include/util/tc_logger.h +++ b/util/include/util/tc_logger.h @@ -134,7 +134,8 @@ namespace tars /** * @brief 具体写日志基类 */ - class TC_LoggerRoll : public TC_HandleBase + + class UTIL_DLL_API TC_LoggerRoll : public TC_HandleBase { public: /** @@ -1231,7 +1232,7 @@ namespace tars //抛异常前继续进入_t 以便打远程日志 _t(_of, buffer); - TARS_THROW_EXCEPTION_SYSCODE(TC_Logger_Exception, "[TC_RollBySize::roll]:fopen fail: " + sLogFileName); + THROW_EXCEPTION_SYSCODE(TC_Logger_Exception, "[TC_RollBySize::roll]:fopen fail: " + sLogFileName); // throw TC_Logger_Exception("[TC_RollBySize::roll]:fopen fail: " + sLogFileName, TC_Exception::getSystemCode()); } } @@ -1281,7 +1282,7 @@ namespace tars _of.open(sLogFileName.c_str(), ios::app); if (!_of) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Logger_Exception, "[TC_RollBySize::roll]:fopen fail: " + sLogFileName); + THROW_EXCEPTION_SYSCODE(TC_Logger_Exception, "[TC_RollBySize::roll]:fopen fail: " + sLogFileName); // throw TC_Logger_Exception("[TC_RollBySize::roll]:fopen fail: " + sLogFileName, TC_Exception::getSystemCode()); } } @@ -1329,16 +1330,16 @@ namespace tars /** * @brief 根据时间滚动日志分隔类型 */ - class TarsLogType : public TC_HandleBase + class LogType : public TC_HandleBase { public: - TarsLogType() : _next_time_t(0), _format("%Y%m%d"), _frequency(1), _des("day") + LogType() : _next_time_t(0), _format("%Y%m%d"), _frequency(1), _des("day") { _next_time_t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); _next_cut_time = TC_Common::tm2str(_next_time_t, "%Y%m%d"); } - virtual ~TarsLogType() {} + virtual ~LogType() {} //频率值 virtual size_t frequence() = 0; @@ -1391,15 +1392,15 @@ namespace tars size_t _frequency; string _des; }; - typedef TC_AutoPtr TarsLogTypePtr; + typedef TC_AutoPtr LogTypePtr; - class TarsLogByDay : public TarsLogType + class LogByDay : public LogType { public: static const string FORMAT; public: - explicit TarsLogByDay(const string &format = "%Y%m%d", size_t frequency = 1) + explicit LogByDay(const string &format = "%Y%m%d", size_t frequency = 1) { init(format, frequency); _des = TC_Common::tostr(_frequency) + "day"; @@ -1411,13 +1412,13 @@ namespace tars } }; - class TarsLogByHour : public TarsLogType + class LogByHour : public LogType { public: static const string FORMAT; public: - explicit TarsLogByHour(const string &format = "%Y%m%d%H", size_t frequency = 1) + explicit LogByHour(const string &format = "%Y%m%d%H", size_t frequency = 1) { init(format, frequency); _des = TC_Common::tostr(_frequency) + "hour"; @@ -1430,13 +1431,13 @@ namespace tars } }; - class TarsLogByMinute : public TarsLogType + class LogByMinute : public LogType { public: static const string FORMAT; public: - explicit TarsLogByMinute(const string &format = "%Y%m%d%H%M", size_t frequency = 1) + explicit LogByMinute(const string &format = "%Y%m%d%H%M", size_t frequency = 1) { init(format, frequency); _des = TC_Common::tostr(_frequency) + "minute"; @@ -1470,10 +1471,10 @@ namespace tars * @param format,日志文件记录格式,按天,小时,分钟 * @param bHasSufix,日志文件是否添加".log"后缀 * @param sConcatstr,日志路径和时间字串之间的连接符,例如:app_log/test_20121210.log - * @param logTypePtr,日志记录类型,详见TarsLogType + * @param logTypePtr,日志记录类型,详见LogType * @param bIsRemote,是否是远程日志实例 */ - void init(const string &path, const string &format = "%Y%m%d", bool bHasSufix = true, const string &sConcatstr = "_", const TarsLogTypePtr &logTypePtr = NULL, bool bIsRemote = false) + void init(const string &path, const string &format = "%Y%m%d", bool bHasSufix = true, const string &sConcatstr = "_", const LogTypePtr &logTypePtr = NULL, bool bIsRemote = false) { this->_roll->init(path, format, bHasSufix, sConcatstr, logTypePtr, bIsRemote); } @@ -1539,7 +1540,7 @@ namespace tars * @param bIsRemote */ - void init(const string &path, const string &format = "%Y%m%d", bool bHasSufix = true, const string &sConcatstr = "_", const TarsLogTypePtr &logTypePtr = NULL, bool bIsRemote = false) + void init(const string &path, const string &format = "%Y%m%d", bool bHasSufix = true, const string &sConcatstr = "_", const LogTypePtr &logTypePtr = NULL, bool bIsRemote = false) { std::lock_guard lock(*this); @@ -1692,7 +1693,7 @@ namespace tars { //抛异常前继续进入_t 以便打远程日志 _t(_of, buffer); - TARS_THROW_EXCEPTION_SYSCODE(TC_Logger_Exception, "[TC_RollByTime::roll]:fopen fail: " + sLogFileName); + THROW_EXCEPTION_SYSCODE(TC_Logger_Exception, "[TC_RollByTime::roll]:fopen fail: " + sLogFileName); // throw TC_Logger_Exception("[TC_RollByTime::roll]:fopen fail: " + sLogFileName, TC_Exception::getSystemCode()); } } @@ -1744,7 +1745,7 @@ namespace tars * 按天/小时/分钟输出日志时的记录类型 */ - TarsLogTypePtr _logTypePtr; + LogTypePtr _logTypePtr; /** * 是否是远程日志实例 */ diff --git a/util/include/util/tc_network_buffer.h b/util/include/util/tc_network_buffer.h index f5864231..d8904a98 100755 --- a/util/include/util/tc_network_buffer.h +++ b/util/include/util/tc_network_buffer.h @@ -368,11 +368,17 @@ class TC_NetWorkBuffer } } - /** - * 获取connection, 不同服务模型中获取的对象不一样, 需要自己强制转换 - * @param buff - */ - void* getConnection() { return _connection; } + /** + * 获取connection, 不同服务模型中获取的对象不一样, 需要自己强制转换 + * @param buff + */ + void* getConnection() { return _connection; } + + /** + * 获取connection, 不同服务模型中获取的对象不一样, 需要自己强制转换 + * @param buff + */ + void setConnection(void *connection) { _connection = connection; } /** * 设置上下文数据, 可以业务存放数据 diff --git a/util/include/util/tc_openssl.h b/util/include/util/tc_openssl.h index 367829ac..ba48097b 100644 --- a/util/include/util/tc_openssl.h +++ b/util/include/util/tc_openssl.h @@ -77,7 +77,7 @@ class TC_OpenSSL * @param verifyClient * @return */ - static shared_ptr newCtx(const std::string& cafile, const std::string& certfile, const std::string& keyfile, bool verifyClient); + static shared_ptr newCtx(const std::string& cafile, const std::string& certfile, const std::string& keyfile, bool verifyClient, const string &ciphers); /** * new ssl diff --git a/util/include/util/tc_platform.h b/util/include/util/tc_platform.h index 5e344544..3ff48dc7 100644 --- a/util/include/util/tc_platform.h +++ b/util/include/util/tc_platform.h @@ -43,4 +43,43 @@ #include #endif + +//UTIL 动态库编译的导入和导出 +#if TARGET_PLATFORM_WINDOWS + +#ifdef UTIL_DLL_EXPORT +#define UTIL_DLL_API __declspec(dllexport) +#else + +#ifdef UTIL_USE_DLL +#define UTIL_DLL_API __declspec(dllimport) +#else +#define UTIL_DLL_API +#endif + +#endif + +#else +#define UTIL_DLL_API +#endif + +//servant 动态库编译的导入和导出 +#if TARGET_PLATFORM_WINDOWS + +#ifdef SVT_DLL_EXPORT +#define SVT_DLL_API __declspec(dllexport) +#else + +#ifdef SVT_USE_DLL +#define SVT_DLL_API __declspec(dllimport) +#else +#define SVT_DLL_API +#endif + +#endif + +#else +#define SVT_DLL_API +#endif + #endif diff --git a/util/include/util/tc_singleton.h b/util/include/util/tc_singleton.h index 615b8522..ac8436d3 100644 --- a/util/include/util/tc_singleton.h +++ b/util/include/util/tc_singleton.h @@ -163,9 +163,35 @@ class CreateStatic } }; +template +class CreateRealStatic +{ +public: + /** + * @brief 创建. + * + * @return T* + */ + static T* create() + { + static T t; + return &t; + } + + /** + * @brief 释放. + * + * @param t + */ + static void destroy(T *t) + { + } +}; + //////////////////////////////////////////////////////////////// /** * @brief 定义LifetimePolicy:定义对象的声明周期管理 + * 进程退出时销毁对象 */ template class DefaultLifetime @@ -182,6 +208,12 @@ class DefaultLifetime } }; +/** + * @brief, + * 对象被销毁后可以重生(比如log,全局任何时候都需要) + * + * @author jarod (7/29/2015) + */ template class PhoneixLifetime { @@ -202,10 +234,15 @@ class PhoneixLifetime template bool PhoneixLifetime::_bDestroyedOnce = false; -template -struct NoDestroyLifetime -{ - static void scheduleDestruction(T*, void (*)()) +/** + * @brief 不做对象销毁 + * + * @author jarod (7/29/2015) + */ +template +struct NoDestroyLifetime +{ + static void scheduleDestruction(T*, void (*)()) { } @@ -237,56 +274,54 @@ class TC_Singleton */ static T *getInstance() { - //加锁, 双check机制, 保证正确和效率 - if(!_pInstance) - { - TC_ThreadLock::Lock lock(_tl); - if(!_pInstance) - { - if(_destroyed) + static std::mutex __mutex_singleton; + + auto sin= __pInstance.load(); + if ( !sin ){ + std::lock_guard myLock(__mutex_singleton); + sin= __pInstance.load(); + if( !sin ){ + if(__destroyed) { LifetimePolicy::deadReference(); - _destroyed = false; + __destroyed = false; } - _pInstance = CreatePolicy::create(); - LifetimePolicy::scheduleDestruction((T*)_pInstance, &destroySingleton); + + sin = CreatePolicy::create(); + __pInstance.store(sin); + LifetimePolicy::scheduleDestruction(__pInstance, &destroySingleton); } } - - return (T*)_pInstance; + + return sin; } - -protected: + virtual ~TC_Singleton(){}; + +protected: static void destroySingleton() { - assert(!_destroyed); - CreatePolicy::destroy((T*)_pInstance); - _pInstance = NULL; - _destroyed = true; + assert(!__destroyed); + CreatePolicy::destroy((T*)__pInstance); + __pInstance = NULL; + __destroyed = true; } protected: - static TC_ThreadLock _tl; - static volatile T* _pInstance; - static bool _destroyed; + static atomic __pInstance; + static bool __destroyed; protected: - TC_Singleton(){} - virtual ~TC_Singleton(){}; - TC_Singleton (const TC_Singleton &); - TC_Singleton &operator=(const TC_Singleton &); + TC_Singleton() = default; + TC_Singleton (const TC_Singleton &) = default; + TC_Singleton &operator=(const TC_Singleton &) = default; }; -template class CreatePolicy, template class LifetimePolicy> -TC_ThreadLock TC_Singleton::_tl; - -template class CreatePolicy, template class LifetimePolicy> -bool TC_Singleton::_destroyed = false; - -template class CreatePolicy, template class LifetimePolicy> -volatile T* TC_Singleton::_pInstance = NULL; +template class CreatePolicy, template class LifetimePolicy> +bool TC_Singleton::__destroyed = false; +template class CreatePolicy, template class LifetimePolicy> +atomic TC_Singleton::__pInstance = {nullptr}; } #endif diff --git a/util/include/util/tc_spin_lock.h b/util/include/util/tc_spin_lock.h index 1bb3ec39..a2f9d29f 100755 --- a/util/include/util/tc_spin_lock.h +++ b/util/include/util/tc_spin_lock.h @@ -2,6 +2,7 @@ #ifndef __TC_SPIN_LOCK_H #define __TC_SPIN_LOCK_H +#include "util/tc_platform.h" #include #include @@ -15,7 +16,7 @@ namespace tars * 不能阻塞wait, 只能快速加解锁, 适用于锁粒度非常小的情况, 减小线程切换的开销 * 不支持trylock */ -class TC_SpinLock +class UTIL_DLL_API TC_SpinLock { public: diff --git a/util/include/util/tc_thread_mutex.h b/util/include/util/tc_thread_mutex.h index 53711ff2..e95913e2 100644 --- a/util/include/util/tc_thread_mutex.h +++ b/util/include/util/tc_thread_mutex.h @@ -18,6 +18,7 @@ #define __TC_THREAD_MUTEX_H #include "util/tc_lock.h" +#include "util/tc_platform.h" #include #include @@ -41,7 +42,7 @@ class TC_ThreadCond; * * 通常不直接使用,和TC_Monitor配合使用,即TC_ThreadLock; */ -class TC_ThreadMutex +class UTIL_DLL_API TC_ThreadMutex { public: @@ -68,8 +69,8 @@ class TC_ThreadMutex protected: // noncopyable - TC_ThreadMutex(const TC_ThreadMutex&); - void operator=(const TC_ThreadMutex&); + TC_ThreadMutex(const TC_ThreadMutex&) = delete; + void operator=(const TC_ThreadMutex&) = delete; friend class TC_ThreadCond; @@ -82,7 +83,7 @@ class TC_ThreadMutex * * 采用线程库实现 **/ -class TC_ThreadRecMutex +class UTIL_DLL_API TC_ThreadRecMutex { public: diff --git a/util/include/util/tc_thread_rwlock.h b/util/include/util/tc_thread_rwlock.h index 2a6d6e57..3f5a48be 100644 --- a/util/include/util/tc_thread_rwlock.h +++ b/util/include/util/tc_thread_rwlock.h @@ -20,6 +20,7 @@ #include #include #include "util/tc_lock.h" +#include "util/tc_platform.h" #include using namespace std; @@ -36,7 +37,7 @@ namespace tars ///////////////////////////////////////////////// -class TC_ThreadRWLocker +class UTIL_DLL_API TC_ThreadRWLocker { protected: diff --git a/util/include/util/tc_timeout_queue_new.h b/util/include/util/tc_timeout_queue_new.h index 684f8346..6d5f7753 100644 --- a/util/include/util/tc_timeout_queue_new.h +++ b/util/include/util/tc_timeout_queue_new.h @@ -17,9 +17,10 @@ #ifndef __TC_TIMEOUT_QUEUE_NEW_H #define __TC_TIMEOUT_QUEUE_NEW_H -#include #include #include +#include +// #include #include #include #include @@ -53,7 +54,7 @@ class TC_TimeoutQueueNew typedef multimap time_type; typedef list send_type; - using data_functor = std::function; + typedef std::function data_functor; struct PtrInfo { diff --git a/util/include/util/tc_timeout_queue_noid.h b/util/include/util/tc_timeout_queue_noid.h index 2a735250..cf21276f 100644 --- a/util/include/util/tc_timeout_queue_noid.h +++ b/util/include/util/tc_timeout_queue_noid.h @@ -69,6 +69,10 @@ class TC_TimeoutQueueNoID { } + typename list_type::iterator begin() { return _list.begin(); } + typename list_type::iterator end() { return _list.end(); } + + /** * @brief 取出队列第一个数据 * diff --git a/util/include/util/tc_timeprovider.h b/util/include/util/tc_timeprovider.h index 6163a93e..5b699243 100644 --- a/util/include/util/tc_timeprovider.h +++ b/util/include/util/tc_timeprovider.h @@ -42,7 +42,7 @@ class TC_TimeProvider; /** * @brief 提供秒级别的时间 */ -class TC_TimeProvider +class UTIL_DLL_API TC_TimeProvider { public: diff --git a/util/src/tc_cgi.cpp b/util/src/tc_cgi.cpp index 1698b355..997f6464 100644 --- a/util/src/tc_cgi.cpp +++ b/util/src/tc_cgi.cpp @@ -371,7 +371,7 @@ bool TC_Cgi::writeFile(FILE*fp, const string &sFileName, const string &sBuffer, if(ret != (int)sBuffer.length()) { fclose(fp); - throw TC_Cgi_Exception("[TC_Cgi::parseFormData] upload file '" + _mpUpload[sFileName]._sServerFileName + "' error:" + string(strerror(errno))); + throw TC_Cgi_Exception("[TC_Cgi::parseFormData] upload file '" + _mpUpload[sFileName]._sServerFileName + "' error", TC_Exception::getSystemCode()); } iTotalWrite += sBuffer.length(); _mpUpload[sFileName]._iSize = iTotalWrite; @@ -438,7 +438,8 @@ void TC_Cgi::parseFormData(multimap &mmpParams, const string &sB if ( (fp = fopen(sUploadFileName.c_str(),"w")) == NULL) { mmpParams.clear(); //clear , exception safe - throw TC_Cgi_Exception("[TC_Cgi::parseFormData] Upload File '" + sValue + "' to '" + sUploadFileName +"' error! " + string(strerror(errno))); + THROW_EXCEPTION_SYSCODE(TC_Cgi_Exception, "[TC_Cgi::parseFormData] Upload File '" + sValue + "' to '" + sUploadFileName +"' error"); + // throw TC_Cgi_Exception("[TC_Cgi::parseFormData] Upload File '" + sValue + "' to '" + sUploadFileName +"' error! " + string(strerror(errno))); } } else diff --git a/util/src/tc_config.cpp b/util/src/tc_config.cpp index f9631d34..c1cc06a2 100644 --- a/util/src/tc_config.cpp +++ b/util/src/tc_config.cpp @@ -525,7 +525,8 @@ void TC_Config::parseFile(const string &sFileName) ff.open(sFileName.c_str()); if (!ff) { - throw TC_Config_Exception("[TC_Config::parseFile]:fopen fail: " + sFileName, errno); + THROW_EXCEPTION_SYSCODE(TC_Config_Exception, "[TC_Config::parseFile]:fopen fail: " + sFileName); + // throw TC_Config_Exception("[TC_Config::parseFile]:fopen fail: " + sFileName, TC_Exception::getSystemCode()); } parse(ff); diff --git a/util/src/tc_encoder.cpp b/util/src/tc_encoder.cpp index 3a16c920..bb243250 100644 --- a/util/src/tc_encoder.cpp +++ b/util/src/tc_encoder.cpp @@ -152,7 +152,7 @@ string TC_Encoder::gbk2utf8(const string &sIn) cd = iconv_open("UTF-8","GBK"); if (cd == (iconv_t)-1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Encoder_Exception, "[TC_Encoder::gbk2utf8] iconv_open error"); + THROW_EXCEPTION_SYSCODE(TC_Encoder_Exception, "[TC_Encoder::gbk2utf8] iconv_open error"); // throw TC_Encoder_Exception("[TC_Encoder::gbk2utf8] iconv_open error", TC_Exception::getSystemCode()); } @@ -212,7 +212,7 @@ void TC_Encoder::gbk2utf8(const string &sIn, vector &vtStr) cd = iconv_open("UTF-8","GBK"); if (cd == (iconv_t)-1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Encoder_Exception, "[TC_Encoder::gbk2utf8] iconv_open error"); + THROW_EXCEPTION_SYSCODE(TC_Encoder_Exception, "[TC_Encoder::gbk2utf8] iconv_open error"); // throw TC_Encoder_Exception("[TC_Encoder::gbk2utf8] iconv_open error", TC_Exception::getSystemCode()); } @@ -321,7 +321,7 @@ void TC_Encoder::utf82gbk(char *sOut, int &iMaxOutLen, const char *sIn, int iInL cd = iconv_open("GBK","UTF-8"); if (cd == (iconv_t)-1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Encoder_Exception, "[TC_Encoder::utf82gbk] iconv_open error"); + THROW_EXCEPTION_SYSCODE(TC_Encoder_Exception, "[TC_Encoder::utf82gbk] iconv_open error"); // throw TC_Encoder_Exception("[TC_Encoder::utf82gbk] iconv_open error", TC_Exception::getSystemCode()); } @@ -335,7 +335,7 @@ void TC_Encoder::utf82gbk(char *sOut, int &iMaxOutLen, const char *sIn, int iInL { iMaxOutLen = 0; iconv_close(cd); - TARS_THROW_EXCEPTION_SYSCODE(TC_Encoder_Exception, "[TC_Encoder::utf82gbk] iconv error"); + THROW_EXCEPTION_SYSCODE(TC_Encoder_Exception, "[TC_Encoder::utf82gbk] iconv error"); // throw TC_Encoder_Exception("[TC_Encoder::utf82gbk] iconv error", TC_Exception::getSystemCode()); return; } diff --git a/util/src/tc_epoll_server.cpp b/util/src/tc_epoll_server.cpp index a09cdc3c..b15a5fef 100644 --- a/util/src/tc_epoll_server.cpp +++ b/util/src/tc_epoll_server.cpp @@ -305,8 +305,6 @@ TC_EpollServer::BindAdapter::BindAdapter(TC_EpollServer *pEpollServer) TC_EpollServer::BindAdapter::~BindAdapter() { - //adapter析够的时候, 服务要退出 - // _pEpollServer->terminate(); } void TC_EpollServer::BindAdapter::setProtocolName(const string& name) @@ -614,7 +612,7 @@ const vector &TC_EpollServer::BindAdapter::getDeny() const bool TC_EpollServer::BindAdapter::isLimitMaxConnection() const { - return (_iCurConns + 1 > _iMaxConns) || (_iCurConns + 1 > (int)((uint32_t)1 << 22) - 1); + return (_iCurConns + 1 > (size_t)_iMaxConns) || (_iCurConns + 1 > (int)((uint32_t)1 << 22) - 1); } void TC_EpollServer::BindAdapter::decreaseNowConnection() @@ -1049,7 +1047,7 @@ int TC_EpollServer::Connection::sendBuffer() { _sendBuffer.moveHeader(iBytesSent); - if (iBytesSent == (int)data.second) + if (iBytesSent == data.second) { _pBindAdapter->decreaseSendBufferSize(); } @@ -1179,7 +1177,7 @@ int TC_EpollServer::Connection::sendBuffer() // //int TC_EpollServer::Connection::sendTcp(const shared_ptr &sc) //{ -//#if TAF_SSL +//#if TARS_SSL // if (getBindAdapter()->getEndpoint().isSSL()) // { // assert(_openssl->isHandshaked()); @@ -1223,7 +1221,7 @@ int TC_EpollServer::Connection::send(const shared_ptr &sc) _pBindAdapter->increaseSendBufferSize(); -#if TAF_SSL +#if TARS_SSL if (getBindAdapter()->getEndpoint().isSSL()) { assert(_openssl->isHandshaked()); diff --git a/util/src/tc_epoller.cpp b/util/src/tc_epoller.cpp index 8951ffb9..ec74b09d 100644 --- a/util/src/tc_epoller.cpp +++ b/util/src/tc_epoller.cpp @@ -117,7 +117,15 @@ void TC_Epoller::ctrl(SOCKET_TYPE fd, uint64_t data, uint32_t events, int op) EV_SET64(&ev[n++], fd, EVFILT_WRITE, op | EV_CLEAR, 0, 0, data, 0, 0); } - kevent64(_iEpollfd, ev, n, nullptr, 0, 0, nullptr); + int ret = kevent64(_iEpollfd, ev, n, nullptr, 0, 0, nullptr); + + if(ret == -1) + { + //一般都是析构的时候出现,有需要close就行 +// cerr << "[TC_Epoller::ctrl] error, fd:" << fd << ", errno:" << errno << "|"<< strerror(errno) << endl; + ::close(_iEpollfd); + _iEpollfd = 0; + } } #else diff --git a/util/src/tc_file.cpp b/util/src/tc_file.cpp index fd1568f2..3a9382aa 100644 --- a/util/src/tc_file.cpp +++ b/util/src/tc_file.cpp @@ -176,7 +176,7 @@ string TC_File::getExePath() if ( count < 0 ) { - TARS_THROW_EXCEPTION_SYSCODE(TC_File_Exception, "[TC_File::getExePath] could not get exe path error"); + THROW_EXCEPTION_SYSCODE(TC_File_Exception, "[TC_File::getExePath] could not get exe path error"); // throw TC_File_Exception("[TC_File::getExePath] could not get exe path error", TC_Exception::getSystemCode()); } @@ -711,12 +711,12 @@ void TC_File::copyFile(const string &sExistFile, const string &sNewFile,bool bRe std::ifstream fin(sExistFile.c_str(), ios::binary); if(!fin) { - TARS_THROW_EXCEPTION_SYSCODE(TC_File_Exception, "[TC_File::copyFile] error: "+sExistFile); + THROW_EXCEPTION_SYSCODE(TC_File_Exception, "[TC_File::copyFile] error: "+sExistFile); } std::ofstream fout(sNewFile.c_str(), ios::binary); if(!fout ) { - TARS_THROW_EXCEPTION_SYSCODE(TC_File_Exception, "[TC_File::copyFile] error: "+sNewFile); + THROW_EXCEPTION_SYSCODE(TC_File_Exception, "[TC_File::copyFile] error: "+sNewFile); } fout << fin.rdbuf(); @@ -726,7 +726,7 @@ void TC_File::copyFile(const string &sExistFile, const string &sNewFile,bool bRe TC_Port::stat_t f_stat; if (TC_Port::lstat(sExistFile.c_str(), &f_stat) == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_File_Exception, "[TC_File::copyFile] error: "+sExistFile); + THROW_EXCEPTION_SYSCODE(TC_File_Exception, "[TC_File::copyFile] error: "+sExistFile); } TC_Port::chmod(sNewFile.c_str(),f_stat.st_mode); diff --git a/util/src/tc_http.cpp b/util/src/tc_http.cpp index f9e22d14..f0887d80 100755 --- a/util/src/tc_http.cpp +++ b/util/src/tc_http.cpp @@ -19,13 +19,56 @@ #include "util/tc_common.h" #include "util/tc_clientsocket.h" #include "util/tc_network_buffer.h" +#include namespace tars { +const char* strnstr(const char* s1, const char* s2, int pos1) +{ + int l1, l2; + + l2 = strlen(s2); + if (!l2) + return (char *)s1; + l1 = strlen(s1); + + pos1 = (pos1 > l1)?l1:pos1; + + while (pos1 >= l2) { + pos1--; + if (!memcmp(s1, s2, l2)) + return (char *)s1; + s1++; + } + return NULL; +} + +unordered_map TC_Http::HEADER = { + {"GET", TC_HttpRequest::REQUEST_GET}, + {"POST", TC_HttpRequest::REQUEST_POST}, + {"PUT", TC_HttpRequest::REQUEST_PUT}, + {"PATCH", TC_HttpRequest::REQUEST_PATCH}, + {"OPTIONS", TC_HttpRequest::REQUEST_OPTIONS}, + {"PRI", TC_HttpRequest::REQUEST_PRI}, + {"DELETE", TC_HttpRequest::REQUEST_DELETE}, + {"HEAD", TC_HttpRequest::REQUEST_HEAD}, +}; + +unordered_map TC_Http::HEADER_REVERSE = { + {TC_HttpRequest::REQUEST_GET, "GET"}, + {TC_HttpRequest::REQUEST_POST, "POST"}, + {TC_HttpRequest::REQUEST_PUT, "PUT"}, + {TC_HttpRequest::REQUEST_PATCH, "PATCH"}, + {TC_HttpRequest::REQUEST_OPTIONS, "OPTIONS"}, + {TC_HttpRequest::REQUEST_PRI, "PRI"}, + {TC_HttpRequest::REQUEST_DELETE, "DELETE"}, + {TC_HttpRequest::REQUEST_HEAD, "HEAD"}, +}; + + bool TC_Http::CmpCase::operator()(const string &s1, const string &s2) const { - //return TC_Common::upper(s1) < TC_Common::upper(s2); if (TC_Port::strcasecmp(s1.c_str(), s2.c_str()) < 0) { return true; @@ -129,9 +172,9 @@ string TC_URL::getRequest() const return sURL; } -bool TC_URL::parseURL(const string &sURL) +bool TC_URL::parseURL(const string &originRequest) { - string originRequest = TC_Common::trim(sURL, " "); + // string originRequest = TC_Common::trim(sURL, " "); if (originRequest.empty()) { @@ -532,6 +575,28 @@ void TC_Http::setHeader(const string &sHeadName, const string &sHeadValue) _headers.insert(multimap::value_type(sHeadName, sHeadValue)); } +bool TC_Http::hasHeader(const char *sHeader) const +{ + http_header_type::const_iterator it = _headers.find(sHeader); + if (it == _headers.end()) + { + return false; + } + + return true; +} + +bool TC_Http::checkHeader(const char *sHeader, const char *value) const +{ + http_header_type::const_iterator it = _headers.find(sHeader); + if (it == _headers.end()) + { + return false; + } + + return TC_Port::strcasecmp(it->second.c_str(), value) == 0; +} + string TC_Http::getHeader(const string& sHeader) const { http_header_type::const_iterator it = _headers.find(sHeader); @@ -566,8 +631,24 @@ size_t TC_Http::getContentLength() const string TC_Http::genHeader() const { - string sHttpHeader; + string sHttpHeader; + + for (http_header_type::const_iterator it = _headers.begin(); it != _headers.end(); ++it) + { + if (it->second != "") + { + sHttpHeader += it->first; + sHttpHeader += ": "; + sHttpHeader += it->second; + sHttpHeader += "\r\n"; + } + } + + return sHttpHeader; +} +void TC_Http::genHeader(string &sHttpHeader) const +{ for (http_header_type::const_iterator it = _headers.begin(); it != _headers.end(); ++it) { if (it->second != "") @@ -578,8 +659,6 @@ string TC_Http::genHeader() const sHttpHeader += "\r\n"; } } - - return sHttpHeader; } vector TC_Http::getHeaderMulti(const string &sHeadName) const @@ -598,174 +677,11 @@ vector TC_Http::getHeaderMulti(const string &sHeadName) const return v; } -// -//string TC_Http::getLine(const char** ppChar) -//{ -// string sTmp; -// -// sTmp.reserve(512); -// -// while ((**ppChar) != '\r' && (**ppChar) != '\n' && (**ppChar) != '\0') -// { -// sTmp.append(1, (**ppChar)); -// (*ppChar)++; -// } -// -// if ((**ppChar) == '\r') -// { -// (*ppChar)++; /* pass the char '\n' */ -// } -// -// (*ppChar)++; -// -// return sTmp; -//} -// -// -//string TC_Http::getLine(const char** ppChar, int iBufLen) -//{ -// string sTmp; -// -// sTmp.reserve(512); -// -// int iCurIndex = 0; -// while ( (**ppChar) != '\r' && (**ppChar) != '\n' && (**ppChar) != '\0') -// { -// if ( iCurIndex < iBufLen ) -// { -// sTmp.append(1, (**ppChar)); -// (*ppChar)++; -// iCurIndex++; -// } -// else -// { -// //MTT_ERRDAY << "parseHttp WARN: iCurIndex < iBufLen 1 " << endl; -// break; -// } -// } -// -// if ( (**ppChar) == '\r') -// { -// if ( iCurIndex < iBufLen ) -// { -// (*ppChar)++; /* pass the char '\n' */ -// iCurIndex++; -// } -// else -// { -// //MTT_ERRDAY << "parseHttp WARN: iCurIndex < iBufLen 2 " << endl; -// } -// } -// -// if ( iCurIndex < iBufLen ) -// { -// (*ppChar)++; -// iCurIndex++; -// } -// else -// { -// //MTT_ERRDAY << "parseHttp WARN: iCurIndex < iBufLen 3 " << endl; -// } -// -// return sTmp; -//} - -// -//void TC_Http::parseHeader(const TC_NetWorkBuffer::buffer_iterator &beginIt, const TC_NetWorkBuffer::buffer_iterator &headerIt, http_header_type &sHeader) -//{ -// sHeader.clear(); -// -// string sep = "\r\n"; -// string colon = ":"; -// -// bool first = true; -// auto lineStartIt= beginIt; -// -// while (true) -// { -// auto it = std::search(lineStartIt, headerIt, sep.c_str(), sep.c_str() + sep.size()); -// if(it == headerIt) -// { -// break; -// } -// -// //first line ignore -// if(!first) -// { -// auto itF = std::search(lineStartIt, it, colon.c_str(), colon.c_str() + colon.size()); -// if (itF != it) -// { -// string name; -// name.resize(itF - lineStartIt); -// std::copy(lineStartIt, itF, name.begin()); -// -// string value; -// value.resize(it - (itF + 1)); -// std::copy(itF + 1, it, value.begin()); -// -// sHeader.insert(multimap::value_type(TC_Common::trim(name, " "), -// TC_Common::trim(value, " "))); -// -// } -// } -// else -// { -// first = false; -// } -// -// lineStartIt = it + sep.size(); -// } -//} -// -//const char* TC_Http::parseHeader(const char* szBuffer, http_header_type &sHeader) -//{ -// sHeader.clear(); -// -// const char **ppChar = &szBuffer; -// -// size_t length = strlen(szBuffer); -// size_t srcPtr = (size_t)(*ppChar); -// -// while (true) -// { -// string sLine = getLine(ppChar); -// -// if (sLine.empty()) break; -// -// //如果是第一行, 则忽略掉 -// if(TC_Port::strncasecmp(sLine.c_str(), "GET ", 4) ==0 -// || TC_Port::strncasecmp(sLine.c_str(), "POST ", 5) ==0 -// || TC_Port::strncasecmp(sLine.c_str(), "PUT ", 4) ==0 -// || TC_Port::strncasecmp(sLine.c_str(), "PATCH ", 6) ==0 -// || TC_Port::strncasecmp(sLine.c_str(), "OPTIONS ", 8) ==0 -// || TC_Port::strncasecmp(sLine.c_str(), "HEAD ", 5) ==0 -// || TC_Port::strncasecmp(sLine.c_str(), "DELETE ", 7) ==0 -// || TC_Port::strncasecmp(sLine.c_str(), "HTTP/", 5) ==0) -// { -// continue; -// } -// -// string::size_type index = sLine.find(":"); -// if (index != string::npos) -// { -// sHeader.insert(multimap::value_type(TC_Common::trim(sLine.substr(0, index), " "), TC_Common::trim(sLine.substr(index + 1), " "))); -// } -// -// size_t offset = (size_t)(*ppChar - srcPtr); -// -// if (offset >= length) -// { -// break; -// } -// } -// -// return *ppChar; -//} - void TC_Http::reset() { _headers.clear(); + _version.clear(); _headLength = 0; _content.clear(); _bIsChunked = false; @@ -1092,17 +1008,17 @@ void TC_HttpCookie::getCookieForURL(const string &sReqURL, list::iterator it = _cookies.begin(); - while(it != _cookies.end()) + while (it != _cookies.end()) { //检查Cookie是否过期 - if(isCookieExpires(*it)) + if (isCookieExpires(*it)) { _cookies.erase(it++); continue; } size_t len = isCookieMatch(*it, tURL); - if(len == 0) + if (len == 0) { ++it; continue; @@ -1123,14 +1039,14 @@ void TC_HttpCookie::getCookieForURL(const string &sReqURL, string &sCookie) getCookieForURL(sReqURL, cookies); list::iterator it = cookies.begin(); - while(it != cookies.end()) + while (it != cookies.end()) { http_cookie_data::iterator itd = it->_data.begin(); - while(itd != it->_data.end()) + while (itd != it->_data.end()) { //被删除的cookie不输出 - if(itd->first != "" && itd->second != "" && TC_Common::lower(itd->second) != "null" + if (itd->first != "" && itd->second != "" && TC_Common::lower(itd->second) != "null" && TC_Common::lower(itd->second) != "deleted") sCookie += itd->first + "=" + itd->second + "; "; @@ -1141,8 +1057,8 @@ void TC_HttpCookie::getCookieForURL(const string &sReqURL, string &sCookie) } //去掉末尾的 "; " - if(sCookie.length() >= 2) - sCookie = sCookie.substr(0, sCookie.length()-2); + if (sCookie.length() >= 2) + sCookie = sCookie.substr(0, sCookie.length() - 2); } list TC_HttpCookie::getSerializeCookie(time_t t) @@ -1151,14 +1067,14 @@ list TC_HttpCookie::getSerializeCookie(time_t t) list::iterator it = _cookies.begin(); - while(it != _cookies.end()) + while (it != _cookies.end()) { - if(isCookieExpires(*it)) + if (isCookieExpires(*it)) { _cookies.erase(it++); continue; } - else if(it->_expires != 0) //非当前会话的 + else if (it->_expires != 0) //非当前会话的 { cookies.push_back(*it); @@ -1168,7 +1084,7 @@ list TC_HttpCookie::getSerializeCookie(time_t t) ++it; } - return cookies; + return cookies; } const list & TC_HttpCookie::getAllCookie() @@ -1182,14 +1098,14 @@ void TC_HttpCookie::deleteExpires(time_t t, bool bErase) { list::iterator it = _cookies.begin(); - while(it != _cookies.end()) + while (it != _cookies.end()) { - if(bErase && it->_expires ==0) + if (bErase && it->_expires == 0) { _cookies.erase(it++); continue; } - else if(isCookieExpires(*it)) + else if (isCookieExpires(*it)) { _cookies.erase(it++); continue; @@ -1284,16 +1200,19 @@ void TC_HttpResponse::reset() _version = "HTTP/1.1"; _iTmpContentLength = 0; + _iRecvContentLength = 0; } vector TC_HttpResponse::getSetCookie() const { - return getHeaderMulti("Set-Cookie"); + return getHeaderMulti("Set-Cookie"); } + void TC_HttpResponse::addContent(const string &sBuffer) { _content += sBuffer; + _iRecvContentLength += sBuffer.length(); } @@ -1304,54 +1223,96 @@ void TC_HttpResponse::addContent(const char *buffer, size_t length) _iRecvContentLength += length; } +size_t TC_HttpResponse::parseResponseHeaderString(const char *beginIt, const char *headerIt) +{ + auto it = strnstr(beginIt, "\r\n", headerIt - beginIt); + + assert(it != NULL); + + auto f1 = strnstr(beginIt, " ", it - beginIt); + if(f1 == NULL) + { + throw TC_HttpResponse_Exception("[TC_HttpResponse_Exception::parseResponeHeader] http response parse version format error : " + string(beginIt, headerIt - beginIt)); + } + + auto f2 = strnstr(f1 + 1, " ", it - (f1 + 1)); + if(f1 == NULL) + { + throw TC_HttpResponse_Exception("[TC_HttpResponse_Exception::parseResponeHeader] http response parse status format error : " + string(beginIt, headerIt - beginIt)); + } + + _headerLine = string(beginIt, it - beginIt); + + if(TC_Port::strncasecmp(_headerLine.c_str(), "HTTP/", 5) != 0) + { + throw TC_HttpResponse_Exception("[TC_HttpResponse_Exception::parseResponeHeader] http response version is not start with 'HTTP/' : " + _headerLine); + } + + _version = string(beginIt, f1 - beginIt); + + _status = TC_Common::strto(string(f1 + 1, f2)); + + _about = string(f2 + 1, it); + + return parseHeaderString(beginIt, headerIt, _headers); +} + bool TC_HttpResponse::incrementDecode(TC_NetWorkBuffer &buff) { + if(buff.empty()) + return false; //解析头部 if (_headLength == 0) { - const static string sep = "\r\n\r\n"; + //至少把header合并成一个buff + buff.mergeBuffers(); - auto sit = std::search(buff.begin(), buff.end(), sep.c_str(), sep.c_str() + sep.size()); + auto data = buff.getBufferPointer(); - if (sit == buff.end()) + const char * p = strnstr(data.first, "\r\n\r\n", data.second); + if(p == NULL) { return false; } - parseResponseHeader(buff.begin(), sit + 2); - - if ( (204 == _status) || (304 == _status) ) - { - return true; - } + _headLength = p - data.first + 4; - http_header_type::const_iterator it = _headers.find("Content-Length"); - if(it != _headers.end()) - { - _iTmpContentLength = getContentLength(); - } - else - { - //没有指明ContentLength, 接收到服务器关闭连接 - _iTmpContentLength = -1; - } + _iTmpContentLength = parseResponseHeaderString(data.first, data.first + data.second + 2); - _headLength = sit - buff.begin() + 4; + //304的返回码中头里本来就没有Content-Length,也不会有数据体,头收全了就是真正的收全了 + if ( (204 == _status) || (304 == _status) ) + { + return true; + } +// +// http_header_type::const_iterator it = _headers.find("Content-Length"); +// if (it != _headers.end()) +// { +// _iTmpContentLength = getContentLength(); +// } +// else +// { +// //没有指明ContentLength, 接收到服务器关闭连接 +// _iTmpContentLength = -1; +// } buff.moveHeader(_headLength); - //重定向就认为成功了 - if((_status == 301 || _status == 302) && !getHeader("Location").empty()) - { - return true; - } - - //是否是chunk编码 - _bIsChunked = (getHeader("Transfer-Encoding") == "chunked"); - - //删除头部里面 - eraseHeader("Transfer-Encoding"); - } + //重定向就认为成功了 + if ((_status == 301 || _status == 302) && hasHeader("Location")) + { + return true; + } +// return true; + + //是否是chunk编码 + _bIsChunked = checkHeader("Transfer-Encoding", "chunked"); +// _bIsChunked = (getHeader("Transfer-Encoding") == "chunked"); + if(_bIsChunked) { + //删除头部里面 + eraseHeader("Transfer-Encoding"); + } + } if (_bIsChunked) { @@ -1443,179 +1404,10 @@ bool TC_HttpResponse::incrementDecode(TC_NetWorkBuffer &buff) return true; } -// -//bool TC_HttpResponse::incrementDecode(string &sBuffer) -//{ -// //解析头部 -// if (_headLength == 0) -// { -// string::size_type pos = sBuffer.find("\r\n\r\n"); -// -// if (pos == string::npos) -// { -// return false; -// } -// -// parseResponseHeader(sBuffer.c_str()); -// -// //304的返回码中头里本来就没有Content-Length,也不会有数据体,头收全了就是真正的收全了 -// if ( (204 == _status) || (304 == _status) ) -// { -// return true; -// } -// -// http_header_type::const_iterator it = _headers.find("Content-Length"); -// if (it != _headers.end()) -// { -// _iTmpContentLength = getContentLength(); -// } -// else -// { -// //没有指明ContentLength, 接收到服务器关闭连接 -// _iTmpContentLength = -1; -// } -// -// _headLength = pos + 4; -// -// sBuffer = sBuffer.substr(_headLength); -// -// //重定向就认为成功了 -// if ((_status == 301 || _status == 302) && !getHeader("Location").empty()) -// { -// return true; -// } -// -// //是否是chunk编码 -// _bIsChunked = (getHeader("Transfer-Encoding") == "chunked"); -// -// //删除头部里面 -// eraseHeader("Transfer-Encoding"); -// } -// -// if (_bIsChunked) -// { -// while (true) -// { -// string::size_type pos = sBuffer.find("\r\n"); -// if (pos == string::npos) -// return false; -// -// //查找当前chunk的大小 -// string sChunkSize = sBuffer.substr(0, pos); -// int iChunkSize = strtol(sChunkSize.c_str(), NULL, 16); -// -// if (iChunkSize <= 0) break; //所有chunk都接收完毕 -// -// if (sBuffer.length() < pos + 2 + (size_t)iChunkSize + 2) -// { -// //没有接收完整的chunk -// return false; -// } -// -// //接收到一个完整的chunk了 -// addContent(sBuffer.substr(pos + 2, iChunkSize)); -// -// //删除一个chunk -// sBuffer = sBuffer.substr(pos + 2 + iChunkSize + 2); -// -// // _content += sBuffer.substr(pos + 2, iChunkSize); -// // //删除一个chunk -// // sBuffer = sBuffer.substr(pos + 2 + iChunkSize + 2); -// // setContentLength(getContent().length()); -// } -// -// sBuffer = ""; -// -// //接收到buffer长度设置好 -// setContentLength(_iRecvContentLength); -// -// return true; -// } -// else -// { -// if (_iTmpContentLength == 0) -// { -// //header长度为0, 但是有body数据 -// addContent(sBuffer); -// -// sBuffer = ""; -// -// setContentLength(_iRecvContentLength); -// -// // _content += sBuffer; -// // sBuffer = ""; -// -// // //自动填写content-length -// // setContentLength(getContent().length()); -// -// return true; -// } -// else if (_iTmpContentLength == (size_t) - 1) -// { -// //304的返回码中头没有Content-Length,不会有数据体 -// if (_status == 304 || _status == 302) -// { -// return true; -// } -// -// //header中没长度, 但是有body数据 -// addContent(sBuffer); -// -// sBuffer = ""; -// -// setContentLength(_iRecvContentLength); -// -// // _content += sBuffer; -// // sBuffer = ""; -// -// // //自动填写content-length -// // setContentLength(getContent().length()); -// -// return false; -// } -// else -// { -// //头部有长度, 接收到长度大于头部为止 -// addContent(sBuffer); -// sBuffer = ""; -// -// // _content += sBuffer; -// // sBuffer = ""; -// -// // size_t iNowLength = getContent().length(); -// -// //头部的长度小于接收的内容, 还需要继续增加解析后续的buffer -// if (_iTmpContentLength > _iRecvContentLength) -// return false; -// -// return true; -// } -// } -// -// return true; - -//} bool TC_HttpResponse::decode(const string &sBuffer) { return decode(sBuffer.c_str(), sBuffer.length()); -// -// string::size_type pos = sBuffer.find("\r\n\r\n"); -// -// if (pos == string::npos) -// { -// return false; -// } -// -// string tmp = sBuffer; -// -// incrementDecode(tmp); -// -// //body内容长度为0或者没有content-length 且 非chunk模式, 则认为包收全了, 直接返回 -// if ((_iTmpContentLength == 0 || _iTmpContentLength == (size_t) - 1) && !_bIsChunked) -// return true; -// -// return getContentLength() + getHeadLength() <= sBuffer.length(); } bool TC_HttpResponse::decode(const char *sBuffer, size_t iLength) @@ -1629,40 +1421,47 @@ bool TC_HttpResponse::decode(const char *sBuffer, size_t iLength) } //解析头部 - parseResponseHeader(sBuffer, p + 2); +// parseResponseHeader(sBuffer, p + 2); + _iTmpContentLength = parseResponseHeaderString(sBuffer, p + 2); - //304的返回码中头里本来就没有Content-Length,也不会有数据体,头收全了就是真正的收全了 + //304的返回码中头里本来就没有Content-Length,也不会有数据体,头收全了就是真正的收全了 if ( (204 == _status) || (304 == _status) ) { return true; } - - http_header_type::const_iterator it = _headers.find("Content-Length"); - if (it != _headers.end()) - { - _iTmpContentLength = getContentLength(); - } - else - { - //没有指明ContentLength, 接收到服务器关闭连接 - _iTmpContentLength = -1; - } +// +// http_header_type::const_iterator it = _headers.find("Content-Length"); +// if (it != _headers.end()) +// { +// _iTmpContentLength = getContentLength(); +// } +// else +// { +// //没有指明ContentLength, 接收到服务器关闭连接 +// _iTmpContentLength = -1; +// } _headLength = p - sBuffer + 4; sBuffer += _headLength; //重定向就认为成功了 - if ((_status == 301 || _status == 302) && !getHeader("Location").empty()) + if ((_status == 301 || _status == 302) && hasHeader("Location")) { return true; } //是否是chunk编码 - _bIsChunked = (getHeader("Transfer-Encoding") == "chunked"); + _bIsChunked = checkHeader("Transfer-Encoding", "chunked"); + if(_bIsChunked) { + //删除头部里面 + eraseHeader("Transfer-Encoding"); + } + +// _bIsChunked = (getHeader("Transfer-Encoding") == "chunked"); //删除头部里面 - eraseHeader("Transfer-Encoding"); +// eraseHeader("Transfer-Encoding"); if (_bIsChunked) { @@ -1679,7 +1478,7 @@ bool TC_HttpResponse::decode(const char *sBuffer, size_t iLength) sChunkSize.insert(sChunkSize.end(), sBuffer, p); int iChunkSize = strtol(sChunkSize.c_str(), NULL, 16); - if(iChunkSize <= 0) break; //所有chunk都接收完毕 + if (iChunkSize <= 0) break; //所有chunk都接收完毕 if (strlen(sBuffer) < pos + 2 + (size_t)iChunkSize + 2) { @@ -1701,7 +1500,7 @@ bool TC_HttpResponse::decode(const char *sBuffer, size_t iLength) } else { - if(_iTmpContentLength == 0) + if (_iTmpContentLength == 0) { //header长度为0, 但是有body数据 addContent(sBuffer); @@ -1710,7 +1509,7 @@ bool TC_HttpResponse::decode(const char *sBuffer, size_t iLength) return true; } - else if(_iTmpContentLength == (size_t)-1) + else if (_iTmpContentLength == (size_t) - 1) { //304的返回码中头没有Content-Length,不会有数据体 if (_status == 304 || _status == 302) @@ -1743,18 +1542,20 @@ bool TC_HttpResponse::decode(const char *sBuffer, size_t iLength) string TC_HttpResponse::encode() const { - stringstream sRet; - sRet << _version; - sRet << " "; - sRet << TC_Common::tostr(_status); - sRet << " "; - sRet << _about; - sRet << "\r\n"; - sRet << genHeader(); - sRet << "\r\n"; - sRet << _content; + string sRet; + sRet.reserve(128); - return sRet.str(); + sRet += _version; + sRet += " "; + sRet += TC_Common::tostr(_status); + sRet += " "; + sRet += _about; + sRet += "\r\n"; + genHeader(sRet); + sRet += "\r\n"; + sRet += _content; + + return sRet; } void TC_HttpResponse::encode(vector &buffer) const @@ -1771,9 +1572,9 @@ void TC_HttpResponse::setResponse(int status, const string& about, const string& { _status = status; _about = about; - _content= body; + _content = body; - /*ostringstream os; + /*stringstream os; os << _version << " " << _status << " " << _about; @@ -1793,7 +1594,7 @@ void TC_HttpResponse::setResponse(int status, const string& about, const char *s _status = status; _about = about; - /*ostringstream os; + /*stringstream os; os << _version << " " << _status << " " << _about; @@ -1805,7 +1606,7 @@ void TC_HttpResponse::setResponse(int status, const string& about, const char *s _headerLine += " "; _headerLine += _about; - if(sBuffer != NULL && iLength > 0) + if (sBuffer != NULL && iLength > 0) { _content.assign(sBuffer, iLength); } @@ -1831,40 +1632,40 @@ void TC_HttpRequest::reset() _httpURL.clear(); } - -string TC_HttpRequest::requestType2str(int iRequestType) const -{ - if(iRequestType == REQUEST_GET) - { - return "GET"; - } - else if(iRequestType == REQUEST_HEAD) - { - return "HEAD"; - } - else if(iRequestType == REQUEST_POST) - { - return "POST"; - } - else if(iRequestType == REQUEST_OPTIONS) - { - return "OPTIONS"; - } - else if(iRequestType == REQUEST_PUT) - { - return "PUT"; - } - else if(iRequestType == REQUEST_DELETE) - { - return "DELETE"; - } - else if(iRequestType == REQUEST_PATCH) - { - return "PATCH"; - } -// assert(true); - return ""; -} +// +//const char * TC_HttpRequest::requestType2str(int iRequestType) const +//{ +// if(iRequestType == REQUEST_GET) +// { +// return "GET"; +// } +// else if(iRequestType == REQUEST_HEAD) +// { +// return "HEAD"; +// } +// else if(iRequestType == REQUEST_POST) +// { +// return "POST"; +// } +// else if(iRequestType == REQUEST_OPTIONS) +// { +// return "OPTIONS"; +// } +// else if(iRequestType == REQUEST_PUT) +// { +// return "PUT"; +// } +// else if(iRequestType == REQUEST_DELETE) +// { +// return "DELETE"; +// } +// else if(iRequestType == REQUEST_PATCH) +// { +// return "PATCH"; +// } +//// assert(true); +// return ""; +//} vector TC_HttpRequest::getCookie() { @@ -1872,15 +1673,15 @@ vector TC_HttpRequest::getCookie() http_header_type::const_iterator itEnd = _headers.end(); - for( http_header_type::const_iterator it = _headers.begin(); it != itEnd; ++it) + for ( http_header_type::const_iterator it = _headers.begin(); it != itEnd; ++it) { - if(it->first == "Cookie") + if (it->first == "Cookie") { v.push_back(it->second); } } - return v; + return v; } void TC_HttpRequest::parseURL(const string& sUrl) @@ -1888,7 +1689,7 @@ void TC_HttpRequest::parseURL(const string& sUrl) _httpURL.parseURL(sUrl); //设置Host - if(getHeader("Host").empty()) + if (!hasHeader("Host")) { string sPort = _httpURL.isDefaultPort() ? "" : ":" + _httpURL.getPort(); @@ -1897,13 +1698,6 @@ void TC_HttpRequest::parseURL(const string& sUrl) } } -void TC_HttpRequest::encode(int iRequestType, ostream &os) -{ - os << requestType2str(iRequestType) << " " << _httpURL.getRequest() << " HTTP/1.1\r\n"; - os << genHeader(); - os << "\r\n"; -} - void TC_HttpRequest::setRequest(const string& method, const string &sUrl, const std::string& body, bool bNewCreateHost) { // std::string lowMethod(method); @@ -1925,7 +1719,7 @@ void TC_HttpRequest::setRequest(const string& method, const string &sUrl, const void TC_HttpRequest::setGetRequest(const string &sUrl, bool bNewCreateHost) { - if(bNewCreateHost) + if (bNewCreateHost) { eraseHeader("Host"); } @@ -1941,7 +1735,7 @@ void TC_HttpRequest::setGetRequest(const string &sUrl, bool bNewCreateHost) void TC_HttpRequest::setHeadRequest(const string &sUrl, bool bNewCreateHost) { - if(bNewCreateHost) + if (bNewCreateHost) { eraseHeader("Host"); } @@ -1957,7 +1751,7 @@ void TC_HttpRequest::setHeadRequest(const string &sUrl, bool bNewCreateHost) void TC_HttpRequest::setPostRequest(const string &sUrl, const string &sPostBody, bool bNewCreateHost) { - if(bNewCreateHost) + if (bNewCreateHost) { eraseHeader("Host"); } @@ -1977,20 +1771,29 @@ void TC_HttpRequest::setOptionsRequest(const string &sUrl, bool bNewCreateHost) { eraseHeader("Host"); } + parseURL(sUrl); + _requestType = REQUEST_OPTIONS; + _content = ""; + eraseHeader("Content-Length"); } + void TC_HttpRequest::setPostRequest(const string &sUrl, const char *sBuffer, size_t iLength, bool bNewCreateHost) { assert(sBuffer != NULL); + if (bNewCreateHost) { eraseHeader("Host"); } + parseURL(sUrl); + _requestType = REQUEST_POST; + if (iLength > 0) { _content.assign(sBuffer, iLength); @@ -1999,8 +1802,11 @@ void TC_HttpRequest::setPostRequest(const string &sUrl, const char *sBuffer, siz { _content.clear(); } + setHeader("Content-Length", TC_Common::tostr(_content.length())); } + + void TC_HttpRequest::setPutRequest(const string &sUrl, const string &sPostBody, bool bNewCreateHost ) { if(bNewCreateHost) @@ -2053,80 +1859,36 @@ void TC_HttpRequest::setDeleteRequest(const string &sUrl, const string &sPostBod string TC_HttpRequest::encode() { - stringstream sRet; - - if(_requestType == REQUEST_GET) + string sRet; + sRet.reserve(128); + if(_requestType == REQUEST_GET || _requestType == REQUEST_OPTIONS || _requestType == REQUEST_HEAD) { - sRet << requestType2str(_requestType); - sRet << " "; - sRet << _httpURL.getRequest(); - sRet << " HTTP/1.1\r\n"; - sRet << genHeader(); - sRet << "\r\n"; + sRet += getMethod();//(_requestType); + sRet += " "; + sRet += _httpURL.getRequest(); + sRet += " HTTP/1.1\r\n"; + genHeader(sRet); + sRet += "\r\n"; } - else if(_requestType == REQUEST_POST) + else if(_requestType == REQUEST_POST || _requestType == REQUEST_PUT || _requestType == REQUEST_PATCH || _requestType == REQUEST_DELETE) { setContentLength(_content.length()); - sRet << requestType2str(_requestType); - sRet << " "; - sRet << _httpURL.getRequest(); - sRet << " HTTP/1.1\r\n"; - sRet << genHeader(); - sRet << "\r\n"; - sRet << _content; - } - else if(_requestType == REQUEST_OPTIONS) - { - sRet << requestType2str(_requestType); - sRet << " "; - sRet << _httpURL.getRequest(); - sRet << " HTTP/1.1\r\n"; - sRet << genHeader(); - sRet << "\r\n"; - } - else if(_requestType == REQUEST_HEAD) - { - sRet << requestType2str(_requestType); - sRet << " "; - sRet << _httpURL.getRequest(); - sRet << " HTTP/1.1\r\n"; - sRet << genHeader(); - sRet << "\r\n"; - } - else if(_requestType == REQUEST_PUT || _requestType == REQUEST_PATCH) - { - setContentLength(_content.length()); - sRet << requestType2str(_requestType); - sRet << " "; - sRet << _httpURL.getRequest(); - sRet << " HTTP/1.1\r\n"; - sRet << genHeader(); - sRet << "\r\n"; - sRet << _content; + sRet += getMethod();//requestType2str(_requestType); + sRet += " "; + sRet += _httpURL.getRequest(); + sRet += " HTTP/1.1\r\n"; + genHeader(sRet); + sRet += "\r\n"; + sRet += _content; } - else if(_requestType == REQUEST_DELETE) - { - setContentLength(_content.length()); - sRet << requestType2str(_requestType); - sRet << " "; - sRet << _httpURL.getRequest(); - sRet << " HTTP/1.1\r\n"; - sRet << genHeader(); - sRet << "\r\n"; - sRet << _content; - } - return sRet.str(); + return sRet; } -void TC_HttpRequest::encode(vector &buffer) +void TC_HttpRequest::encode(vector &sRet) { -// assert(_requestType == REQUEST_GET || _requestType == REQUEST_POST || !_originRequest.empty()); - - buffer.clear(); - - string s = encode(); - buffer.resize(s.length()); - memcpy(buffer.data(), s.c_str(), s.length()); + string s = encode(); + sRet.resize(s.length()); + memcpy(sRet.data(), s.c_str(), s.length()); } void TC_HttpRequest::encode(TC_NetWorkBuffer &buff) @@ -2139,48 +1901,59 @@ bool TC_HttpRequest::decode(const string &sBuffer) return decode(sBuffer.c_str(), sBuffer.length()); } +bool TC_HttpRequest::decode(const vector &sBuffer) +{ + return decode(sBuffer.data(), sBuffer.size()); +} + bool TC_HttpRequest::decode(const char *sBuffer, size_t iLength) { assert(sBuffer != NULL); - if(TC_Port::strncasecmp(sBuffer, "GET " ,4) !=0 && - TC_Port::strncasecmp(sBuffer, "POST " ,5) !=0 && - TC_Port::strncasecmp(sBuffer, "PUT " ,4) !=0 && - TC_Port::strncasecmp(sBuffer, "PATCH " ,6) !=0 && - TC_Port::strncasecmp(sBuffer, "OPTIONS " ,8) !=0 && - TC_Port::strncasecmp(sBuffer, "PRI " , 4) !=0 && - TC_Port::strncasecmp(sBuffer, "DELETE " , 7) !=0 && - TC_Port::strncasecmp(sBuffer, "HEAD " ,5)) + const char *p = strnstr(sBuffer, " ", 10); + if(p == NULL) + { + throw runtime_error("[TC_HttpRequest::decode] http protocol parse error"); + } + + auto it = TC_Http::HEADER.find(string(sBuffer, p - sBuffer)); + if(it == TC_Http::HEADER.end()) { - throw runtime_error("[TC_HttpRequest::decode] protocol not support, only support GET HEAD POST and OPTIONS "); + throw runtime_error("[TC_HttpRequest::decode] protocol not support "); } - const char *p = strstr(sBuffer, "\r\n\r\n"); + p = strstr(sBuffer, "\r\n\r\n"); if (p == NULL) { return false; } + _requestType = it->second; + parseRequestHeader(sBuffer, p); _headLength = p - sBuffer + 4; - bool bChunk = (getHeader("Transfer-Encoding") == "chunked"); + bool bChunk = checkHeader("Transfer-Encoding", "chunked"); //(getHeader("Transfer-Encoding") == "chunked"); int iChunkSuffixLen = 0; - if(bChunk) + if (bChunk) { - string sTmp(sBuffer + _headLength, iLength - _headLength); - while(true) + p = sBuffer + _headLength; +// string sTmp(sBuffer + _headLength, iLength - _headLength); + while (true) { - string::size_type pos = sTmp.find("\r\n"); - if(pos == string::npos) +// string::size_type pos = sTmp.find("\r\n"); + const char *pos = strstr(p, "\r\n"); + if (pos == NULL) return false; //查找当前chunk的大小 - string sChunkSize = sTmp.substr(0, pos); - int iChunkSize = strtol(sChunkSize.c_str(), NULL, 16); +// string sChunkSize = sTmp.substr(0, pos); + string sChunkSize(p, pos - p); +// sTmp.substr(0, pos); + int iChunkSize = strtol(sChunkSize.c_str(), NULL, 16); iChunkSuffixLen = iChunkSuffixLen + sChunkSize.length(); if (iChunkSize <= 0) @@ -2188,13 +1961,16 @@ bool TC_HttpRequest::decode(const char *sBuffer, size_t iLength) iChunkSuffixLen = iChunkSuffixLen + 4; break; //所有chunk都接收完毕 } - if(sTmp.length() >= pos + 2 + (size_t)iChunkSize + 2) //接收到一个完整的chunk了 +// if (sTmp.length() >= pos + 2 + (size_t)iChunkSize + 2) //接收到一个完整的chunk了 + if ((sBuffer+iLength-p) >= (pos - p) + 2 + iChunkSize + 2) //接收到一个完整的chunk了 { //获取一个chunk的内容 - _content += sTmp.substr(pos + 2, iChunkSize); +// _content += sTmp.substr(pos + 2, iChunkSize); + _content.append(pos + 2, iChunkSize); - //删除一个chunk - sTmp = sTmp.substr(pos + 2 + iChunkSize + 2); + //删除一个chunk +// sTmp = sTmp.substr(pos + 2 + iChunkSize + 2); + p = pos + 2 + iChunkSize + 2; iChunkSuffixLen = iChunkSuffixLen + 4; } else @@ -2209,7 +1985,6 @@ bool TC_HttpRequest::decode(const char *sBuffer, size_t iLength) else { _content.assign((sBuffer + _headLength), iLength - _headLength); -// _content = sBuffer.substr(_headLength); } return (getContentLength() + getHeadLength() + iChunkSuffixLen == iLength); @@ -2217,170 +1992,226 @@ bool TC_HttpRequest::decode(const char *sBuffer, size_t iLength) bool TC_HttpRequest::checkRequest(TC_NetWorkBuffer &buff) { - if(buff.getBufferLength() < 10) - return false; - - auto data = buff.getBufferPointer(); - if(TC_Port::strncasecmp(data.first, "GET " ,4) !=0 && - TC_Port::strncasecmp(data.first, "POST " ,5) !=0 && - TC_Port::strncasecmp(data.first, "PUT " ,4) !=0 && - TC_Port::strncasecmp(data.first, "PATCH " ,6) !=0 && - TC_Port::strncasecmp(data.first, "OPTIONS " ,8) !=0 && - TC_Port::strncasecmp(data.first, "PRI " , 4) !=0 && - TC_Port::strncasecmp(data.first, "DELETE " , 7) !=0 && - TC_Port::strncasecmp(data.first, "HEAD " ,5)) - { - throw runtime_error("[TC_HttpRequest::decode] protocol not support, only support GET HEAD POST PUT PATCH DELETE and OPTIONS "); - } - - string sep = "\r\n\r\n"; - - auto sit = buff.find(sep.c_str(), sep.size()); - if ( sit == buff.end()) - { - return false; - } - - size_t pos = sit - buff.begin(); - - size_t iHeadLen = pos + 4; - - bool bChunk = false; + buff.mergeBuffers(); - sep = "\r\n"; + return checkRequest(buff.getBufferPointer().first, buff.getBufferLength()); +// +// size_t *headerLength = (size_t *)buff.getContextData(); +// +// if(headerLength == NULL) +// { +// headerLength = new size_t(0); +// +// buff.setContextData(headerLength, [=]{ delete headerLength;}); +// } +// +// if(*headerLength == 0) +// { +// //header还没有解析出来, 合并buffer +// buff.mergeBuffers(); +// +// auto data = buff.getBufferPointer(); +// +// const char *p = strnstr(data.first, " ", 10); +// if(p == NULL) +// { +// throw runtime_error("[TC_HttpRequest::checkRequest] http protocol parse error"); +// } +// +// auto it = TC_Http::HEADER.find(string(data.first, p - data.first)); +// if(it == TC_Http::HEADER.end()) +// { +// throw runtime_error("[TC_HttpRequest::checkRequest] protocol not support"); +// } +// +//// if (buff.getBufferLength() < 10) +//// return false; +// +//// auto data = buff.getBufferPointer(); +//// if (TC_Port::strncasecmp(data.first, "GET ", 4) != 0 && +//// TC_Port::strncasecmp(data.first, "POST ", 5) != 0 && +//// TC_Port::strncasecmp(data.first, "PUT ", 4) != 0 && +//// TC_Port::strncasecmp(data.first, "PATCH ", 6) != 0 && +//// TC_Port::strncasecmp(data.first, "OPTIONS ", 8) != 0 && +//// TC_Port::strncasecmp(data.first, "PRI ", 4) != 0 && +//// TC_Port::strncasecmp(data.first, "DELETE ", 7) != 0 && +//// TC_Port::strncasecmp(data.first, "HEAD ", 5)) { +//// throw runtime_error( +//// "[TC_HttpRequest::decode] protocol not support, only support GET HEAD POST PUT PATCH DELETE and OPTIONS "); +//// } +// +//// string sep = "\r\n\r\n"; +//// +//// auto sit = buff.find(sep.c_str(), sep.size()); +//// if (sit == buff.end()) { +//// return false; +//// } +// +// p = strnstr(data.first, "\r\n\r\n", data.second); +// if(p == NULL) { +// return false; +// } +// +//// size_t pos = p ; +// +// *headerLength = p - data.first + 4; +// +//// bool bChunk = false; +// +//// sep = "\r\n"; +// +// p = strnstr(data.first, "\r\n", data.second); +// +// assert(p != NULL); +//// if(p == NULL) { +//// return false; +//// } +//// +//// auto it = std::search(buff.begin(), buff.end(), sep.c_str(), sep.c_str() + sep.size()); +//// if (it == buff.end()) { +//// //first line +//// return false; +//// } +// +//// it = it + sep.size(); +// //move to next line +// p += 2; +// } +// +// bool bChunk = false; +// +// size_t len = 0; +// +// //找到\r\n\r\n之前的长度表示 +// while (true) +// { +// size_t iMoveLen = it - buff.begin(); +// if (iMoveLen >= iHeadLen) +// { +// break; +// } +// +// auto lineItStart = it; +// +// auto lineItEnd = std::search(lineItStart, buff.end(), sep.c_str(), sep.c_str() + sep.size()); +// +// if (lineItEnd != buff.end()) +// { +// it = lineItEnd + sep.size(); +// +// std::function cmp = [](char i, char j) +// { +// return toupper(i) == toupper(j); +// }; +// +// const char *TE = "Transfer-Encoding:"; +// +// auto itTE = std::search(lineItStart, lineItEnd, TE, TE + strlen(TE), cmp); +// +// if (itTE != lineItEnd) +// { +// const char *CH = "chunked"; +// +// auto itCH = std::search(lineItStart + strlen(TE), lineItEnd, CH, CH + strlen(CH), cmp); +// +// if (itCH != lineItEnd) +// { +// bChunk = true; +// break; +// } +// } +// +// const char *CL = "Content-Length:"; +// +// auto itCL = std::search(lineItStart, lineItEnd, CL, CL + strlen(CL), cmp); +// if (itCL == lineItEnd) +// { +// continue; +// } +// +// string contentLength; +// contentLength.resize(lineItEnd - lineItStart - strlen(CL)); +// std::copy(lineItStart + strlen(CL), lineItEnd, contentLength.begin()); +// +// len = taf::TC_Common::strto(TC_Common::trim(contentLength, " ")); +// } +// +// } +// +// if (bChunk) +// { +// int remain_len = buff.getBufferLength() - iHeadLen; +// int move_len = 0; +// +// auto it = sit + 4; +// while (true) +// { +// auto lineIt = std::search(it, buff.end(), sep.c_str(), sep.c_str() + sep.size()); +// if ( lineIt == buff.end() ) +// { +// return false; +// } +// +// //查找当前chunk的大小 +// string contentLength; +// contentLength.resize(lineIt - it); +// std::copy(it, lineIt, contentLength.begin()); +// +// int iChunkSize = strtol(contentLength.c_str(), NULL, 16); +// if (iChunkSize <= 0) +// { +// return true; //所有chunk都接收完毕 +// } +// +// move_len = (lineIt - it) + 2 + iChunkSize + 2; +// if ( remain_len >= move_len ) //接收到一个完整的chunk了 +// { +// //移动到下一个chunk +// remain_len -= move_len; +// it = lineIt + 2 + iChunkSize + 2; +// } +// else +// { +// return false; +// } +// } +// } +// else if (len + pos + 4 <= buff.getBufferLength()) +// { +// return true; +// } +// +// return false; +} - auto it = std::search(buff.begin(), buff.end(), sep.c_str(), sep.c_str() + sep.size()); - if(it == buff.end()) - { - //first line +bool TC_HttpRequest::checkRequest(const char* sBuffer, size_t iLen) +{ + if(iLen < 10) return false; - } - it = it + sep.size(); - -// cout << buff.iteratorToIterator(buff.begin(), it) << endl; - size_t len = 0; - - //找到\r\n\r\n之前的长度表示 - while (true) + const char *p = strnstr(sBuffer, " ", 10); + if(p == NULL) { - size_t iMoveLen = it - buff.begin(); - if (iMoveLen >= iHeadLen) - { - break; - } - - - auto lineItStart = it; - - auto lineItEnd = std::search(lineItStart, buff.end(), sep.c_str(), sep.c_str() + sep.size()); - - if (lineItEnd != buff.end()) - { - it = lineItEnd + sep.size(); - - std::function cmp = [](char i, char j) - { - - return toupper(i) == toupper(j); - }; - - const char *TE = "Transfer-Encoding:"; - - auto itTE = std::search(lineItStart, lineItEnd, TE, TE + strlen(TE), cmp); - - if (itTE != lineItEnd) - { - const char *CH = "chunked"; - - auto itCH = std::search(lineItStart + strlen(TE), lineItEnd, CH, CH + strlen(CH), cmp); - - if (itCH != lineItEnd) - { - bChunk = true; - break; - } - } - - const char *CL = "Content-Length:"; - - auto itCL = std::search(lineItStart, lineItEnd, CL, CL + strlen(CL), cmp); - if (itCL == lineItEnd) - { - continue; - } - - string contentLength; - contentLength.resize(lineItEnd - lineItStart - strlen(CL)); - std::copy(lineItStart + strlen(CL), lineItEnd, contentLength.begin()); - - len = TC_Common::strto(TC_Common::trim(contentLength, " ")); - } - + throw runtime_error("[TC_HttpRequest::checkRequest] http protocol parse error"); } - if (bChunk) + auto it = TC_Http::HEADER.find(string(sBuffer, p - sBuffer)); + if(it == TC_Http::HEADER.end()) { - int remain_len = buff.getBufferLength() - iHeadLen; - int move_len = 0; - - auto it = sit + 4; - while (true) - { - auto lineIt = std::search(it, buff.end(), sep.c_str(), sep.c_str() + sep.size()); - if ( lineIt == buff.end() ) - { - return false; - } - - //查找当前chunk的大小 - string contentLength; - contentLength.resize(lineIt - it); - std::copy(it, lineIt, contentLength.begin()); - - int iChunkSize = strtol(contentLength.c_str(), NULL, 16); - if (iChunkSize <= 0) - { - return true; //所有chunk都接收完毕 - } - - move_len = (lineIt - it) + 2 + iChunkSize + 2; - if ( remain_len >= move_len ) //接收到一个完整的chunk了 - { - //移动到下一个chunk - remain_len -= move_len; - it = lineIt + 2 + iChunkSize + 2; - } - else - { - return false; - } - } - } - else if (len + pos + 4 <= buff.getBufferLength()) - { - return true; + throw runtime_error("[TC_HttpRequest::checkRequest] protocol not support: " + string(sBuffer, 8)); } - - return false; -} - -bool TC_HttpRequest::checkRequest(const char* sBuffer, size_t iLen) -{ - if(iLen < 10) - return false; - - if(TC_Port::strncasecmp(sBuffer, "GET " ,4) !=0 && - TC_Port::strncasecmp(sBuffer, "POST " ,5) !=0 && - TC_Port::strncasecmp(sBuffer, "PUT " ,4) !=0 && - TC_Port::strncasecmp(sBuffer, "PATCH " ,6) !=0 && - TC_Port::strncasecmp(sBuffer, "OPTIONS " ,8) !=0 && - TC_Port::strncasecmp(sBuffer, "PRI " , 4) !=0 && - TC_Port::strncasecmp(sBuffer, "DELETE " , 7) !=0 && - TC_Port::strncasecmp(sBuffer, "HEAD " ,5)) - { - throw runtime_error("[TC_HttpRequest::decode] protocol not support:" + string(sBuffer, 8)); - } +// +// if(TC_Port::strncasecmp(sBuffer, "GET " ,4) !=0 && +// TC_Port::strncasecmp(sBuffer, "POST " ,5) !=0 && +// TC_Port::strncasecmp(sBuffer, "PUT " ,4) !=0 && +// TC_Port::strncasecmp(sBuffer, "PATCH " ,6) !=0 && +// TC_Port::strncasecmp(sBuffer, "OPTIONS " ,8) !=0 && +// TC_Port::strncasecmp(sBuffer, "PRI " , 4) !=0 && +// TC_Port::strncasecmp(sBuffer, "DELETE " , 7) !=0 && +// TC_Port::strncasecmp(sBuffer, "HEAD " ,5)) +// { +// throw runtime_error("[TC_HttpRequest::decode] protocol not support:" + string(sBuffer, 8)); +// } const char *header = strstr(sBuffer, "\r\n\r\n"); if ( header == NULL) @@ -2392,7 +2223,7 @@ bool TC_HttpRequest::checkRequest(const char* sBuffer, size_t iLen) size_t iHeadLen = pos + 4; - const char *p = strstr(sBuffer, "\r\n"); + p = strstr(sBuffer, "\r\n"); if(p == NULL) { //first line @@ -2445,20 +2276,20 @@ bool TC_HttpRequest::checkRequest(const char* sBuffer, size_t iLen) while (true) { p = strstr(pCur , "\r\n"); - if( p == NULL ) + if ( p == NULL ) { return false; } //查找当前chunk的大小 int iChunkSize = strtol(string(pCur, p - pCur).c_str(), NULL, 16); - if(iChunkSize <= 0) + if (iChunkSize <= 0) { return true; //所有chunk都接收完毕 } move_len = (p - pCur) + 2 + iChunkSize + 2; - if( remain_len >= move_len ) //接收到一个完整的chunk了 + if ( remain_len >= move_len ) //接收到一个完整的chunk了 { //移动到下一个chunk remain_len -= move_len; @@ -2478,96 +2309,105 @@ bool TC_HttpRequest::checkRequest(const char* sBuffer, size_t iLen) return false; } -void TC_HttpRequest::parseRequestHeader(const char* szBuffer, const char *header) +size_t TC_Http::parseHeaderString(const char *beginIt, const char *headerIt, TC_Http::http_header_type &sHeader) { -// const char *szBuffer_copy = szBuffer; -// const char **ppChar = &szBuffer; + size_t contentLength = -1; - const char *p = strstr(szBuffer, "\r\n"); + sHeader.clear(); - assert(p != NULL); + bool first = true; + auto lineStartIt= beginIt; + while (true) + { + auto it = strnstr(lineStartIt, "\r\n", headerIt - lineStartIt); + if(it == NULL) + { + break; + } - const char * sMethod = szBuffer; + //first line ignore + if(!first) + { + auto itF = strnstr(lineStartIt, ":", it - lineStartIt); + if (itF != NULL) + { + while(*lineStartIt == ' ') + ++lineStartIt; - //解析请求类型 - if(TC_Port::strncasecmp(sMethod, "GET ", 4) ==0) //if(sMethod == "GET") - { - _requestType = REQUEST_GET; - } - else if(TC_Port::strncasecmp(sMethod, "POST ", 5) ==0) //else if(sMethod == "POST") - { - _requestType = REQUEST_POST; - } - else if(TC_Port::strncasecmp(sMethod, "PUT ", 4) ==0) - { - _requestType = REQUEST_PUT; - } - else if(TC_Port::strncasecmp(sMethod, "PATCH ", 6) ==0) - { - _requestType = REQUEST_PATCH; - } - else if(TC_Port::strncasecmp(sMethod, "OPTIONS ", 8) ==0) //else if(sMethod == "OPTIONS") - { - _requestType = REQUEST_OPTIONS; - } - else if(TC_Port::strncasecmp(sMethod, "HEAD ", 5) == 0) - { - _requestType = REQUEST_HEAD; - } - else if(TC_Port::strncasecmp(sMethod, "DELETE ", 7) == 0) - { - _requestType = REQUEST_DELETE; - } - else - { - throw TC_HttpRequest_Exception("[TC_HttpRequest::parseRequestHeader] http request error: " + string(szBuffer, p - szBuffer)); - } + const char *s = itF; + while(*s == ' ') + --s; + + string name(lineStartIt, s - lineStartIt); + + ++itF; + while(*itF == ' ') + ++itF; + + s = it; + while(*s == ' ') + --s; + + string value(itF, s-itF); + + if (TC_Port::strncasecmp(name.c_str(), "Content-Length", 14) == 0) + { + contentLength = TC_Common::strto(value); + } + + sHeader.insert(multimap::value_type(std::move(name), std::move(value))); + } + } + else + { + first = false; + } - string sep = " "; - auto f1 = std::search(szBuffer, p, sep.c_str(), sep.c_str() + sep.size()); + lineStartIt = it + 2;//sep.size(); + } + + return contentLength; +} + +void TC_HttpRequest::parseRequestHeader(const char* szBuffer, const char *header) +{ + const char *p = strstr(szBuffer, "\r\n"); + + assert(p != NULL); + +// string sep = " "; +// auto f1 = std::search(szBuffer, p, sep.c_str(), sep.c_str() + sep.size()); + auto f1 = strnstr(szBuffer, " ", p - szBuffer); if (f1 == p) { throw TC_HttpRequest_Exception("[TC_HttpRequest::parseRequestHeader] http request format error: " + string(szBuffer, p - szBuffer)); } - auto f2 = std::search(f1 + 1, p, sep.c_str(), sep.c_str() + sep.size()); +// auto f2 = std::search(f1 + 1, p, sep.c_str(), sep.c_str() + sep.size()); + auto f2 = strnstr(f1 + 1, " ", p - f1 + 1);//std::search(f1 + 1, p, sep.c_str(), sep.c_str() + sep.size()); if (f2 == p || f1 >= f2) { throw TC_HttpRequest_Exception("[TC_HttpRequest::parseRequestHeader] http request format error: " + string(szBuffer, p - szBuffer)); } -// string::size_type pos1 = sLine.rfind(" "); -// if (pos1 == string::npos || pos1 <= pos) -// { -// throw TC_HttpRequest_Exception("[TC_HttpRequest::parseRequestHeader] http request format error: " + sLine); -// } //URL地址 - string sURL = string(f1 + 1, f2 - f1 -1 ); //TC_Common::trim(sLine.substr(pos + 1, pos1 - pos)); + string sURL(f1 + 1, f2 - f1 - 1 ); //HTTP协议版本 - string sVersion = string(f2 + 1, p); //TC_Common::trim(sLine.substr(pos1 + 1)); + _version.assign(f2 + 1, p - f2 - 1); -// if (sVersion != "HTTP/1.1" || sVersion != "HTTP/1.0") - if (TC_Port::strncasecmp(sVersion.c_str(), "HTTP/1.1", 8) != 0 || TC_Port::strncasecmp(sVersion.c_str(), "HTTP/1.0", 8) != 0) - { - sVersion = "HTTP/1.1"; - } + parseHeaderString(szBuffer, header, _headers); - parseHeader(szBuffer, header, _headers); -// size_t n = parseHeader(*ppChar, _headers) - szBuffer_copy; - - if(TC_Port::strncasecmp(sURL.c_str(), "https://", 8) !=0 ) + if (TC_Port::strncasecmp(f1 + 1, "https://", 8) != 0 ) { - if(TC_Port::strncasecmp(sURL.c_str(), "http://", 7) !=0 ) + if (TC_Port::strncasecmp(f1 + 1, "http://", 7) != 0 ) { sURL = "http://" + getHost() + sURL; } } parseURL(sURL); - -// return header - szBuffer; } void TC_HttpRequest::getHostPort(string &sDomain, uint32_t &iPort) @@ -2577,36 +2417,25 @@ void TC_HttpRequest::getHostPort(string &sDomain, uint32_t &iPort) iPort = TC_Common::strto(_httpURL.getPort()); } -void TC_HttpRequest::setMethod(const char * sMethod) +const string &TC_HttpRequest::getMethod() const { - //解析请求类型 - if(TC_Port::strcasecmp(sMethod, "GET") ==0) //if(sMethod == "GET") - { - _requestType = REQUEST_GET; - } - else if(TC_Port::strcasecmp(sMethod, "POST") ==0) //else if(sMethod == "POST") - { - _requestType = REQUEST_POST; - } - else if(TC_Port::strcasecmp(sMethod, "PUT") ==0) - { - _requestType = REQUEST_PUT; - } - else if(TC_Port::strcasecmp(sMethod, "PATCH") ==0) - { - _requestType = REQUEST_PATCH; - } - else if(TC_Port::strcasecmp(sMethod, "OPTIONS") ==0) //else if(sMethod == "OPTIONS") + auto it = TC_Http::HEADER_REVERSE.find(_requestType); + if(it != TC_Http::HEADER_REVERSE.end()) { - _requestType = REQUEST_OPTIONS; + return it->second; } - else if(TC_Port::strcasecmp(sMethod, "HEAD") == 0) + else { - _requestType = REQUEST_HEAD; + throw TC_HttpRequest_Exception("[TC_HttpRequest::setMethod] http request command error: " + TC_Common::tostr(_requestType)); } - else if(TC_Port::strcasecmp(sMethod, "DELETE") == 0) +} + +void TC_HttpRequest::setMethod(const char * sMethod) +{ + auto it = TC_Http::HEADER.find(sMethod); + if(it != TC_Http::HEADER.end()) { - _requestType = REQUEST_DELETE; + _requestType = it->second; } else { @@ -2679,6 +2508,7 @@ int TC_HttpRequest::doRequest(TC_TCPClient& tcpClient, TC_HttpResponse& stHttpRs return 0; } + int TC_HttpRequest::doRequest(TC_HttpResponse &stHttpRsp, int iTimeout) { //只支持短连接模式 @@ -2695,7 +2525,7 @@ int TC_HttpRequest::doRequest(TC_HttpResponse &stHttpRsp, int iTimeout) tcpClient.init(sHost, iPort, iTimeout); int iRet = tcpClient.send(sSendBuffer.c_str(), sSendBuffer.length()); - if(iRet != TC_ClientSocket::EM_SUCCESS) + if (iRet != TC_ClientSocket::EM_SUCCESS) { return iRet; } @@ -2704,7 +2534,7 @@ int TC_HttpRequest::doRequest(TC_HttpResponse &stHttpRsp, int iTimeout) TC_NetWorkBuffer recvBuffer(NULL); - while(true) + while (true) { char buffer[8*1024]; size_t iRecvLen = sizeof(buffer); diff --git a/util/src/tc_http2.cpp b/util/src/tc_http2.cpp index ce21f2ce..99d88843 100644 --- a/util/src/tc_http2.cpp +++ b/util/src/tc_http2.cpp @@ -332,7 +332,8 @@ int TC_Http2Server::encodeResponse(const shared_ptrsecond.size(); } - DataPack dataPack(context->response.getContent().c_str(), context->response.getContent().size()); + const string &data = context->response.getContent(); + DataPack dataPack(data.c_str(), data.size()); nghttp2_data_provider data_prd; data_prd.source.ptr = (void*)&dataPack; @@ -497,23 +498,34 @@ TC_Http2Client::~TC_Http2Client() { } -int TC_Http2Client::submit(const string &method, const string &path, const map &header, const vector &buff) +int TC_Http2Client::submit(const TC_HttpRequest &request) { std::vector nva; const std::string smethod(":method"); - nghttp2_nv nv1 = MAKE_STRING_NV(smethod, method); - if (!method.empty()) { - nva.push_back(nv1); - } + nghttp2_nv nv1 = MAKE_STRING_NV(smethod, request.getMethod()); + nva.push_back(nv1); const std::string spath(":path"); - nghttp2_nv nv2 = MAKE_STRING_NV(spath, path); - if (!path.empty()) - nva.push_back(nv2); + nghttp2_nv nv2 = MAKE_STRING_NV(spath, request.getRequest()); + nva.push_back(nv2); + + const std::string sauthority(":authority"); + nghttp2_nv nv3 = MAKE_STRING_NV(sauthority, request.getURL().getDomain()); + nva.push_back(nv3); + + const std::string sscheme(":scheme"); + nghttp2_nv nv4 = MAKE_STRING_NV(sscheme, request.getURL().getScheme()); + nva.push_back(nv4); + +// cout << "submit:" << request.getMethod() << ", " << request.getRequest() << ", " << request.getURL().getDomain() << ", " << request.getURL().getScheme() << endl; - for (std::map::const_iterator it(header.begin()); it != header.end(); ++ it) + const TC_Http::http_header_type &header = request.getHeaders(); + for (auto it = header.begin(); it != header.end(); ++ it) { + if(TC_Port::strcasecmp(it->first.c_str(), "Content-Length") == 0 || it->second.empty()) + continue; + nghttp2_nv nv = MAKE_STRING_NV(it->first, it->second); nva.push_back(nv); } @@ -521,9 +533,9 @@ int TC_Http2Client::submit(const string &method, const string &path, const map> &out) diff --git a/util/src/tc_http_async.cpp b/util/src/tc_http_async.cpp index ee4ad7be..5d4f4409 100644 --- a/util/src/tc_http_async.cpp +++ b/util/src/tc_http_async.cpp @@ -259,7 +259,7 @@ void TC_HttpAsync::AsyncRequest::doReceive() //增量decode bool ret = _stHttpResp.incrementDecode(_recvBuffer); - //有头部数据了 + //有头部数据了 if (_callbackPtr && !_stHttpResp.getHeaders().empty()) { bool bContinue = _callbackPtr->onContinue(_stHttpResp); @@ -317,12 +317,10 @@ void TC_HttpAsync::AsyncRequest::processNotify() //没有建立连接, 发起连接 if (!isValid()) { - // cout << "doConnect" << endl; doConnect(); } else { - // cout << "doRequest" << endl; doRequest(); } } @@ -341,13 +339,10 @@ TC_HttpAsync::TC_HttpAsync() : _terminate(false) _epoller.create(20480); - // _notify.createSocket(); _notify.init(&_epoller); uint64_t data = H64(_notify.notifyFd()) | 0; _notify.add(data); - - // _epoller.add(_notify.getfd(), data, EPOLLIN); } TC_HttpAsync::~TC_HttpAsync() diff --git a/util/src/tc_logger.cpp b/util/src/tc_logger.cpp index 98043e6c..969de60a 100644 --- a/util/src/tc_logger.cpp +++ b/util/src/tc_logger.cpp @@ -25,9 +25,10 @@ bool TC_LoggerRoll::_bDyeingFlag = false; //TC_ThreadMutex TC_LoggerRoll::_mutexDyeing; TC_SpinLock TC_LoggerRoll::_mutexDyeing; unordered_map TC_LoggerRoll::_mapThreadID; -const string TarsLogByDay::FORMAT = "%Y%m%d"; -const string TarsLogByHour::FORMAT = "%Y%m%d%H"; -const string TarsLogByMinute::FORMAT = "%Y%m%d%H%M"; + +const string LogByDay::FORMAT = "%Y%m%d"; +const string LogByHour::FORMAT = "%Y%m%d%H"; +const string LogByMinute::FORMAT = "%Y%m%d%H%M"; void TC_LoggerRoll::setupThread(TC_LoggerThreadGroup *pThreadGroup) { diff --git a/util/src/tc_md5.cpp b/util/src/tc_md5.cpp index 4fd6da64..7aa55e15 100644 --- a/util/src/tc_md5.cpp +++ b/util/src/tc_md5.cpp @@ -159,7 +159,7 @@ string TC_MD5::md5file(const string& fileFullName) MD5_CTX context; if(( f = fopen( fileFullName.c_str(), "rb" )) == NULL ) { - TARS_THROW_EXCEPTION_SYSCODE(TC_MD5_Exception, "[TC_MD5::md5file] fopen '" + fileFullName + "', error"); + THROW_EXCEPTION_SYSCODE(TC_MD5_Exception, "[TC_MD5::md5file] fopen '" + fileFullName + "', error"); } md5init(&context); diff --git a/util/src/tc_mmap.cpp b/util/src/tc_mmap.cpp index 8a75eb59..689d77bc 100644 --- a/util/src/tc_mmap.cpp +++ b/util/src/tc_mmap.cpp @@ -70,7 +70,7 @@ void TC_Mmap::mmap(const char *file, size_t length) _hFile = CreateFile(file, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ| FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN|FILE_FLAG_WRITE_THROUGH|FILE_FLAG_NO_BUFFERING, NULL); if(_hFile == INVALID_HANDLE_VALUE) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::mmap] fopen file '" + string(file) + "' error"); + THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::mmap] fopen file '" + string(file) + "' error"); } _hMap = CreateFileMapping(_hFile, NULL, PAGE_READWRITE, 0, length, NULL); @@ -84,7 +84,7 @@ void TC_Mmap::mmap(const char *file, size_t length) } else { - TARS_THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::mmap] fopen file '" + string(file) + "' error"); + THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::mmap] fopen file '" + string(file) + "' error"); } _pAddr = (char*)MapViewOfFile(_hMap, FILE_MAP_ALL_ACCESS, 0, 0, length); @@ -94,7 +94,7 @@ void TC_Mmap::mmap(const char *file, size_t length) { CloseHandle(_hFile); CloseHandle(_hMap); - TARS_THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::mmap] fopen file '" + string(file) + "' error"); + THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::mmap] fopen file '" + string(file) + "' error"); } #else //注意_bCreate的赋值位置:保证多线程用一个对象的时候也不会有问题 @@ -103,14 +103,14 @@ void TC_Mmap::mmap(const char *file, size_t length) { if(errno != EEXIST) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::mmap] fopen file '" + string(file) + "' error"); + THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::mmap] fopen file '" + string(file) + "' error"); } else { fd = open(file, O_CREAT|O_RDWR, 0666); if(fd == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::mmap] fopen file '" + string(file) + "' error"); + THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::mmap] fopen file '" + string(file) + "' error"); } _bCreate = false; } @@ -132,7 +132,7 @@ void TC_Mmap::mmap(const char *file, size_t length) { _pAddr = NULL; close(fd); - TARS_THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::mmap] mmap file '" + string(file) + "' error"); + THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::mmap] mmap file '" + string(file) + "' error"); } if(fd != -1) { @@ -159,7 +159,7 @@ void TC_Mmap::munmap() BOOL ret = FlushViewOfFile(_pAddr, 0); if(!ret) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::munmap] munmap error"); + THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::munmap] munmap error"); } UnmapViewOfFile(_pAddr); @@ -172,7 +172,7 @@ void TC_Mmap::munmap() int ret = ::munmap(_pAddr, _iLength); if(ret == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::munmap] munmap error"); + THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::munmap] munmap error"); } #endif _pAddr = NULL; @@ -197,7 +197,7 @@ void TC_Mmap::msync(bool bSync) #endif if(ret != 0) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::msync] msync error"); + THROW_EXCEPTION_SYSCODE(TC_Mmap_Exception, "[TC_Mmap::msync] msync error"); } } diff --git a/util/src/tc_network_buffer.cpp b/util/src/tc_network_buffer.cpp index c20b872f..04df716c 100755 --- a/util/src/tc_network_buffer.cpp +++ b/util/src/tc_network_buffer.cpp @@ -262,7 +262,7 @@ TC_NetWorkBuffer::PACKET_TYPE TC_NetWorkBuffer::checkHttp() { bool b = TC_HttpRequest::checkRequest(*this); - return b ? PACKET_FULL : PACKET_LESS; + return b ? PACKET_FULL : PACKET_LESS; } catch (exception &ex) { diff --git a/util/src/tc_openssl.cpp b/util/src/tc_openssl.cpp index 0818589d..a4cd69f9 100644 --- a/util/src/tc_openssl.cpp +++ b/util/src/tc_openssl.cpp @@ -256,7 +256,7 @@ void TC_OpenSSL::initialize() } } -shared_ptr TC_OpenSSL::newCtx(const std::string& cafile, const std::string& certfile, const std::string& keyfile, bool verifyClient) +shared_ptr TC_OpenSSL::newCtx(const std::string& cafile, const std::string& certfile, const std::string& keyfile, bool verifyClient, const string &ciphers) { initialize(); @@ -270,10 +270,13 @@ shared_ptr TC_OpenSSL::newCtx(const std::string& cafile, const return NULL;\ } + int mode = SSL_VERIFY_NONE; if (verifyClient) - SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); - else - SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); + mode |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT; + if (!cafile.empty()) + mode |= SSL_VERIFY_PEER; + + SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF); SSL_CTX_clear_options(ctx, SSL_OP_LEGACY_SERVER_CONNECT); @@ -293,11 +296,15 @@ shared_ptr TC_OpenSSL::newCtx(const std::string& cafile, const RETURN_IF_FAIL (SSL_CTX_check_private_key(ctx)); } + if(!ciphers.empty()) { + RETURN_IF_FAIL (SSL_CTX_set_cipher_list(ctx, ciphers.c_str())); + } #undef RETURN_IF_FAIL return std::make_shared(ctx); } + shared_ptr TC_OpenSSL::newSSL(const std::shared_ptr &ctx) { initialize(); diff --git a/util/src/tc_sem_mutex.cpp b/util/src/tc_sem_mutex.cpp index f542cceb..855185a5 100644 --- a/util/src/tc_sem_mutex.cpp +++ b/util/src/tc_sem_mutex.cpp @@ -64,7 +64,7 @@ void TC_SemMutex::init(key_t iKey) //将所有信号量的值设置为0 if ( semctl( iSemID, 0, SETALL, arg ) == -1 ) { - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::init] semctl error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::init] semctl error"); // throw TC_SemMutex_Exception("[TC_SemMutex::init] semctl error", TC_Exception::getSystemCode()); } } @@ -73,14 +73,14 @@ void TC_SemMutex::init(key_t iKey) //信号量已经存在 if ( errno != EEXIST ) { - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::init] sem has exist error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::init] sem has exist error"); // throw TC_SemMutex_Exception("[TC_SemMutex::init] sem has exist error", TC_Exception::getSystemCode()); } //连接信号量 if ( (iSemID = semget( iKey, 2, 0666 )) == -1 ) { - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::init] connect sem error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::init] connect sem error"); // throw TC_SemMutex_Exception("[TC_SemMutex::init] connect sem error", TC_Exception::getSystemCode()); } } @@ -144,7 +144,7 @@ bool TC_SemMutex::tryrlock() const } else { - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::tryrlock] semop error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::tryrlock] semop error"); // throw TC_SemMutex_Exception("[TC_SemMutex::tryrlock] semop error", TC_Exception::getSystemCode()); } } @@ -208,7 +208,7 @@ bool TC_SemMutex::trywlock() const } else { - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::trywlock] semop error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::trywlock] semop error"); // throw TC_SemMutex_Exception("[TC_SemMutex::trywlock] semop error", TC_Exception::getSystemCode()); } } @@ -252,14 +252,14 @@ void TC_SemMutex::init(key_t iKey) _mutex = CreateMutex(NULL, FALSE, key.c_str()); if (_mutex == NULL) { - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::init] CreateMutex error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::init] CreateMutex error"); } _readEvent = CreateEvent(NULL, TRUE, TRUE, rkey.c_str()); if (_readEvent == NULL) { CloseHandle(_mutex); _mutex = NULL; - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::init] CreateEvent error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::init] CreateEvent error"); } _writeEvent = CreateEvent(NULL, TRUE, TRUE, wkey.c_str()); if (_writeEvent == NULL) @@ -268,7 +268,7 @@ void TC_SemMutex::init(key_t iKey) _mutex = NULL; CloseHandle(_readEvent); _readEvent = NULL; - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::init] CreateEvent error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::init] CreateEvent error"); } _semKey = iKey; } @@ -282,7 +282,7 @@ void TC_SemMutex::addWriter() const ReleaseMutex(_mutex); break; default: - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::addWriter] WaitForSingleObject error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::addWriter] WaitForSingleObject error"); } } void TC_SemMutex::removeWriter() const @@ -295,7 +295,7 @@ void TC_SemMutex::removeWriter() const ReleaseMutex(_mutex); break; default: - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::removeWriter] WaitForSingleObject error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::removeWriter] WaitForSingleObject error"); } } void TC_SemMutex::rlock() const @@ -313,7 +313,7 @@ void TC_SemMutex::rlock() const assert(_writers == 0); break; default: - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::rlock] WaitForSingleObject error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::rlock] WaitForSingleObject error"); } } void TC_SemMutex::unrlock( ) const @@ -335,7 +335,7 @@ bool TC_SemMutex::tryrlock() const case WAIT_TIMEOUT: continue; default: - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::tryrlock] WaitForSingleObject error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::tryrlock] WaitForSingleObject error"); } } } @@ -359,7 +359,7 @@ void TC_SemMutex::wlock() const break; default: removeWriter(); - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::wlock] WaitForSingleObject error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::wlock] WaitForSingleObject error"); } } void TC_SemMutex::unwlock() const @@ -401,7 +401,7 @@ void TC_SemMutex::unlockImp() const ReleaseMutex(_mutex); break; default: - TARS_THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::unlockImp] WaitForSingleObject error"); + THROW_EXCEPTION_SYSCODE(TC_SemMutex_Exception, "[TC_SemMutex::unlockImp] WaitForSingleObject error"); } } DWORD TC_SemMutex::tryReadLockOnce() const diff --git a/util/src/tc_shm.cpp b/util/src/tc_shm.cpp index a4d8b3f0..84b5d95a 100755 --- a/util/src/tc_shm.cpp +++ b/util/src/tc_shm.cpp @@ -67,7 +67,7 @@ void TC_Shm::init(size_t iShmSize, key_t iKey, bool bOwner) //有可能是已经存在同样的key_shm,则试图连接 if ((_shemID = shmget(iKey, iShmSize, 0666)) < 0) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Shm_Exception, "[TC_Shm::init()] shmget error"); + THROW_EXCEPTION_SYSCODE(TC_Shm_Exception, "[TC_Shm::init()] shmget error"); // throw TC_Shm_Exception("[TC_Shm::init()] shmget error", TC_Exception::getSystemCode()); } } @@ -79,7 +79,7 @@ void TC_Shm::init(size_t iShmSize, key_t iKey, bool bOwner) //try to access shm if ((_pshm = shmat(_shemID, NULL, 0)) == (char *) - 1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Shm_Exception, "[TC_Shm::init()] shmat error"); + THROW_EXCEPTION_SYSCODE(TC_Shm_Exception, "[TC_Shm::init()] shmat error"); // throw TC_Shm_Exception("[TC_Shm::init()] shmat error", TC_Exception::getSystemCode()); } diff --git a/util/src/tc_socket.cpp b/util/src/tc_socket.cpp index 5c68adab..3333ddd0 100755 --- a/util/src/tc_socket.cpp +++ b/util/src/tc_socket.cpp @@ -80,7 +80,7 @@ void TC_Socket::createSocket(int iSocketType, int iDomain) if(_sock < 0) { _sock = INVALID_SOCKET; - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::createSocket] create socket error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::createSocket] create socket error"); // throw TC_Socket_Exception("[TC_Socket::createSocket] create socket error! :" + string(strerror(errno))); } else @@ -151,7 +151,7 @@ void TC_Socket::connect(const char *sPathName) int ret = connectNoThrow(sPathName); if(ret < 0) { - TARS_THROW_EXCEPTION_SYSCODE(TC_SocketConnect_Exception, "[TC_Socket::connect] connect error"); + THROW_EXCEPTION_SYSCODE(TC_SocketConnect_Exception, "[TC_Socket::connect] connect error"); } } @@ -173,7 +173,7 @@ void TC_Socket::getPeerName(struct sockaddr *pstPeerAddr, SOCKET_LEN_TYPE &iPeer { if(getpeername(_sock, pstPeerAddr, &iPeerLen) < 0) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::getPeerName] getpeername error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::getPeerName] getpeername error"); } } @@ -199,7 +199,7 @@ void TC_Socket::getSockName(struct sockaddr *pstSockAddr, SOCKET_LEN_TYPE &iSock { if(getsockname(_sock, pstSockAddr, &iSockLen) < 0) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::getSockName] getsockname error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::getSockName] getsockname error"); } } @@ -226,7 +226,7 @@ void TC_Socket::parseAddr(const string &sAddr, struct in_addr &stSinAddr) int iRet = inet_pton(AF_INET, sAddr.c_str(), &stSinAddr); if(iRet < 0) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::parseAddr] inet_pton(" + sAddr + ") error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::parseAddr] inet_pton(" + sAddr + ") error"); } #if TARGET_PLATFORM_LINUX else if (iRet == 0) @@ -240,7 +240,7 @@ void TC_Socket::parseAddr(const string &sAddr, struct in_addr &stSinAddr) if (pstHostent == NULL) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::parseAddr] gethostbyname_r(" + sAddr + ") error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::parseAddr] gethostbyname_r(" + sAddr + ") error"); // throw TC_Socket_Exception("[TC_Socket::parseAddr] gethostbyname_r(" + sAddr + ") error", TC_Exception::getSystemCode()); } @@ -260,7 +260,7 @@ void TC_Socket::parseAddr(const string &sAddr, struct in_addr &stSinAddr) int err = getaddrinfo(sAddr.c_str(), NULL, &hints, &ailist); if (err != 0) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::parseAddr] getaddrinfo(" + sAddr + ") error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::parseAddr] getaddrinfo(" + sAddr + ") error"); } else { @@ -282,7 +282,7 @@ void TC_Socket::parseAddr(const string &host, struct in6_addr &stSinAddr) int iRet = inet_pton(AF_INET6, host.c_str(), &stSinAddr); if(iRet < 0) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::parseAddr] inet_pton(" + host + ") error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::parseAddr] inet_pton(" + host + ") error"); } else if(iRet == 0) { @@ -385,7 +385,7 @@ void TC_Socket::bind(const struct sockaddr *pstBindAddr, SOCKET_LEN_TYPE iAddrLe if(::bind(_sock, pstBindAddr, iAddrLen) < 0) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::bind] bind error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::bind] bind error"); } } @@ -444,7 +444,7 @@ void TC_Socket::connect(const string &sServerAddr, uint16_t port) if(ret < 0) { - TARS_THROW_EXCEPTION_SYSCODE(TC_SocketConnect_Exception, "[TC_Socket::connect] connect error"); + THROW_EXCEPTION_SYSCODE(TC_SocketConnect_Exception, "[TC_Socket::connect] connect error"); } } @@ -458,7 +458,7 @@ void TC_Socket::listen(int iConnBackLog) { if (::listen(_sock, iConnBackLog) < 0) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::listen] listen error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::listen] listen error"); } } @@ -547,7 +547,7 @@ void TC_Socket::shutdown(int iHow) { if (::shutdown(_sock, iHow) < 0) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::shutdown] shutdown error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::shutdown] shutdown error"); } } @@ -576,7 +576,7 @@ void TC_Socket::setNoCloseWait() if(setSockOpt(SO_LINGER, (const void *)&stLinger, sizeof(linger), SOL_SOCKET) == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setNoCloseWait] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setNoCloseWait] error"); } } @@ -588,7 +588,7 @@ void TC_Socket::setCloseWait(int delay) if(setSockOpt(SO_LINGER, (const void *)&stLinger, sizeof(linger), SOL_SOCKET) == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setCloseWait] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setCloseWait] error"); // throw TC_Socket_Exception("[TC_Socket::setCloseWait] error", TC_Exception::getSystemCode()); } @@ -602,7 +602,7 @@ void TC_Socket::setCloseWaitDefault() if(setSockOpt(SO_LINGER, (const void *)&stLinger, sizeof(linger), SOL_SOCKET) == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setCloseWait] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setCloseWait] error"); } } @@ -612,7 +612,7 @@ void TC_Socket::setTcpNoDelay() if(setSockOpt(TCP_NODELAY, (char*)&flag, int(sizeof(int)), IPPROTO_TCP) == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setTcpNoDelay] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setTcpNoDelay] error"); } } @@ -621,7 +621,7 @@ void TC_Socket::setKeepAlive() int flag = 1; if(setSockOpt(SO_KEEPALIVE, (char*)&flag, int(sizeof(int)), SOL_SOCKET) == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setKeepAlive] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setKeepAlive] error"); } } @@ -629,7 +629,7 @@ void TC_Socket::setSendBufferSize(int sz) { if(setSockOpt(SO_SNDBUF, (char*)&sz, int(sizeof(int)), SOL_SOCKET) == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setKeepsetSendBufferSizeAlive] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setKeepsetSendBufferSizeAlive] error"); } } @@ -639,7 +639,7 @@ int TC_Socket::getSendBufferSize() const SOCKET_LEN_TYPE len = sizeof(sz); if (getSockOpt(SO_SNDBUF, (void*)&sz, len, SOL_SOCKET) == -1 || len != sizeof(sz)) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::getSendBufferSize] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::getSendBufferSize] error"); } return sz; @@ -649,7 +649,7 @@ void TC_Socket::setRecvBufferSize(int sz) { if(setSockOpt(SO_RCVBUF, (char*)&sz, int(sizeof(int)), SOL_SOCKET) == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setRecvBufferSize] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setRecvBufferSize] error"); } } @@ -659,7 +659,7 @@ int TC_Socket::getRecvBufferSize() const SOCKET_LEN_TYPE len = sizeof(sz); if (getSockOpt(SO_RCVBUF, (void*)&sz, len, SOL_SOCKET) == -1 || len != sizeof(sz)) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::getRecvBufferSize] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::getRecvBufferSize] error"); } return sz; @@ -672,7 +672,7 @@ void TC_Socket::ignoreSigPipe() { if (setSockOpt(SO_NOSIGPIPE, (char*)&set, int(sizeof(int)), SOL_SOCKET) == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::ignoreSigPipe] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::ignoreSigPipe] error"); } #endif } @@ -685,7 +685,7 @@ void TC_Socket::setblock(SOCKET_TYPE fd, bool bBlock) if ((val = fcntl(fd, F_GETFL, 0)) == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setblock] fcntl [F_GETFL] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setblock] fcntl [F_GETFL] error"); // throw TC_Socket_Exception("[TC_Socket::setblock] fcntl [F_GETFL] error", TC_Exception::getSystemCode()); } @@ -700,7 +700,7 @@ void TC_Socket::setblock(SOCKET_TYPE fd, bool bBlock) if (fcntl(fd, F_SETFL, val) == -1) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setblock] fcntl [F_SETFL] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setblock] fcntl [F_SETFL] error"); } #else unsigned long ul = 1; @@ -709,7 +709,7 @@ void TC_Socket::setblock(SOCKET_TYPE fd, bool bBlock) ret = ioctlsocket(fd, FIONBIO, (unsigned long *)&ul); if (ret == SOCKET_ERROR) { - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setblock] ioctlsocket [FIONBIO] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::setblock] ioctlsocket [FIONBIO] error"); } #endif @@ -790,7 +790,7 @@ void TC_Socket::createPipe(int fds[2], bool bBlock) // #if TARGET_PLATFORM_LINUX||TARGET_PLATFORM_IOS // #undef closesocket // #endif - TARS_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::createPipe] error"); + THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::createPipe] error"); } #if TARGET_PLATFORM_LINUX