From 359b63fa77be178e555c73f0642c5159748fca5b Mon Sep 17 00:00:00 2001 From: Ken Matsui <26405363+ken-matsui@users.noreply.github.com> Date: Mon, 29 Jan 2024 08:47:28 -0800 Subject: [PATCH 01/19] Introduce cpplint (#1929) --- .github/workflows/cpp.yml | 11 ++++++++++ CPPLINT.cfg | 42 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 CPPLINT.cfg diff --git a/.github/workflows/cpp.yml b/.github/workflows/cpp.yml index af682b4218..c8719ca991 100644 --- a/.github/workflows/cpp.yml +++ b/.github/workflows/cpp.yml @@ -19,3 +19,14 @@ jobs: - name: Check formatting run: ./format.sh && git diff --exit-code + + cpplint: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + + - name: Install cpplint + run: pip install cpplint + + - name: Run lint + run: cpplint --recursive . diff --git a/CPPLINT.cfg b/CPPLINT.cfg new file mode 100644 index 0000000000..7bb7afe4e5 --- /dev/null +++ b/CPPLINT.cfg @@ -0,0 +1,42 @@ +# Stop searching for additional config files. +set noparent + +exclude_files=trantor +exclude_files=build + +# Use non-const reference rather than a pointer. +filter=-runtime/references + +# CHECK macros are from Drogon, not Google Test. +filter=-readability/check + +# Don't warn about the use of C++11 features. +filter=-build/c++11 + +filter=-build/include_subdir + +# We prioritize clang-format for now. +filter=-whitespace + +# We don't require a username in TODO comments. +filter=-readability/todo + +# TODO: Fix these. +filter=-legal/copyright +filter=-build/storage_class +filter=-build/namespaces +filter=-build/include +filter=-build/header_guard +filter=-build/include_what_you_use +filter=-build/include_order +filter=-build/explicit_make_pair +filter=-runtime/explicit +filter=-runtime/string +filter=-runtime/int +filter=-readability/multiline_string +filter=-readability/inheritance +filter=-readability/casting +filter=-readability/alt_tokens +filter=-readability/braces +filter=-readability/fn_size +filter=-runtime/threadsafe_fn From ffc6e74f27cd1cb858330acd94f7dfba02258174 Mon Sep 17 00:00:00 2001 From: Ken Matsui <26405363+ken-matsui@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:55:47 -0800 Subject: [PATCH 02/19] Enable readability/alt_tokens for cpplint (#1930) * Enable readability/alt_tokens for cpplint * Format drogon_ctl/create_model.cc --- CPPLINT.cfg | 1 - drogon_ctl/create_model.cc | 46 +++++++++++++++++++++----------------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/CPPLINT.cfg b/CPPLINT.cfg index 7bb7afe4e5..148e047328 100644 --- a/CPPLINT.cfg +++ b/CPPLINT.cfg @@ -36,7 +36,6 @@ filter=-runtime/int filter=-readability/multiline_string filter=-readability/inheritance filter=-readability/casting -filter=-readability/alt_tokens filter=-readability/braces filter=-readability/fn_size filter=-runtime/threadsafe_fn diff --git a/drogon_ctl/create_model.cc b/drogon_ctl/create_model.cc index 7627af1691..9dc6291f4d 100644 --- a/drogon_ctl/create_model.cc +++ b/drogon_ctl/create_model.cc @@ -308,16 +308,18 @@ void create_model::createModelClassFromPG( data["hasPrimaryKey"] = (int)pkNumber; if (pkNumber == 1) { - *client << "SELECT \ - pg_attribute.attname AS colname,\ - pg_type.typname AS typename,\ - pg_constraint.contype AS contype \ - FROM pg_constraint \ - INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid \ - INNER JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid \ - AND pg_attribute.attnum = pg_constraint.conkey [ 1 ] \ - INNER JOIN pg_type ON pg_type.oid = pg_attribute.atttypid \ - WHERE pg_class.relname = $1 and pg_constraint.contype='p'" + *client << "SELECT " + "pg_attribute.attname AS colname," + "pg_type.typname AS typename," + "pg_constraint.contype AS contype " + "FROM pg_constraint " + "INNER JOIN pg_class ON pg_constraint.conrelid = " + "pg_class.oid " + "INNER JOIN pg_attribute ON pg_attribute.attrelid = " + "pg_class.oid " + "AND pg_attribute.attnum = pg_constraint.conkey [ 1 ] " + "INNER JOIN pg_type ON pg_type.oid = pg_attribute.atttypid " + "WHERE pg_class.relname = $1 and pg_constraint.contype='p'" << tableName << Mode::Blocking >> [&](bool isNull, const std::string &colName, @@ -345,16 +347,20 @@ void create_model::createModelClassFromPG( std::vector pkNames, pkTypes, pkValNames; for (size_t i = 1; i <= pkNumber; ++i) { - *client << "SELECT \ - pg_attribute.attname AS colname,\ - pg_type.typname AS typename,\ - pg_constraint.contype AS contype \ - FROM pg_constraint \ - INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid \ - INNER JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid \ - AND pg_attribute.attnum = pg_constraint.conkey [ $1 ] \ - INNER JOIN pg_type ON pg_type.oid = pg_attribute.atttypid \ - WHERE pg_class.relname = $2 and pg_constraint.contype='p'" + *client << "SELECT " + "pg_attribute.attname AS colname," + "pg_type.typname AS typename," + "pg_constraint.contype AS contype " + "FROM pg_constraint " + "INNER JOIN pg_class ON pg_constraint.conrelid = " + "pg_class.oid " + "INNER JOIN pg_attribute ON pg_attribute.attrelid = " + "pg_class.oid " + "AND pg_attribute.attnum = pg_constraint.conkey [ $1 ] " + "INNER JOIN pg_type ON pg_type.oid = " + "pg_attribute.atttypid " + "WHERE pg_class.relname = $2 and " + "pg_constraint.contype='p'" << (int)i << tableName << Mode::Blocking >> [&](bool isNull, std::string colName, const std::string &type) { if (isNull) From 674137e89d70e2ccd1a3a4a5a212aac3b872375a Mon Sep 17 00:00:00 2001 From: Ken Matsui <26405363+ken-matsui@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:57:58 -0800 Subject: [PATCH 03/19] Use clang-format-17 (#1931) --- .github/workflows/cpp.yml | 9 +++++++ format.sh | 6 ++--- lib/inc/drogon/DrClassMap.h | 4 +-- lib/inc/drogon/HttpAppFramework.h | 8 +++--- lib/inc/drogon/HttpRequest.h | 42 +++++++++++++++++------------- lib/inc/drogon/HttpResponse.h | 26 +++++++++--------- lib/src/DrClassMap.cc | 8 +++--- lib/src/HttpAppFrameworkImpl.cc | 5 ++-- lib/src/HttpAppFrameworkImpl.h | 4 +-- lib/src/HttpRequestImpl.h | 21 ++++++++------- lib/src/HttpResponseImpl.h | 11 ++++---- lib/src/StaticFileRouter.cc | 4 +-- lib/src/WebSocketConnectionImpl.cc | 4 +-- 13 files changed, 87 insertions(+), 65 deletions(-) diff --git a/.github/workflows/cpp.yml b/.github/workflows/cpp.yml index c8719ca991..7676800909 100644 --- a/.github/workflows/cpp.yml +++ b/.github/workflows/cpp.yml @@ -17,8 +17,17 @@ jobs: - name: Install dos2unix run: sudo apt-get install -y dos2unix + - name: Install clang-format-17 + run: | + wget https://apt.llvm.org/llvm.sh + chmod +x ./llvm.sh + sudo ./llvm.sh 17 + sudo apt-get install -y clang-format-17 + - name: Check formatting run: ./format.sh && git diff --exit-code + env: + CLANG_FORMAT: clang-format-17 cpplint: runs-on: ubuntu-22.04 diff --git a/format.sh b/format.sh index ee77c86bfa..5f94218ef7 100755 --- a/format.sh +++ b/format.sh @@ -3,10 +3,10 @@ # You can customize the clang-format path by setting the CLANG_FORMAT environment variable CLANG_FORMAT=${CLANG_FORMAT:-clang-format} -# Check if clang-format version is 14 to avoid inconsistent formatting +# Check if clang-format version is 17 to avoid inconsistent formatting $CLANG_FORMAT --version -if [[ ! $($CLANG_FORMAT --version) =~ "version 14" ]]; then - echo "Error: clang-format version must be 14" +if [[ ! $($CLANG_FORMAT --version) =~ "version 17" ]]; then + echo "Error: clang-format version must be 17" exit 1 fi diff --git a/lib/inc/drogon/DrClassMap.h b/lib/inc/drogon/DrClassMap.h index 6c5c7d08a9..8870223d7f 100644 --- a/lib/inc/drogon/DrClassMap.h +++ b/lib/inc/drogon/DrClassMap.h @@ -138,7 +138,7 @@ class DROGON_EXPORT DrClassMap protected: static std::unordered_map> - &getMap(); + std::pair> & + getMap(); }; } // namespace drogon diff --git a/lib/inc/drogon/HttpAppFramework.h b/lib/inc/drogon/HttpAppFramework.h index 9af8383fb9..7ae215da67 100644 --- a/lib/inc/drogon/HttpAppFramework.h +++ b/lib/inc/drogon/HttpAppFramework.h @@ -194,8 +194,8 @@ class DROGON_EXPORT HttpAppFramework : public trantor::NonCopyable * returned. */ virtual const std::function - &getCustomErrorHandler() const = 0; + const HttpRequestPtr &req)> & + getCustomErrorHandler() const = 0; /// Get the plugin object registered in the framework /** @@ -1421,8 +1421,8 @@ class DROGON_EXPORT HttpAppFramework : public trantor::NonCopyable * * @return std::pair */ - virtual const std::pair - &getFloatPrecisionInJson() const noexcept = 0; + virtual const std::pair & + getFloatPrecisionInJson() const noexcept = 0; /// Create a database client /** * @param dbType The database type is one of diff --git a/lib/inc/drogon/HttpRequest.h b/lib/inc/drogon/HttpRequest.h index 34bbc6fc59..2921358969 100644 --- a/lib/inc/drogon/HttpRequest.h +++ b/lib/inc/drogon/HttpRequest.h @@ -162,27 +162,31 @@ class DROGON_EXPORT HttpRequest virtual const std::string &getCookie(const std::string &field) const = 0; /// Get all headers of the request - virtual const std:: - unordered_map - &headers() const = 0; + virtual const std::unordered_map & + headers() const = 0; /// Get all headers of the request - const std:: - unordered_map - &getHeaders() const + const std::unordered_map & + getHeaders() const { return headers(); } /// Get all cookies of the request - virtual const std:: - unordered_map - &cookies() const = 0; + virtual const std::unordered_map & + cookies() const = 0; /// Get all cookies of the request - const std:: - unordered_map - &getCookies() const + const std::unordered_map & + getCookies() const { return cookies(); } @@ -300,14 +304,16 @@ class DROGON_EXPORT HttpRequest } /// Get parameters of the request. - virtual const std:: - unordered_map - ¶meters() const = 0; + virtual const std::unordered_map & + parameters() const = 0; /// Get parameters of the request. - const std:: - unordered_map - &getParameters() const + const std::unordered_map & + getParameters() const { return parameters(); } diff --git a/lib/inc/drogon/HttpResponse.h b/lib/inc/drogon/HttpResponse.h index edbe813700..58401b1573 100644 --- a/lib/inc/drogon/HttpResponse.h +++ b/lib/inc/drogon/HttpResponse.h @@ -244,14 +244,16 @@ class DROGON_EXPORT HttpResponse virtual void removeHeader(std::string key) = 0; /// Get all headers of the response - virtual const std:: - unordered_map - &headers() const = 0; + virtual const std::unordered_map & + headers() const = 0; /// Get all headers of the response - const std:: - unordered_map - &getHeaders() const + const std::unordered_map & + getHeaders() const { return headers(); } @@ -280,13 +282,13 @@ class DROGON_EXPORT HttpResponse /// Get all cookies. virtual const std:: - unordered_map - &cookies() const = 0; + unordered_map & + cookies() const = 0; /// Get all cookies. const std:: - unordered_map - &getCookies() const + unordered_map & + getCookies() const { return cookies(); } @@ -580,8 +582,8 @@ class DROGON_EXPORT HttpResponse * newStreamResponse) returns the callback function. Otherwise a * null function. */ - virtual const std::function - &streamCallback() const = 0; + virtual const std::function & + streamCallback() const = 0; /** * @brief If the response is a async stream response (i.e. created by diff --git a/lib/src/DrClassMap.cc b/lib/src/DrClassMap.cc index 9f36d4706a..c056c722c5 100644 --- a/lib/src/DrClassMap.cc +++ b/lib/src/DrClassMap.cc @@ -22,8 +22,8 @@ namespace drogon { namespace internal { -static std::unordered_map> - &getObjsMap() +static std::unordered_map> & +getObjsMap() { static std::unordered_map> singleInstanceMap; @@ -112,8 +112,8 @@ std::vector DrClassMap::getAllClassName() return ret; } -std::unordered_map> - &DrClassMap::getMap() +std::unordered_map> & +DrClassMap::getMap() { static std::unordered_map> diff --git a/lib/src/HttpAppFrameworkImpl.cc b/lib/src/HttpAppFrameworkImpl.cc index d0b87f25bb..a0a3602fe7 100644 --- a/lib/src/HttpAppFrameworkImpl.cc +++ b/lib/src/HttpAppFrameworkImpl.cc @@ -1039,8 +1039,9 @@ HttpAppFramework &HttpAppFrameworkImpl::setCustomErrorHandler( return *this; } -const std::function - &HttpAppFrameworkImpl::getCustomErrorHandler() const +const std::function & +HttpAppFrameworkImpl::getCustomErrorHandler() const { return customErrorHandler_; } diff --git a/lib/src/HttpAppFrameworkImpl.h b/lib/src/HttpAppFrameworkImpl.h index 3fbf24dd7b..aeefde6966 100644 --- a/lib/src/HttpAppFrameworkImpl.h +++ b/lib/src/HttpAppFrameworkImpl.h @@ -586,8 +586,8 @@ class HttpAppFrameworkImpl final : public HttpAppFramework bool areAllDbClientsAvailable() const noexcept override; const std::function - &getCustomErrorHandler() const override; + const HttpRequestPtr &req)> & + getCustomErrorHandler() const override; bool isUsingCustomErrorHandler() const { diff --git a/lib/src/HttpRequestImpl.h b/lib/src/HttpRequestImpl.h index fc5b2a8f4b..e7625b98f4 100644 --- a/lib/src/HttpRequestImpl.h +++ b/lib/src/HttpRequestImpl.h @@ -169,9 +169,10 @@ class HttpRequestImpl : public HttpRequest pathEncode_ = pathEncode; } - const std:: - unordered_map - ¶meters() const override + const std::unordered_map & + parameters() const override { parseParametersOnce(); return parameters_; @@ -341,16 +342,18 @@ class HttpRequestImpl : public HttpRequest return defaultVal; } - const std:: - unordered_map - &headers() const override + const std::unordered_map & + headers() const override { return headers_; } - const std:: - unordered_map - &cookies() const override + const std::unordered_map & + cookies() const override { return cookies_; } diff --git a/lib/src/HttpResponseImpl.h b/lib/src/HttpResponseImpl.h index b7c6b9612d..78d53a29ba 100644 --- a/lib/src/HttpResponseImpl.h +++ b/lib/src/HttpResponseImpl.h @@ -133,9 +133,10 @@ class DROGON_EXPORT HttpResponseImpl : public HttpResponse removeHeaderBy(key); } - const std:: - unordered_map - &headers() const override + const std::unordered_map & + headers() const override { return headers_; } @@ -206,8 +207,8 @@ class DROGON_EXPORT HttpResponseImpl : public HttpResponse } const std:: - unordered_map - &cookies() const override + unordered_map & + cookies() const override { return cookies_; } diff --git a/lib/src/StaticFileRouter.cc b/lib/src/StaticFileRouter.cc index 4c4642ad35..c869b78416 100644 --- a/lib/src/StaticFileRouter.cc +++ b/lib/src/StaticFileRouter.cc @@ -26,8 +26,8 @@ #include #elif !defined(__MINGW32__) #define stat _wstati64 -#define S_ISREG(m) (((m)&0170000) == (0100000)) -#define S_ISDIR(m) (((m)&0170000) == (0040000)) +#define S_ISREG(m) (((m) & 0170000) == (0100000)) +#define S_ISDIR(m) (((m) & 0170000) == (0040000)) #endif #include #include diff --git a/lib/src/WebSocketConnectionImpl.cc b/lib/src/WebSocketConnectionImpl.cc index 864ebd815d..46ecf3a541 100644 --- a/lib/src/WebSocketConnectionImpl.cc +++ b/lib/src/WebSocketConnectionImpl.cc @@ -88,7 +88,7 @@ void WebSocketConnectionImpl::sendWsData(const char *msg, { bytesFormatted[1] = 126; bytesFormatted[2] = ((len >> 8) & 255); - bytesFormatted[3] = ((len)&255); + bytesFormatted[3] = ((len) & 255); LOG_TRACE << "bytes[2]=" << (size_t)bytesFormatted[2]; LOG_TRACE << "bytes[3]=" << (size_t)bytesFormatted[3]; indexStartRawData = 4; @@ -103,7 +103,7 @@ void WebSocketConnectionImpl::sendWsData(const char *msg, bytesFormatted[6] = ((len >> 24) & 255); bytesFormatted[7] = ((len >> 16) & 255); bytesFormatted[8] = ((len >> 8) & 255); - bytesFormatted[9] = ((len)&255); + bytesFormatted[9] = ((len) & 255); indexStartRawData = 10; } From 56a53165b696c6919c327daf2aa592b9b3837f7b Mon Sep 17 00:00:00 2001 From: Ken Matsui <26405363+ken-matsui@users.noreply.github.com> Date: Tue, 30 Jan 2024 18:43:30 -0800 Subject: [PATCH 04/19] Add newline at EOF (#1932) --- .clang-format | 1 + drogon_ctl/create_controller.cc | 2 +- examples/benchmark/JsonCtrl.cc | 2 +- examples/file_upload/file_upload.cc | 2 +- examples/helloworld/HelloController.cc | 2 +- examples/helloworld/HelloViewController.cc | 2 +- examples/jsonstore/main.cc | 2 +- examples/login_session/main.cc | 2 +- examples/redis_cache/DateFuncs.h | 2 +- examples/redis_cache/filters/TimeFilter.cc | 2 +- examples/simple_reverse_proxy/plugins/SimpleReverseProxy.cc | 2 +- examples/websocket_server/WebSocketServer.cc | 2 +- lib/inc/drogon/plugins/Redirector.h | 2 +- lib/inc/drogon/utils/OStringStream.h | 2 +- lib/inc/drogon/utils/monitoring.h | 2 +- lib/inc/drogon/utils/monitoring/Collector.h | 2 +- lib/inc/drogon/utils/monitoring/Gauge.h | 2 +- lib/inc/drogon/utils/monitoring/Metric.h | 2 +- lib/inc/drogon/utils/monitoring/Registry.h | 2 +- lib/inc/drogon/utils/monitoring/Sample.h | 2 +- lib/inc/drogon/utils/monitoring/StopWatch.h | 2 +- lib/src/ConfigAdapter.h | 2 +- lib/src/ConfigAdapterManager.cc | 2 +- lib/src/ConfigAdapterManager.h | 2 +- lib/src/DbClientManagerSkipped.cc | 2 +- lib/src/FixedWindowRateLimiter.cc | 2 +- lib/src/GlobalFilters.cc | 2 +- lib/src/Histogram.cc | 2 +- lib/src/HttpBinder.cc | 2 +- lib/src/HttpClientImpl.cc | 2 +- lib/src/HttpViewData.cc | 2 +- lib/src/JsonConfigAdapter.h | 2 +- lib/src/PluginsManager.cc | 2 +- lib/src/RedisClientManagerSkipped.cc | 2 +- lib/src/RedisResultSkipped.cc | 2 +- lib/src/SlidingWindowRateLimiter.h | 2 +- lib/src/TaskTimeoutFlag.cc | 2 +- lib/src/TaskTimeoutFlag.h | 2 +- lib/src/YamlConfigAdapter.h | 2 +- lib/tests/integration_test/server/DigestAuthFilter.cc | 2 +- lib/tests/integration_test/server/DigestAuthFilter.h | 2 +- lib/tests/integration_test/server/ForwardCtrl.cc | 2 +- lib/tests/integration_test/server/MethodTest.cc | 2 +- lib/tests/integration_test/server/TimeFilter.cc | 2 +- lib/tests/integration_test/server/api_v1_ApiTest.cc | 2 +- lib/tests/unittests/ClassNameTest.cc | 2 +- lib/tests/unittests/ControllerCreationTest.cc | 2 +- lib/tests/unittests/DrObjectTest.cc | 2 +- lib/tests/unittests/FileTypeTest.cc | 2 +- lib/tests/unittests/GzipTest.cc | 2 +- lib/tests/unittests/OStringStreamTest.cc | 2 +- lib/tests/unittests/Sha1Test.cc | 2 +- nosql_lib/redis/inc/drogon/nosql/RedisException.h | 2 +- nosql_lib/redis/src/RedisTransactionImpl.h | 2 +- orm_lib/inc/drogon/orm/RestfulController.h | 2 +- orm_lib/src/RestfulController.cc | 2 +- orm_lib/src/mysql_impl/test/test1.cc | 2 +- orm_lib/src/sqlite3_impl/Sqlite3ResultImpl.h | 2 +- 58 files changed, 58 insertions(+), 57 deletions(-) diff --git a/.clang-format b/.clang-format index 0f62465b3e..812ba70cff 100644 --- a/.clang-format +++ b/.clang-format @@ -75,6 +75,7 @@ IndentCaseLabels: true IndentPPDirectives: None IndentWidth: 4 IndentWrappedFunctionNames: false +InsertNewlineAtEOF: true JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: false diff --git a/drogon_ctl/create_controller.cc b/drogon_ctl/create_controller.cc index fb4d6acbfd..4e23af11c5 100644 --- a/drogon_ctl/create_controller.cc +++ b/drogon_ctl/create_controller.cc @@ -468,4 +468,4 @@ void create_controller::createARestfulController(const std::string &className, << std::endl; std::cout << "File name: " << ctlName << ".h and " << ctlName << ".cc" << std::endl; -} \ No newline at end of file +} diff --git a/examples/benchmark/JsonCtrl.cc b/examples/benchmark/JsonCtrl.cc index ef3ed2d3dd..fcf5fc51df 100644 --- a/examples/benchmark/JsonCtrl.cc +++ b/examples/benchmark/JsonCtrl.cc @@ -8,4 +8,4 @@ void JsonCtrl::asyncHandleHttpRequest( ret["message"] = "Hello, World!"; auto resp = HttpResponse::newHttpJsonResponse(ret); callback(resp); -} \ No newline at end of file +} diff --git a/examples/file_upload/file_upload.cc b/examples/file_upload/file_upload.cc index 0fa40767e6..8ed24141f3 100644 --- a/examples/file_upload/file_upload.cc +++ b/examples/file_upload/file_upload.cc @@ -43,4 +43,4 @@ int main() .setUploadPath("./uploads") .addListener("127.0.0.1", 8848) .run(); -} \ No newline at end of file +} diff --git a/examples/helloworld/HelloController.cc b/examples/helloworld/HelloController.cc index a089e8e54c..9c7f7befe3 100644 --- a/examples/helloworld/HelloController.cc +++ b/examples/helloworld/HelloController.cc @@ -37,4 +37,4 @@ class SayHello : public HttpController "Hi there, this is another hello from the SayHello Controller"); callback(resp); } -}; \ No newline at end of file +}; diff --git a/examples/helloworld/HelloViewController.cc b/examples/helloworld/HelloViewController.cc index 753267305e..e1b918881e 100644 --- a/examples/helloworld/HelloViewController.cc +++ b/examples/helloworld/HelloViewController.cc @@ -26,4 +26,4 @@ class HelloViewController : public HttpSimpleController auto resp = HttpResponse::newHttpViewResponse("HelloView", data); callback(resp); } -}; \ No newline at end of file +}; diff --git a/examples/jsonstore/main.cc b/examples/jsonstore/main.cc index 0cd5025645..61babccfb5 100644 --- a/examples/jsonstore/main.cc +++ b/examples/jsonstore/main.cc @@ -211,4 +211,4 @@ class JsonStore : public HttpController int main() { app().addListener("127.0.0.1", 8848).run(); -} \ No newline at end of file +} diff --git a/examples/login_session/main.cc b/examples/login_session/main.cc index c457ea9f05..f8c8d273c3 100644 --- a/examples/login_session/main.cc +++ b/examples/login_session/main.cc @@ -65,4 +65,4 @@ int main() .enableSession(24h) .addListener("127.0.0.1", 8848) .run(); -} \ No newline at end of file +} diff --git a/examples/redis_cache/DateFuncs.h b/examples/redis_cache/DateFuncs.h index cd5f59e432..4968e23c00 100644 --- a/examples/redis_cache/DateFuncs.h +++ b/examples/redis_cache/DateFuncs.h @@ -11,4 +11,4 @@ template <> inline std::string toString(const trantor::Date &date) { return std::to_string(date.microSecondsSinceEpoch()); -} \ No newline at end of file +} diff --git a/examples/redis_cache/filters/TimeFilter.cc b/examples/redis_cache/filters/TimeFilter.cc index 2c29a66dce..915f082f3f 100644 --- a/examples/redis_cache/filters/TimeFilter.cc +++ b/examples/redis_cache/filters/TimeFilter.cc @@ -70,4 +70,4 @@ void TimeFilter::doFilter(const HttpRequestPtr &req, co_return; } }); -} \ No newline at end of file +} diff --git a/examples/simple_reverse_proxy/plugins/SimpleReverseProxy.cc b/examples/simple_reverse_proxy/plugins/SimpleReverseProxy.cc index 26ca89bfd3..7f890e082e 100644 --- a/examples/simple_reverse_proxy/plugins/SimpleReverseProxy.cc +++ b/examples/simple_reverse_proxy/plugins/SimpleReverseProxy.cc @@ -97,4 +97,4 @@ void SimpleReverseProxy::preRouting(const HttpRequestPtr &req, callback(errResp); } }); -} \ No newline at end of file +} diff --git a/examples/websocket_server/WebSocketServer.cc b/examples/websocket_server/WebSocketServer.cc index d497deede5..ea48dad132 100644 --- a/examples/websocket_server/WebSocketServer.cc +++ b/examples/websocket_server/WebSocketServer.cc @@ -70,4 +70,4 @@ void WebSocketChat::handleNewConnection(const HttpRequestPtr &req, int main() { app().addListener("127.0.0.1", 8848).run(); -} \ No newline at end of file +} diff --git a/lib/inc/drogon/plugins/Redirector.h b/lib/inc/drogon/plugins/Redirector.h index 4bbea15dbf..3b8f29b6b9 100644 --- a/lib/inc/drogon/plugins/Redirector.h +++ b/lib/inc/drogon/plugins/Redirector.h @@ -116,4 +116,4 @@ class DROGON_EXPORT Redirector : public drogon::Plugin, }; } // namespace plugin -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/inc/drogon/utils/OStringStream.h b/lib/inc/drogon/utils/OStringStream.h index de9db3b283..ac8b4ec16d 100644 --- a/lib/inc/drogon/utils/OStringStream.h +++ b/lib/inc/drogon/utils/OStringStream.h @@ -144,4 +144,4 @@ class OStringStream private: std::string buffer_; }; -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/inc/drogon/utils/monitoring.h b/lib/inc/drogon/utils/monitoring.h index cfb813964f..2060d74742 100644 --- a/lib/inc/drogon/utils/monitoring.h +++ b/lib/inc/drogon/utils/monitoring.h @@ -15,4 +15,4 @@ #include #include #include -#include \ No newline at end of file +#include diff --git a/lib/inc/drogon/utils/monitoring/Collector.h b/lib/inc/drogon/utils/monitoring/Collector.h index c8293722d4..b46bcefd90 100644 --- a/lib/inc/drogon/utils/monitoring/Collector.h +++ b/lib/inc/drogon/utils/monitoring/Collector.h @@ -129,4 +129,4 @@ class Collector : public CollectorBase mutable std::mutex mutex_; }; } // namespace monitoring -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/inc/drogon/utils/monitoring/Gauge.h b/lib/inc/drogon/utils/monitoring/Gauge.h index f060f9273b..99de3df8d8 100644 --- a/lib/inc/drogon/utils/monitoring/Gauge.h +++ b/lib/inc/drogon/utils/monitoring/Gauge.h @@ -106,4 +106,4 @@ class Gauge : public Metric trantor::Date timestamp_{0}; }; } // namespace monitoring -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/inc/drogon/utils/monitoring/Metric.h b/lib/inc/drogon/utils/monitoring/Metric.h index 92c16736e5..6987976ebd 100644 --- a/lib/inc/drogon/utils/monitoring/Metric.h +++ b/lib/inc/drogon/utils/monitoring/Metric.h @@ -74,4 +74,4 @@ class Metric : public std::enable_shared_from_this using MetricPtr = std::shared_ptr; } // namespace monitoring -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/inc/drogon/utils/monitoring/Registry.h b/lib/inc/drogon/utils/monitoring/Registry.h index fde6e5a0fc..1026b4481b 100644 --- a/lib/inc/drogon/utils/monitoring/Registry.h +++ b/lib/inc/drogon/utils/monitoring/Registry.h @@ -32,4 +32,4 @@ class Registry const std::shared_ptr &collector) = 0; }; } // namespace monitoring -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/inc/drogon/utils/monitoring/Sample.h b/lib/inc/drogon/utils/monitoring/Sample.h index b86e7c9221..27302f4a1b 100644 --- a/lib/inc/drogon/utils/monitoring/Sample.h +++ b/lib/inc/drogon/utils/monitoring/Sample.h @@ -32,4 +32,4 @@ struct Sample std::vector> exLabels; }; } // namespace monitoring -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/inc/drogon/utils/monitoring/StopWatch.h b/lib/inc/drogon/utils/monitoring/StopWatch.h index 9c4488a3a3..a0a2208f93 100644 --- a/lib/inc/drogon/utils/monitoring/StopWatch.h +++ b/lib/inc/drogon/utils/monitoring/StopWatch.h @@ -72,4 +72,4 @@ class LifeTimeWatch StopWatch stopWatch_; std::function callback_; }; -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/src/ConfigAdapter.h b/lib/src/ConfigAdapter.h index c9951c0326..28cd8983d6 100644 --- a/lib/src/ConfigAdapter.h +++ b/lib/src/ConfigAdapter.h @@ -18,4 +18,4 @@ class ConfigAdapter using ConfigAdapterPtr = std::shared_ptr; -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/src/ConfigAdapterManager.cc b/lib/src/ConfigAdapterManager.cc index 7b89f00380..dfbe937408 100644 --- a/lib/src/ConfigAdapterManager.cc +++ b/lib/src/ConfigAdapterManager.cc @@ -37,4 +37,4 @@ ConfigAdapterManager::ConfigAdapterManager() { REGISTER_CONFIG_ADAPTER(JsonConfigAdapter); REGISTER_CONFIG_ADAPTER(YamlConfigAdapter); -} \ No newline at end of file +} diff --git a/lib/src/ConfigAdapterManager.h b/lib/src/ConfigAdapterManager.h index 89a811449e..7249c8fe44 100644 --- a/lib/src/ConfigAdapterManager.h +++ b/lib/src/ConfigAdapterManager.h @@ -16,4 +16,4 @@ class ConfigAdapterManager ConfigAdapterManager(); std::map adapters_; }; -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/src/DbClientManagerSkipped.cc b/lib/src/DbClientManagerSkipped.cc index 2c19643067..ea2293a543 100644 --- a/lib/src/DbClientManagerSkipped.cc +++ b/lib/src/DbClientManagerSkipped.cc @@ -55,4 +55,4 @@ bool DbClientManager::areAllDbClientsAvailable() const noexcept DbClientManager::~DbClientManager() { -} \ No newline at end of file +} diff --git a/lib/src/FixedWindowRateLimiter.cc b/lib/src/FixedWindowRateLimiter.cc index df02afdcfe..bd75075e37 100644 --- a/lib/src/FixedWindowRateLimiter.cc +++ b/lib/src/FixedWindowRateLimiter.cc @@ -29,4 +29,4 @@ bool FixedWindowRateLimiter::isAllowed() return true; } return false; -} \ No newline at end of file +} diff --git a/lib/src/GlobalFilters.cc b/lib/src/GlobalFilters.cc index 771c6cda54..da41853bb7 100644 --- a/lib/src/GlobalFilters.cc +++ b/lib/src/GlobalFilters.cc @@ -105,4 +105,4 @@ void GlobalFilters::initAndStart(const Json::Value &config) void GlobalFilters::shutdown() { filters_.clear(); -} \ No newline at end of file +} diff --git a/lib/src/Histogram.cc b/lib/src/Histogram.cc index a62efdad84..d68469aebf 100644 --- a/lib/src/Histogram.cc +++ b/lib/src/Histogram.cc @@ -77,4 +77,4 @@ std::vector Histogram::collect() const countSample.value = totalCount; samples.emplace_back(std::move(countSample)); return samples; -} \ No newline at end of file +} diff --git a/lib/src/HttpBinder.cc b/lib/src/HttpBinder.cc index dd1209836d..eab1f8b190 100644 --- a/lib/src/HttpBinder.cc +++ b/lib/src/HttpBinder.cc @@ -26,4 +26,4 @@ void handleException(const std::exception &e, app().getExceptionHandler()(e, req, std::move(callback)); } } // namespace internal -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/src/HttpClientImpl.cc b/lib/src/HttpClientImpl.cc index 814b30e579..60054630e3 100644 --- a/lib/src/HttpClientImpl.cc +++ b/lib/src/HttpClientImpl.cc @@ -730,4 +730,4 @@ void HttpClientImpl::addSSLConfigs( { sslConfCmds_.push_back(cmd); } -} \ No newline at end of file +} diff --git a/lib/src/HttpViewData.cc b/lib/src/HttpViewData.cc index d618e0e65b..0aa41d0522 100644 --- a/lib/src/HttpViewData.cc +++ b/lib/src/HttpViewData.cc @@ -44,4 +44,4 @@ std::string HttpViewData::htmlTranslate(const char *str, size_t length) ++str; } return ret; -} \ No newline at end of file +} diff --git a/lib/src/JsonConfigAdapter.h b/lib/src/JsonConfigAdapter.h index 6a27f0f762..1374cac89e 100644 --- a/lib/src/JsonConfigAdapter.h +++ b/lib/src/JsonConfigAdapter.h @@ -12,4 +12,4 @@ class JsonConfigAdapter : public ConfigAdapter noexcept(false) override; std::vector getExtensions() const override; }; -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/src/PluginsManager.cc b/lib/src/PluginsManager.cc index 30beebf972..5b0eb54699 100644 --- a/lib/src/PluginsManager.cc +++ b/lib/src/PluginsManager.cc @@ -118,4 +118,4 @@ std::shared_ptr PluginsManager::getSharedPlugin( return iter->second; } return nullptr; -} \ No newline at end of file +} diff --git a/lib/src/RedisClientManagerSkipped.cc b/lib/src/RedisClientManagerSkipped.cc index 924d4d39f5..e39e3e5743 100644 --- a/lib/src/RedisClientManagerSkipped.cc +++ b/lib/src/RedisClientManagerSkipped.cc @@ -51,4 +51,4 @@ void RedisClientManager::createRedisClient(const std::string & /*name*/, RedisClientManager::~RedisClientManager() { -} \ No newline at end of file +} diff --git a/lib/src/RedisResultSkipped.cc b/lib/src/RedisResultSkipped.cc index c3ec10071e..ec05508949 100644 --- a/lib/src/RedisResultSkipped.cc +++ b/lib/src/RedisResultSkipped.cc @@ -69,4 +69,4 @@ bool RedisResult::isNil() const noexcept abort(); } } // namespace nosql -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/src/SlidingWindowRateLimiter.h b/lib/src/SlidingWindowRateLimiter.h index ac3045f9b0..816fee6661 100644 --- a/lib/src/SlidingWindowRateLimiter.h +++ b/lib/src/SlidingWindowRateLimiter.h @@ -20,4 +20,4 @@ class SlidingWindowRateLimiter : public RateLimiter std::chrono::steady_clock::time_point lastTime_; std::chrono::duration timeUnit_; }; -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/src/TaskTimeoutFlag.cc b/lib/src/TaskTimeoutFlag.cc index b8eba8a23c..61439595d5 100644 --- a/lib/src/TaskTimeoutFlag.cc +++ b/lib/src/TaskTimeoutFlag.cc @@ -38,4 +38,4 @@ void TaskTimeoutFlag::runTimer() bool TaskTimeoutFlag::done() { return isDone_.exchange(true); -} \ No newline at end of file +} diff --git a/lib/src/TaskTimeoutFlag.h b/lib/src/TaskTimeoutFlag.h index e466ddb905..8a17f3c811 100644 --- a/lib/src/TaskTimeoutFlag.h +++ b/lib/src/TaskTimeoutFlag.h @@ -36,4 +36,4 @@ class TaskTimeoutFlag : public trantor::NonCopyable, std::chrono::duration timeout_; std::function timeoutFunc_; }; -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/src/YamlConfigAdapter.h b/lib/src/YamlConfigAdapter.h index 6ca7f50a81..ef1b2f505c 100644 --- a/lib/src/YamlConfigAdapter.h +++ b/lib/src/YamlConfigAdapter.h @@ -12,4 +12,4 @@ class YamlConfigAdapter : public ConfigAdapter noexcept(false) override; std::vector getExtensions() const override; }; -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/lib/tests/integration_test/server/DigestAuthFilter.cc b/lib/tests/integration_test/server/DigestAuthFilter.cc index aba0dca29b..1537dccf20 100644 --- a/lib/tests/integration_test/server/DigestAuthFilter.cc +++ b/lib/tests/integration_test/server/DigestAuthFilter.cc @@ -214,4 +214,4 @@ void DigestAuthFilter::doFilter(const HttpRequestPtr &req, "\", opaque=\"" + opaque + "\""); cb(resp); return; -} \ No newline at end of file +} diff --git a/lib/tests/integration_test/server/DigestAuthFilter.h b/lib/tests/integration_test/server/DigestAuthFilter.h index 03df634913..bbb2c6ddfb 100644 --- a/lib/tests/integration_test/server/DigestAuthFilter.h +++ b/lib/tests/integration_test/server/DigestAuthFilter.h @@ -30,4 +30,4 @@ class DigestAuthFilter : public drogon::HttpFilter virtual void doFilter(const HttpRequestPtr &req, FilterCallback &&cb, FilterChainCallback &&ccb) override; -}; \ No newline at end of file +}; diff --git a/lib/tests/integration_test/server/ForwardCtrl.cc b/lib/tests/integration_test/server/ForwardCtrl.cc index 9dba50fe49..7a3a2b4e8d 100644 --- a/lib/tests/integration_test/server/ForwardCtrl.cc +++ b/lib/tests/integration_test/server/ForwardCtrl.cc @@ -11,4 +11,4 @@ void ForwardCtrl::asyncHandleHttpRequest( callback(resp); }, "https://api.github.com"); -} \ No newline at end of file +} diff --git a/lib/tests/integration_test/server/MethodTest.cc b/lib/tests/integration_test/server/MethodTest.cc index 25af36398f..22dcbfaad1 100644 --- a/lib/tests/integration_test/server/MethodTest.cc +++ b/lib/tests/integration_test/server/MethodTest.cc @@ -53,4 +53,4 @@ void MethodTest::postRegex( { LOG_DEBUG << regStr; makePostRespose(callback); -} \ No newline at end of file +} diff --git a/lib/tests/integration_test/server/TimeFilter.cc b/lib/tests/integration_test/server/TimeFilter.cc index 5a4555d3ef..51b719e2d8 100644 --- a/lib/tests/integration_test/server/TimeFilter.cc +++ b/lib/tests/integration_test/server/TimeFilter.cc @@ -45,4 +45,4 @@ void TimeFilter::doFilter(const HttpRequestPtr &req, LOG_TRACE << "first visit,insert visitDate"; req->session()->insert(VDate, now); ccb(); -} \ No newline at end of file +} diff --git a/lib/tests/integration_test/server/api_v1_ApiTest.cc b/lib/tests/integration_test/server/api_v1_ApiTest.cc index e52fa9f4a3..aa6b573497 100644 --- a/lib/tests/integration_test/server/api_v1_ApiTest.cc +++ b/lib/tests/integration_test/server/api_v1_ApiTest.cc @@ -526,4 +526,4 @@ void ApiTest::echoBody(const HttpRequestPtr &req, auto resp = HttpResponse::newHttpResponse(); resp->setBody(std::string(req->body())); callback(resp); -} \ No newline at end of file +} diff --git a/lib/tests/unittests/ClassNameTest.cc b/lib/tests/unittests/ClassNameTest.cc index 387c938b55..a463c9415b 100644 --- a/lib/tests/unittests/ClassNameTest.cc +++ b/lib/tests/unittests/ClassNameTest.cc @@ -26,4 +26,4 @@ DROGON_TEST(ClassName) CHECK(h.className() == "api::v1::hh"); CHECK(api::v1::hh::classTypeName() == "api::v1::hh"); CHECK(h.name() == "api::v1::hh"); -} \ No newline at end of file +} diff --git a/lib/tests/unittests/ControllerCreationTest.cc b/lib/tests/unittests/ControllerCreationTest.cc index b8fc1d23ee..32b8505bfb 100644 --- a/lib/tests/unittests/ControllerCreationTest.cc +++ b/lib/tests/unittests/ControllerCreationTest.cc @@ -45,4 +45,4 @@ DROGON_TEST(ControllerCreation) REQUIRE(Ctrl::created == false); REQUIRE(SimpleCtrl::created == false); REQUIRE(WsCtrl::created == false); -} \ No newline at end of file +} diff --git a/lib/tests/unittests/DrObjectTest.cc b/lib/tests/unittests/DrObjectTest.cc index cc24b35670..28138dfd6e 100644 --- a/lib/tests/unittests/DrObjectTest.cc +++ b/lib/tests/unittests/DrObjectTest.cc @@ -40,4 +40,4 @@ DROGON_TEST(DrObjectNamespaceTest) auto objPtr2 = DrClassMap::getSingleInstance<::test::TestB>(); CHECK(objPtr2.get() != nullptr); CHECK(objPtr == objPtr2); -} \ No newline at end of file +} diff --git a/lib/tests/unittests/FileTypeTest.cc b/lib/tests/unittests/FileTypeTest.cc index b36bfc5edf..259c115692 100644 --- a/lib/tests/unittests/FileTypeTest.cc +++ b/lib/tests/unittests/FileTypeTest.cc @@ -39,4 +39,4 @@ DROGON_TEST(FileTypeTest) CHECK(parseFileType("") == FT_UNKNOWN); CHECK(parseFileType("don'tknow") == FT_CUSTOM); } -} \ No newline at end of file +} diff --git a/lib/tests/unittests/GzipTest.cc b/lib/tests/unittests/GzipTest.cc index ebed3724e0..8a7149e08c 100644 --- a/lib/tests/unittests/GzipTest.cc +++ b/lib/tests/unittests/GzipTest.cc @@ -316,4 +316,4 @@ DROGON_TEST(Gzip) auto decompressStr = utils::gzipDecompress(ret.data(), ret.length()); CHECK(inStr == decompressStr); -} \ No newline at end of file +} diff --git a/lib/tests/unittests/OStringStreamTest.cc b/lib/tests/unittests/OStringStreamTest.cc index ac94d8af57..c19246a4e5 100644 --- a/lib/tests/unittests/OStringStreamTest.cc +++ b/lib/tests/unittests/OStringStreamTest.cc @@ -56,4 +56,4 @@ DROGON_TEST(OStringStreamTest) CHECK(ss.str() == "hello world!1233.14"); } -} \ No newline at end of file +} diff --git a/lib/tests/unittests/Sha1Test.cc b/lib/tests/unittests/Sha1Test.cc index 36dbb3618c..1b9db41de8 100644 --- a/lib/tests/unittests/Sha1Test.cc +++ b/lib/tests/unittests/Sha1Test.cc @@ -9,4 +9,4 @@ DROGON_TEST(SHA1Test) "678901234567890123456789012345678901234567890"; auto str = drogon::utils::getSha1(in, strlen((const char *)in)); CHECK(str == "FECFD28BBC9345891A66D7C1B8FF46E60192D284"); -} \ No newline at end of file +} diff --git a/nosql_lib/redis/inc/drogon/nosql/RedisException.h b/nosql_lib/redis/inc/drogon/nosql/RedisException.h index dbb8dc0ffe..39f0565458 100644 --- a/nosql_lib/redis/inc/drogon/nosql/RedisException.h +++ b/nosql_lib/redis/inc/drogon/nosql/RedisException.h @@ -66,4 +66,4 @@ class RedisException final : public std::exception using RedisExceptionCallback = std::function; } // namespace nosql -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/nosql_lib/redis/src/RedisTransactionImpl.h b/nosql_lib/redis/src/RedisTransactionImpl.h index 2f65367134..785f850804 100644 --- a/nosql_lib/redis/src/RedisTransactionImpl.h +++ b/nosql_lib/redis/src/RedisTransactionImpl.h @@ -68,4 +68,4 @@ class RedisTransactionImpl final double timeout_{-1.0}; }; } // namespace nosql -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/orm_lib/inc/drogon/orm/RestfulController.h b/orm_lib/inc/drogon/orm/RestfulController.h index 52eb49f471..73d29ca49b 100644 --- a/orm_lib/inc/drogon/orm/RestfulController.h +++ b/orm_lib/inc/drogon/orm/RestfulController.h @@ -180,4 +180,4 @@ class DROGON_EXPORT RestfulController : trantor::NonCopyable std::unordered_map masqueradingMap_; const std::vector columnsVector_; }; -} // namespace drogon \ No newline at end of file +} // namespace drogon diff --git a/orm_lib/src/RestfulController.cc b/orm_lib/src/RestfulController.cc index 965e68acdf..1eb49c2b81 100644 --- a/orm_lib/src/RestfulController.cc +++ b/orm_lib/src/RestfulController.cc @@ -80,4 +80,4 @@ orm::Criteria RestfulController::makeCriteria( } } return ret; -} \ No newline at end of file +} diff --git a/orm_lib/src/mysql_impl/test/test1.cc b/orm_lib/src/mysql_impl/test/test1.cc index d0fd4b1e48..999fd9c5a4 100644 --- a/orm_lib/src/mysql_impl/test/test1.cc +++ b/orm_lib/src/mysql_impl/test/test1.cc @@ -125,4 +125,4 @@ int main() }; LOG_TRACE << "end"; getchar(); -} \ No newline at end of file +} diff --git a/orm_lib/src/sqlite3_impl/Sqlite3ResultImpl.h b/orm_lib/src/sqlite3_impl/Sqlite3ResultImpl.h index ff8e8183cb..069badf9c1 100644 --- a/orm_lib/src/sqlite3_impl/Sqlite3ResultImpl.h +++ b/orm_lib/src/sqlite3_impl/Sqlite3ResultImpl.h @@ -50,4 +50,4 @@ class Sqlite3ResultImpl : public ResultImpl size_t insertId_{0}; }; } // namespace orm -} // namespace drogon \ No newline at end of file +} // namespace drogon From c2b8e7c6248eb6353f301f219da524a9eccecd65 Mon Sep 17 00:00:00 2001 From: Ken Matsui <26405363+ken-matsui@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:21:18 -0800 Subject: [PATCH 05/19] Enable readability/inheritance for cpplint (#1934) --- CPPLINT.cfg | 1 - examples/benchmark/BenchmarkCtrl.h | 2 +- examples/benchmark/JsonCtrl.h | 2 +- examples/redis/controllers/WsClient.h | 13 ++++++------- examples/redis_cache/filters/TimeFilter.h | 6 +++--- examples/redis_chat/controllers/Chat.h | 13 ++++++------- examples/websocket_server/WebSocketServer.cc | 13 ++++++------- lib/inc/drogon/IntranetIpFilter.h | 6 +++--- lib/tests/integration_test/server/BeginAdviceTest.h | 2 +- .../integration_test/server/CustomHeaderFilter.h | 6 +++--- .../integration_test/server/DigestAuthFilter.h | 6 +++--- lib/tests/integration_test/server/ForwardCtrl.h | 2 +- .../integration_test/server/JsonTestController.h | 2 +- lib/tests/integration_test/server/ListParaCtl.h | 2 +- lib/tests/integration_test/server/TestController.h | 2 +- lib/tests/integration_test/server/TestViewCtl.h | 2 +- lib/tests/integration_test/server/TimeFilter.h | 6 +++--- lib/tests/integration_test/server/WebSocketTest.h | 13 ++++++------- 18 files changed, 47 insertions(+), 52 deletions(-) diff --git a/CPPLINT.cfg b/CPPLINT.cfg index 148e047328..6a8c87cd42 100644 --- a/CPPLINT.cfg +++ b/CPPLINT.cfg @@ -34,7 +34,6 @@ filter=-runtime/explicit filter=-runtime/string filter=-runtime/int filter=-readability/multiline_string -filter=-readability/inheritance filter=-readability/casting filter=-readability/braces filter=-readability/fn_size diff --git a/examples/benchmark/BenchmarkCtrl.h b/examples/benchmark/BenchmarkCtrl.h index 4ea8f70205..a285eeb4df 100644 --- a/examples/benchmark/BenchmarkCtrl.h +++ b/examples/benchmark/BenchmarkCtrl.h @@ -5,7 +5,7 @@ using namespace drogon; class BenchmarkCtrl : public drogon::HttpSimpleController { public: - virtual void asyncHandleHttpRequest( + void asyncHandleHttpRequest( const HttpRequestPtr &req, std::function &&callback) override; PATH_LIST_BEGIN diff --git a/examples/benchmark/JsonCtrl.h b/examples/benchmark/JsonCtrl.h index 74f89c7251..7ff7cde562 100644 --- a/examples/benchmark/JsonCtrl.h +++ b/examples/benchmark/JsonCtrl.h @@ -5,7 +5,7 @@ using namespace drogon; class JsonCtrl : public drogon::HttpSimpleController { public: - virtual void asyncHandleHttpRequest( + void asyncHandleHttpRequest( const HttpRequestPtr &req, std::function &&callback) override; PATH_LIST_BEGIN diff --git a/examples/redis/controllers/WsClient.h b/examples/redis/controllers/WsClient.h index 7f3bcd9ef6..c09f86d356 100644 --- a/examples/redis/controllers/WsClient.h +++ b/examples/redis/controllers/WsClient.h @@ -7,13 +7,12 @@ using namespace drogon; class WsClient : public drogon::WebSocketController { public: - virtual void handleNewMessage(const WebSocketConnectionPtr &, - std::string &&, - const WebSocketMessageType &) override; - virtual void handleNewConnection(const HttpRequestPtr &, - const WebSocketConnectionPtr &) override; - virtual void handleConnectionClosed( - const WebSocketConnectionPtr &) override; + void handleNewMessage(const WebSocketConnectionPtr &, + std::string &&, + const WebSocketMessageType &) override; + void handleNewConnection(const HttpRequestPtr &, + const WebSocketConnectionPtr &) override; + void handleConnectionClosed(const WebSocketConnectionPtr &) override; WS_PATH_LIST_BEGIN WS_PATH_ADD("/sub"); WS_PATH_ADD("/pub"); diff --git a/examples/redis_cache/filters/TimeFilter.h b/examples/redis_cache/filters/TimeFilter.h index 67e2c1ac4d..32ed3635a7 100644 --- a/examples/redis_cache/filters/TimeFilter.h +++ b/examples/redis_cache/filters/TimeFilter.h @@ -10,9 +10,9 @@ using namespace drogon; class TimeFilter : public drogon::HttpFilter { public: - virtual void doFilter(const HttpRequestPtr &req, - FilterCallback &&cb, - FilterChainCallback &&ccb) override; + void doFilter(const HttpRequestPtr &req, + FilterCallback &&cb, + FilterChainCallback &&ccb) override; TimeFilter() { diff --git a/examples/redis_chat/controllers/Chat.h b/examples/redis_chat/controllers/Chat.h index f318ac9156..a5d25c7810 100644 --- a/examples/redis_chat/controllers/Chat.h +++ b/examples/redis_chat/controllers/Chat.h @@ -7,13 +7,12 @@ using namespace drogon; class Chat : public drogon::WebSocketController { public: - virtual void handleNewMessage(const WebSocketConnectionPtr &, - std::string &&, - const WebSocketMessageType &) override; - virtual void handleNewConnection(const HttpRequestPtr &, - const WebSocketConnectionPtr &) override; - virtual void handleConnectionClosed( - const WebSocketConnectionPtr &) override; + void handleNewMessage(const WebSocketConnectionPtr &, + std::string &&, + const WebSocketMessageType &) override; + void handleNewConnection(const HttpRequestPtr &, + const WebSocketConnectionPtr &) override; + void handleConnectionClosed(const WebSocketConnectionPtr &) override; WS_PATH_LIST_BEGIN WS_PATH_ADD("/chat"); WS_PATH_LIST_END diff --git a/examples/websocket_server/WebSocketServer.cc b/examples/websocket_server/WebSocketServer.cc index ea48dad132..28d0213fb6 100644 --- a/examples/websocket_server/WebSocketServer.cc +++ b/examples/websocket_server/WebSocketServer.cc @@ -6,13 +6,12 @@ using namespace drogon; class WebSocketChat : public drogon::WebSocketController { public: - virtual void handleNewMessage(const WebSocketConnectionPtr &, - std::string &&, - const WebSocketMessageType &) override; - virtual void handleConnectionClosed( - const WebSocketConnectionPtr &) override; - virtual void handleNewConnection(const HttpRequestPtr &, - const WebSocketConnectionPtr &) override; + void handleNewMessage(const WebSocketConnectionPtr &, + std::string &&, + const WebSocketMessageType &) override; + void handleConnectionClosed(const WebSocketConnectionPtr &) override; + void handleNewConnection(const HttpRequestPtr &, + const WebSocketConnectionPtr &) override; WS_PATH_LIST_BEGIN WS_PATH_ADD("/chat", Get); WS_PATH_LIST_END diff --git a/lib/inc/drogon/IntranetIpFilter.h b/lib/inc/drogon/IntranetIpFilter.h index 5304caf012..bbc53a408c 100644 --- a/lib/inc/drogon/IntranetIpFilter.h +++ b/lib/inc/drogon/IntranetIpFilter.h @@ -29,8 +29,8 @@ class DROGON_EXPORT IntranetIpFilter : public HttpFilter { } - virtual void doFilter(const HttpRequestPtr &req, - FilterCallback &&fcb, - FilterChainCallback &&fccb) override; + void doFilter(const HttpRequestPtr &req, + FilterCallback &&fcb, + FilterChainCallback &&fccb) override; }; } // namespace drogon diff --git a/lib/tests/integration_test/server/BeginAdviceTest.h b/lib/tests/integration_test/server/BeginAdviceTest.h index 790ccb2c89..13a1bfff1e 100644 --- a/lib/tests/integration_test/server/BeginAdviceTest.h +++ b/lib/tests/integration_test/server/BeginAdviceTest.h @@ -7,7 +7,7 @@ using namespace drogon; class BeginAdviceTest : public drogon::HttpSimpleController { public: - virtual void asyncHandleHttpRequest( + void asyncHandleHttpRequest( const HttpRequestPtr &req, std::function &&callback) override; PATH_LIST_BEGIN diff --git a/lib/tests/integration_test/server/CustomHeaderFilter.h b/lib/tests/integration_test/server/CustomHeaderFilter.h index d943d03cf6..b39c3a7c74 100644 --- a/lib/tests/integration_test/server/CustomHeaderFilter.h +++ b/lib/tests/integration_test/server/CustomHeaderFilter.h @@ -17,9 +17,9 @@ class CustomHeaderFilter : public HttpFilter { } - virtual void doFilter(const HttpRequestPtr &req, - FilterCallback &&fcb, - FilterChainCallback &&fccb) override; + void doFilter(const HttpRequestPtr &req, + FilterCallback &&fcb, + FilterChainCallback &&fccb) override; private: std::string field_; diff --git a/lib/tests/integration_test/server/DigestAuthFilter.h b/lib/tests/integration_test/server/DigestAuthFilter.h index bbb2c6ddfb..36c5cd33fe 100644 --- a/lib/tests/integration_test/server/DigestAuthFilter.h +++ b/lib/tests/integration_test/server/DigestAuthFilter.h @@ -27,7 +27,7 @@ class DigestAuthFilter : public drogon::HttpFilter explicit DigestAuthFilter(const CredentialsMap &credentials, const std::string &realm, const std::string &opaque); - virtual void doFilter(const HttpRequestPtr &req, - FilterCallback &&cb, - FilterChainCallback &&ccb) override; + void doFilter(const HttpRequestPtr &req, + FilterCallback &&cb, + FilterChainCallback &&ccb) override; }; diff --git a/lib/tests/integration_test/server/ForwardCtrl.h b/lib/tests/integration_test/server/ForwardCtrl.h index 82de2d02f0..595f8e935d 100644 --- a/lib/tests/integration_test/server/ForwardCtrl.h +++ b/lib/tests/integration_test/server/ForwardCtrl.h @@ -5,7 +5,7 @@ using namespace drogon; class ForwardCtrl : public drogon::HttpSimpleController { public: - virtual void asyncHandleHttpRequest( + void asyncHandleHttpRequest( const HttpRequestPtr &req, std::function &&callback) override; PATH_LIST_BEGIN diff --git a/lib/tests/integration_test/server/JsonTestController.h b/lib/tests/integration_test/server/JsonTestController.h index 21908ac5ba..b4cf37e666 100644 --- a/lib/tests/integration_test/server/JsonTestController.h +++ b/lib/tests/integration_test/server/JsonTestController.h @@ -8,7 +8,7 @@ class JsonTestController { public: // TestController(){} - virtual void asyncHandleHttpRequest( + void asyncHandleHttpRequest( const HttpRequestPtr &req, std::function &&callback) override; diff --git a/lib/tests/integration_test/server/ListParaCtl.h b/lib/tests/integration_test/server/ListParaCtl.h index fea3c93568..bde8147c7e 100644 --- a/lib/tests/integration_test/server/ListParaCtl.h +++ b/lib/tests/integration_test/server/ListParaCtl.h @@ -5,7 +5,7 @@ using namespace drogon; class ListParaCtl : public drogon::HttpSimpleController { public: - virtual void asyncHandleHttpRequest( + void asyncHandleHttpRequest( const HttpRequestPtr &req, std::function &&callback) override; PATH_LIST_BEGIN diff --git a/lib/tests/integration_test/server/TestController.h b/lib/tests/integration_test/server/TestController.h index 20c8cd2248..ff9e04e9cc 100644 --- a/lib/tests/integration_test/server/TestController.h +++ b/lib/tests/integration_test/server/TestController.h @@ -11,7 +11,7 @@ namespace example class TestController : public drogon::HttpSimpleController { public: - virtual void asyncHandleHttpRequest( + void asyncHandleHttpRequest( const HttpRequestPtr &req, std::function &&callback) override; PATH_LIST_BEGIN diff --git a/lib/tests/integration_test/server/TestViewCtl.h b/lib/tests/integration_test/server/TestViewCtl.h index 0c45383714..ccfb8a2851 100644 --- a/lib/tests/integration_test/server/TestViewCtl.h +++ b/lib/tests/integration_test/server/TestViewCtl.h @@ -5,7 +5,7 @@ using namespace drogon; class TestViewCtl : public drogon::HttpSimpleController { public: - virtual void asyncHandleHttpRequest( + void asyncHandleHttpRequest( const HttpRequestPtr &req, std::function &&callback) override; PATH_LIST_BEGIN diff --git a/lib/tests/integration_test/server/TimeFilter.h b/lib/tests/integration_test/server/TimeFilter.h index 67e2c1ac4d..32ed3635a7 100644 --- a/lib/tests/integration_test/server/TimeFilter.h +++ b/lib/tests/integration_test/server/TimeFilter.h @@ -10,9 +10,9 @@ using namespace drogon; class TimeFilter : public drogon::HttpFilter { public: - virtual void doFilter(const HttpRequestPtr &req, - FilterCallback &&cb, - FilterChainCallback &&ccb) override; + void doFilter(const HttpRequestPtr &req, + FilterCallback &&cb, + FilterChainCallback &&ccb) override; TimeFilter() { diff --git a/lib/tests/integration_test/server/WebSocketTest.h b/lib/tests/integration_test/server/WebSocketTest.h index 506870a607..b3fa13d236 100644 --- a/lib/tests/integration_test/server/WebSocketTest.h +++ b/lib/tests/integration_test/server/WebSocketTest.h @@ -8,13 +8,12 @@ namespace example class WebSocketTest : public drogon::WebSocketController { public: - virtual void handleNewMessage(const WebSocketConnectionPtr &, - std::string &&, - const WebSocketMessageType &) override; - virtual void handleConnectionClosed( - const WebSocketConnectionPtr &) override; - virtual void handleNewConnection(const HttpRequestPtr &, - const WebSocketConnectionPtr &) override; + void handleNewMessage(const WebSocketConnectionPtr &, + std::string &&, + const WebSocketMessageType &) override; + void handleConnectionClosed(const WebSocketConnectionPtr &) override; + void handleNewConnection(const HttpRequestPtr &, + const WebSocketConnectionPtr &) override; WS_PATH_LIST_BEGIN // list path definitions here; WS_PATH_ADD("/chat", "drogon::LocalHostFilter", Get); From 3c8c273582477d12b6af83ee645405092b005b6d Mon Sep 17 00:00:00 2001 From: Ken Matsui <26405363+ken-matsui@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:21:39 -0800 Subject: [PATCH 06/19] Enable build/explicit_make_pair for cpplint (#1935) --- CPPLINT.cfg | 1 - lib/src/ConfigLoader.cc | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CPPLINT.cfg b/CPPLINT.cfg index 6a8c87cd42..7b20693252 100644 --- a/CPPLINT.cfg +++ b/CPPLINT.cfg @@ -29,7 +29,6 @@ filter=-build/include filter=-build/header_guard filter=-build/include_what_you_use filter=-build/include_order -filter=-build/explicit_make_pair filter=-runtime/explicit filter=-runtime/string filter=-runtime/int diff --git a/lib/src/ConfigLoader.cc b/lib/src/ConfigLoader.cc index c7f0cdde5f..3e9fa5da44 100644 --- a/lib/src/ConfigLoader.cc +++ b/lib/src/ConfigLoader.cc @@ -290,8 +290,9 @@ static void loadApp(const Json::Value &app) std::vector> headers; for (auto &header : app["static_file_headers"]) { - headers.emplace_back(std::make_pair( - header["name"].asString(), header["value"].asString())); + headers.emplace_back( + std::make_pair(header["name"].asString(), + header["value"].asString())); } drogon::app().setStaticFileHeaders(headers); } From 5f273d87441e8a57e23c03a012c7d3482751370a Mon Sep 17 00:00:00 2001 From: Ken Matsui <26405363+ken-matsui@users.noreply.github.com> Date: Tue, 30 Jan 2024 22:00:56 -0800 Subject: [PATCH 07/19] Enable build/include_order for cpplint (#1938) --- CPPLINT.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/CPPLINT.cfg b/CPPLINT.cfg index 7b20693252..de5b88e9b7 100644 --- a/CPPLINT.cfg +++ b/CPPLINT.cfg @@ -28,7 +28,6 @@ filter=-build/namespaces filter=-build/include filter=-build/header_guard filter=-build/include_what_you_use -filter=-build/include_order filter=-runtime/explicit filter=-runtime/string filter=-runtime/int From 0d178877f072d702423c0cc7efddbacd113d381c Mon Sep 17 00:00:00 2001 From: Ken Matsui <26405363+ken-matsui@users.noreply.github.com> Date: Wed, 31 Jan 2024 03:05:20 -0800 Subject: [PATCH 08/19] Enable build/header_guard for cpplint (#1936) --- CPPLINT.cfg | 1 - cmake/templates/version.h.in | 4 +++- lib/inc/drogon/utils/monitoring/StopWatch.h | 1 + lib/src/RangeParser.h | 1 + lib/src/TaskTimeoutFlag.h | 2 ++ third_party/mman-win32/mman.h | 2 +- 6 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CPPLINT.cfg b/CPPLINT.cfg index de5b88e9b7..428c606341 100644 --- a/CPPLINT.cfg +++ b/CPPLINT.cfg @@ -26,7 +26,6 @@ filter=-legal/copyright filter=-build/storage_class filter=-build/namespaces filter=-build/include -filter=-build/header_guard filter=-build/include_what_you_use filter=-runtime/explicit filter=-runtime/string diff --git a/cmake/templates/version.h.in b/cmake/templates/version.h.in index 4542ba00a7..fbde744b43 100644 --- a/cmake/templates/version.h.in +++ b/cmake/templates/version.h.in @@ -1,5 +1,7 @@ +#pragma once + #define MAJOR @DROGON_MAJOR_VERSION@ #define MINOR @DROGON_MINOR_VERSION@ #define PATCH @DROGON_PATCH_VERSION@ #define DROGON_VERSION "@DROGON_VERSION_STRING@" -#define DROGON_VERSION_SHA1 "@GIT_SHA1@" \ No newline at end of file +#define DROGON_VERSION_SHA1 "@GIT_SHA1@" diff --git a/lib/inc/drogon/utils/monitoring/StopWatch.h b/lib/inc/drogon/utils/monitoring/StopWatch.h index a0a2208f93..dabeaff52c 100644 --- a/lib/inc/drogon/utils/monitoring/StopWatch.h +++ b/lib/inc/drogon/utils/monitoring/StopWatch.h @@ -11,6 +11,7 @@ * Drogon * */ +#pragma once #include #include diff --git a/lib/src/RangeParser.h b/lib/src/RangeParser.h index f0dcd55e0c..59261c36b5 100644 --- a/lib/src/RangeParser.h +++ b/lib/src/RangeParser.h @@ -11,6 +11,7 @@ * Drogon * */ +#pragma once #include #include diff --git a/lib/src/TaskTimeoutFlag.h b/lib/src/TaskTimeoutFlag.h index 8a17f3c811..fb11ae3085 100644 --- a/lib/src/TaskTimeoutFlag.h +++ b/lib/src/TaskTimeoutFlag.h @@ -11,6 +11,8 @@ * Drogon * */ +#pragma once + #include #include #include diff --git a/third_party/mman-win32/mman.h b/third_party/mman-win32/mman.h index 047d3a03ed..effb8145ce 100644 --- a/third_party/mman-win32/mman.h +++ b/third_party/mman-win32/mman.h @@ -3,7 +3,7 @@ * mman-win32 */ -#ifndef _SYS_MMAN_H_ +#ifndef _SYS_MMAN_H_ // NOLINT(build/header_guard) #define _SYS_MMAN_H_ #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. From f63480674f66fe556f72d6e91642a54d7c564829 Mon Sep 17 00:00:00 2001 From: Ken Matsui <26405363+ken-matsui@users.noreply.github.com> Date: Wed, 31 Jan 2024 03:21:46 -0800 Subject: [PATCH 09/19] Enable build/storage_class for cpplint (#1937) --- CPPLINT.cfg | 1 - drogon_ctl/templates/model_cc.csp | 16 +++++++-------- drogon_ctl/templates/model_h.csp | 10 +++++----- lib/inc/drogon/Attribute.h | 2 +- lib/inc/drogon/HttpViewData.h | 2 +- lib/src/HttpClientImpl.cc | 2 +- lib/src/HttpRequestImpl.h | 10 +++++----- lib/src/HttpResponseImpl.h | 4 ++-- lib/src/SpinLock.h | 2 +- lib/src/Utilities.cc | 2 +- orm_lib/src/DbConnection.cc | 2 +- orm_lib/src/postgresql_impl/test/test2.cc | 8 ++++---- orm_lib/src/sqlite3_impl/test/Groups.cc | 24 +++++++++++------------ orm_lib/src/sqlite3_impl/test/Groups.h | 8 ++++---- orm_lib/tests/mysql/Blog.cc | 14 ++++++------- orm_lib/tests/mysql/Blog.h | 8 ++++---- orm_lib/tests/mysql/BlogTag.cc | 4 ++-- orm_lib/tests/mysql/BlogTag.h | 8 ++++---- orm_lib/tests/mysql/Category.cc | 8 ++++---- orm_lib/tests/mysql/Category.h | 8 ++++---- orm_lib/tests/mysql/Tag.cc | 8 ++++---- orm_lib/tests/mysql/Tag.h | 8 ++++---- orm_lib/tests/mysql/Users.cc | 22 ++++++++++----------- orm_lib/tests/mysql/Users.h | 8 ++++---- orm_lib/tests/mysql/Wallets.cc | 10 +++++----- orm_lib/tests/mysql/Wallets.h | 8 ++++---- orm_lib/tests/postgresql/Blog.cc | 14 ++++++------- orm_lib/tests/postgresql/Blog.h | 8 ++++---- orm_lib/tests/postgresql/BlogTag.cc | 4 ++-- orm_lib/tests/postgresql/BlogTag.h | 8 ++++---- orm_lib/tests/postgresql/Category.cc | 8 ++++---- orm_lib/tests/postgresql/Category.h | 8 ++++---- orm_lib/tests/postgresql/Tag.cc | 8 ++++---- orm_lib/tests/postgresql/Tag.h | 8 ++++---- orm_lib/tests/postgresql/Users.cc | 22 ++++++++++----------- orm_lib/tests/postgresql/Users.h | 8 ++++---- orm_lib/tests/postgresql/Wallets.cc | 10 +++++----- orm_lib/tests/postgresql/Wallets.h | 8 ++++---- orm_lib/tests/sqlite3/Blog.cc | 14 ++++++------- orm_lib/tests/sqlite3/Blog.h | 8 ++++---- orm_lib/tests/sqlite3/BlogTag.cc | 4 ++-- orm_lib/tests/sqlite3/BlogTag.h | 8 ++++---- orm_lib/tests/sqlite3/Category.cc | 8 ++++---- orm_lib/tests/sqlite3/Category.h | 8 ++++---- orm_lib/tests/sqlite3/Tag.cc | 8 ++++---- orm_lib/tests/sqlite3/Tag.h | 8 ++++---- orm_lib/tests/sqlite3/Users.cc | 24 +++++++++++------------ orm_lib/tests/sqlite3/Users.h | 8 ++++---- orm_lib/tests/sqlite3/Wallets.cc | 10 +++++----- orm_lib/tests/sqlite3/Wallets.h | 8 ++++---- 50 files changed, 218 insertions(+), 219 deletions(-) diff --git a/CPPLINT.cfg b/CPPLINT.cfg index 428c606341..1ae88a6e1e 100644 --- a/CPPLINT.cfg +++ b/CPPLINT.cfg @@ -23,7 +23,6 @@ filter=-readability/todo # TODO: Fix these. filter=-legal/copyright -filter=-build/storage_class filter=-build/namespaces filter=-build/include filter=-build/include_what_you_use diff --git a/drogon_ctl/templates/model_cc.csp b/drogon_ctl/templates/model_cc.csp index cbfc082ae2..d6510cc0d4 100644 --- a/drogon_ctl/templates/model_cc.csp +++ b/drogon_ctl/templates/model_cc.csp @@ -975,7 +975,7 @@ void [[className]]::updateByJson(const Json::Value &pJson) noexcept(false) { $$<<"const "<data(),"<size());\n"; $$<<" return defaultValue;\n"; @@ -1584,7 +1584,7 @@ for(auto &relationship : relationships) { %> {%relationshipClassName%} [[className]]::get{%alias%}(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from {%name%} where {%relationship.targetKey()%} = <%c++ + static const std::string sql = "select * from {%name%} where {%relationship.targetKey()%} = <%c++ if(rdbms=="postgresql") { $$<<"$1"; @@ -1615,7 +1615,7 @@ void [[className]]::get{%alias%}(const DbClientPtr &clientPtr, {%indentStr%} {%alind%} const std::function &rcb, {%indentStr%} {%alind%} const ExceptionCallback &ecb) const { - const static std::string sql = "select * from {%name%} where {%relationship.targetKey()%} = <%c++ + static const std::string sql = "select * from {%name%} where {%relationship.targetKey()%} = <%c++ if(rdbms=="postgresql") { $$<<"$1"; @@ -1648,7 +1648,7 @@ void [[className]]::get{%alias%}(const DbClientPtr &clientPtr, { %> std::vector<{%relationshipClassName%}> [[className]]::get{%alias%}(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from {%name%} where {%relationship.targetKey()%} = <%c++ + static const std::string sql = "select * from {%name%} where {%relationship.targetKey()%} = <%c++ if(rdbms=="postgresql") { $$<<"$1"; @@ -1677,7 +1677,7 @@ void [[className]]::get{%alias%}(const DbClientPtr &clientPtr, {%indentStr%} {%alind%} const std::function)> &rcb, {%indentStr%} {%alind%} const ExceptionCallback &ecb) const { - const static std::string sql = "select * from {%name%} where {%relationship.targetKey()%} = <%c++ + static const std::string sql = "select * from {%name%} where {%relationship.targetKey()%} = <%c++ if(rdbms=="postgresql") { $$<<"$1"; @@ -1709,7 +1709,7 @@ void [[className]]::get{%alias%}(const DbClientPtr &clientPtr, auto &pivotTargetKey=relationship.pivotTable().targetKey(); %> std::vector> [[className]]::get{%alias%}(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from {%name%},{%pivotTableName%} where {%pivotTableName%}.{%pivotOriginalKey%} = <%c++ + static const std::string sql = "select * from {%name%},{%pivotTableName%} where {%pivotTableName%}.{%pivotOriginalKey%} = <%c++ if(rdbms=="postgresql") { $$<<"$1"; @@ -1739,7 +1739,7 @@ void [[className]]::get{%alias%}(const DbClientPtr &clientPtr, {%indentStr%} {%alind%} const std::function>)> &rcb, {%indentStr%} {%alind%} const ExceptionCallback &ecb) const { - const static std::string sql = "select * from {%name%},{%pivotTableName%} where {%pivotTableName%}.{%pivotOriginalKey%} = <%c++ + static const std::string sql = "select * from {%name%},{%pivotTableName%} where {%pivotTableName%}.{%pivotOriginalKey%} = <%c++ if(rdbms=="postgresql") { $$<<"$1"; diff --git a/drogon_ctl/templates/model_h.csp b/drogon_ctl/templates/model_h.csp index 0ed1eeeef6..d09fe6d71f 100644 --- a/drogon_ctl/templates/model_h.csp +++ b/drogon_ctl/templates/model_h.csp @@ -86,11 +86,11 @@ auto cols=@@.get>("columns"); %> }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; <%c++if(@@.get("hasPrimaryKey")<=1){%> - const static std::string primaryKeyName; + static const std::string primaryKeyName; <%c++if(!@@.get("primaryKeyType").empty()){%> using PrimaryKeyType = [[primaryKeyType]]; const PrimaryKeyType &getPrimaryKey() const; @@ -108,7 +108,7 @@ auto cols=@@.get>("columns"); typelist += ","; } %> - const static std::vector primaryKeyName; + static const std::vector primaryKeyName; using PrimaryKeyType = std::tuple<{%typelist%}>;//<%c++ auto pkName=@@.get>("primaryKeyName"); for(size_t i=0;i const T &get(const std::string &key) const { - const static T nullVal = T(); + static const T nullVal = T(); auto it = attributesMap_.find(key); if (it != attributesMap_.end()) { diff --git a/lib/inc/drogon/HttpViewData.h b/lib/inc/drogon/HttpViewData.h index 8044261cdb..1a9191da7c 100644 --- a/lib/inc/drogon/HttpViewData.h +++ b/lib/inc/drogon/HttpViewData.h @@ -37,7 +37,7 @@ class DROGON_EXPORT HttpViewData template const T &get(const std::string &key) const { - const static T nullVal = T(); + static const T nullVal = T(); auto it = viewData_.find(key); if (it != viewData_.end()) { diff --git a/lib/src/HttpClientImpl.cc b/lib/src/HttpClientImpl.cc index 60054630e3..14c19de0fd 100644 --- a/lib/src/HttpClientImpl.cc +++ b/lib/src/HttpClientImpl.cc @@ -28,7 +28,7 @@ using namespace std::placeholders; namespace trantor { -const static size_t kDefaultDNSTimeout{600}; +static const size_t kDefaultDNSTimeout{600}; } void HttpClientImpl::createTcpClient() diff --git a/lib/src/HttpRequestImpl.h b/lib/src/HttpRequestImpl.h index e7625b98f4..3dd503ded6 100644 --- a/lib/src/HttpRequestImpl.h +++ b/lib/src/HttpRequestImpl.h @@ -180,7 +180,7 @@ class HttpRequestImpl : public HttpRequest const std::string &getParameter(const std::string &key) const override { - const static std::string defaultVal; + static const std::string defaultVal; parseParametersOnce(); auto iter = parameters_.find(key); if (iter != parameters_.end()) @@ -322,7 +322,7 @@ class HttpRequestImpl : public HttpRequest const std::string &getHeaderBy(const std::string &lowerField) const { - const static std::string defaultVal; + static const std::string defaultVal; auto it = headers_.find(lowerField); if (it != headers_.end()) { @@ -333,7 +333,7 @@ class HttpRequestImpl : public HttpRequest const std::string &getCookie(const std::string &field) const override { - const static std::string defaultVal; + static const std::string defaultVal; auto it = cookies_.find(field); if (it != cookies_.end()) { @@ -509,7 +509,7 @@ class HttpRequestImpl : public HttpRequest const std::string &expect() const { - const static std::string none{""}; + static const std::string none{""}; if (expectPtr_) return *expectPtr_; return none; @@ -527,7 +527,7 @@ class HttpRequestImpl : public HttpRequest const std::string &getJsonError() const override { - const static std::string none{""}; + static const std::string none{""}; if (jsonParsingErrorPtr_) return *jsonParsingErrorPtr_; return none; diff --git a/lib/src/HttpResponseImpl.h b/lib/src/HttpResponseImpl.h index 78d53a29ba..a979fa692d 100644 --- a/lib/src/HttpResponseImpl.h +++ b/lib/src/HttpResponseImpl.h @@ -143,7 +143,7 @@ class DROGON_EXPORT HttpResponseImpl : public HttpResponse const std::string &getHeaderBy(const std::string &lowerKey) const { - const static std::string defaultVal; + static const std::string defaultVal; auto iter = headers_.find(lowerKey); if (iter == headers_.end()) { @@ -298,7 +298,7 @@ class DROGON_EXPORT HttpResponseImpl : public HttpResponse const std::string &getJsonError() const override { - const static std::string none; + static const std::string none; if (jsonParsingErrorPtr_) return *jsonParsingErrorPtr_; return none; diff --git a/lib/src/SpinLock.h b/lib/src/SpinLock.h index ee572ee448..9591006e7f 100644 --- a/lib/src/SpinLock.h +++ b/lib/src/SpinLock.h @@ -25,7 +25,7 @@ class SpinLock public: inline SpinLock(std::atomic &flag) : flag_(flag) { - const static int cpu = std::thread::hardware_concurrency(); + static const int cpu = std::thread::hardware_concurrency(); int n, i; while (1) { diff --git a/lib/src/Utilities.cc b/lib/src/Utilities.cc index 25ff5ac899..fff417d6ab 100644 --- a/lib/src/Utilities.cc +++ b/lib/src/Utilities.cc @@ -127,7 +127,7 @@ class Base64CharMap char charMap_[256]{0}; }; -const static Base64CharMap base64CharMap; +static const Base64CharMap base64CharMap; static inline bool isBase64(unsigned char c) { diff --git a/orm_lib/src/DbConnection.cc b/orm_lib/src/DbConnection.cc index 8a88a5b3bd..c0cb081700 100644 --- a/orm_lib/src/DbConnection.cc +++ b/orm_lib/src/DbConnection.cc @@ -21,7 +21,7 @@ using namespace drogon::orm; std::map DbConnection::parseConnString( const std::string &connInfo) { - const static std::regex re( + static const std::regex re( R"((\w+) *= *('(?:[^\n]|\\[^\n])+'|(?:\S|\\\S)+))"); std::smatch what; std::map params; diff --git a/orm_lib/src/postgresql_impl/test/test2.cc b/orm_lib/src/postgresql_impl/test/test2.cc index 5a6f19d280..40d75a3460 100644 --- a/orm_lib/src/postgresql_impl/test/test2.cc +++ b/orm_lib/src/postgresql_impl/test/test2.cc @@ -13,9 +13,9 @@ using namespace drogon::orm; class User { public: - const static std::string primaryKeyName; - const static bool hasPrimaryKey; - const static std::string tableName; + static const std::string primaryKeyName; + static const bool hasPrimaryKey; + static const std::string tableName; using PrimaryKeyType = int; @@ -30,7 +30,7 @@ class User static const std::string &sqlForFindingByPrimaryKey() { - const static std::string sql = + static const std::string sql = "select * from users where user_uuid = $1"; return sql; } diff --git a/orm_lib/src/sqlite3_impl/test/Groups.cc b/orm_lib/src/sqlite3_impl/test/Groups.cc index 0421247453..88924f2644 100644 --- a/orm_lib/src/sqlite3_impl/test/Groups.cc +++ b/orm_lib/src/sqlite3_impl/test/Groups.cc @@ -620,7 +620,7 @@ void Groups::updateByJson(const Json::Value &pJson) noexcept(false) const uint64_t &Groups::getValueOfGroupId() const noexcept { - const static uint64_t defaultValue = uint64_t(); + static const uint64_t defaultValue = uint64_t(); if (groupId_) return *groupId_; return defaultValue; @@ -639,7 +639,7 @@ const typename Groups::PrimaryKeyType &Groups::getPrimaryKey() const const std::string &Groups::getValueOfGroupName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (groupName_) return *groupName_; return defaultValue; @@ -670,7 +670,7 @@ void Groups::setGroupNameToNull() noexcept const uint64_t &Groups::getValueOfCreaterId() const noexcept { - const static uint64_t defaultValue = uint64_t(); + static const uint64_t defaultValue = uint64_t(); if (createrId_) return *createrId_; return defaultValue; @@ -695,7 +695,7 @@ void Groups::setCreaterIdToNull() noexcept const std::string &Groups::getValueOfCreateTime() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (createTime_) return *createTime_; return defaultValue; @@ -726,7 +726,7 @@ void Groups::setCreateTimeToNull() noexcept const uint64_t &Groups::getValueOfInviting() const noexcept { - const static uint64_t defaultValue = uint64_t(); + static const uint64_t defaultValue = uint64_t(); if (inviting_) return *inviting_; return defaultValue; @@ -751,7 +751,7 @@ void Groups::setInvitingToNull() noexcept const uint64_t &Groups::getValueOfInvitingUserId() const noexcept { - const static uint64_t defaultValue = uint64_t(); + static const uint64_t defaultValue = uint64_t(); if (invitingUserId_) return *invitingUserId_; return defaultValue; @@ -776,7 +776,7 @@ void Groups::setInvitingUserIdToNull() noexcept const std::string &Groups::getValueOfAvatarId() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (avatarId_) return *avatarId_; return defaultValue; @@ -807,7 +807,7 @@ void Groups::setAvatarIdToNull() noexcept const double &Groups::getValueOfUuu() const noexcept { - const static double defaultValue = double(); + static const double defaultValue = double(); if (uuu_) return *uuu_; return defaultValue; @@ -832,7 +832,7 @@ void Groups::setUuuToNull() noexcept const std::string &Groups::getValueOfText() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (text_) return *text_; return defaultValue; @@ -863,7 +863,7 @@ void Groups::setTextToNull() noexcept const std::vector &Groups::getValueOfAvatar() const noexcept { - const static std::vector defaultValue = std::vector(); + static const std::vector defaultValue = std::vector(); if (avatar_) return *avatar_; return defaultValue; @@ -871,7 +871,7 @@ const std::vector &Groups::getValueOfAvatar() const noexcept std::string Groups::getValueOfAvatarAsString() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (avatar_) return std::string(avatar_->data(), avatar_->size()); return defaultValue; @@ -904,7 +904,7 @@ void Groups::setAvatarToNull() noexcept const bool &Groups::getValueOfIsDefault() const noexcept { - const static bool defaultValue = bool(); + static const bool defaultValue = bool(); if (isDefault_) return *isDefault_; return defaultValue; diff --git a/orm_lib/src/sqlite3_impl/test/Groups.h b/orm_lib/src/sqlite3_impl/test/Groups.h index d9e7f0e02e..8e3b8af153 100644 --- a/orm_lib/src/sqlite3_impl/test/Groups.h +++ b/orm_lib/src/sqlite3_impl/test/Groups.h @@ -54,10 +54,10 @@ class Groups static const std::string _is_default; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = uint64_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/mysql/Blog.cc b/orm_lib/tests/mysql/Blog.cc index 0bde571cf7..c7f74d2d34 100644 --- a/orm_lib/tests/mysql/Blog.cc +++ b/orm_lib/tests/mysql/Blog.cc @@ -219,7 +219,7 @@ void Blog::updateByJson(const Json::Value &pJson) noexcept(false) const int32_t &Blog::getValueOfId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (id_) return *id_; return defaultValue; @@ -244,7 +244,7 @@ const typename Blog::PrimaryKeyType &Blog::getPrimaryKey() const const std::string &Blog::getValueOfTitle() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (title_) return *title_; return defaultValue; @@ -275,7 +275,7 @@ void Blog::setTitleToNull() noexcept const int32_t &Blog::getValueOfCategoryId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (categoryId_) return *categoryId_; return defaultValue; @@ -703,7 +703,7 @@ bool Blog::validJsonOfField(size_t index, Category Blog::getCategory(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from category where id = ?"; + static const std::string sql = "select * from category where id = ?"; Result r(nullptr); { auto binder = *clientPtr << sql; @@ -726,7 +726,7 @@ void Blog::getCategory(const DbClientPtr &clientPtr, const std::function &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = "select * from category where id = ?"; + static const std::string sql = "select * from category where id = ?"; *clientPtr << sql << *categoryId_ >> [rcb = std::move(rcb), ecb](const Result &r) { if (r.size() == 0) @@ -747,7 +747,7 @@ void Blog::getCategory(const DbClientPtr &clientPtr, std::vector> Blog::getTags( const DbClientPtr &clientPtr) const { - const static std::string sql = + static const std::string sql = "select * from tag,blog_tag where blog_tag.blog_id = ? and " "blog_tag.tag_id = tag.id"; Result r(nullptr); @@ -773,7 +773,7 @@ void Blog::getTags( const std::function>)> &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = + static const std::string sql = "select * from tag,blog_tag where blog_tag.blog_id = ? and " "blog_tag.tag_id = tag.id"; *clientPtr << sql << *id_ >> [rcb = std::move(rcb)](const Result &r) { diff --git a/orm_lib/tests/mysql/Blog.h b/orm_lib/tests/mysql/Blog.h index 72d313092f..250e5382b4 100644 --- a/orm_lib/tests/mysql/Blog.h +++ b/orm_lib/tests/mysql/Blog.h @@ -53,10 +53,10 @@ class Blog static const std::string _category_id; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int32_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/mysql/BlogTag.cc b/orm_lib/tests/mysql/BlogTag.cc index ed042fbe6b..8742dcbe1a 100644 --- a/orm_lib/tests/mysql/BlogTag.cc +++ b/orm_lib/tests/mysql/BlogTag.cc @@ -168,7 +168,7 @@ void BlogTag::updateByJson(const Json::Value &pJson) noexcept(false) const int32_t &BlogTag::getValueOfBlogId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (blogId_) return *blogId_; return defaultValue; @@ -187,7 +187,7 @@ void BlogTag::setBlogId(const int32_t &pBlogId) noexcept const int32_t &BlogTag::getValueOfTagId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (tagId_) return *tagId_; return defaultValue; diff --git a/orm_lib/tests/mysql/BlogTag.h b/orm_lib/tests/mysql/BlogTag.h index 2ec1e9db16..a50f2eb827 100644 --- a/orm_lib/tests/mysql/BlogTag.h +++ b/orm_lib/tests/mysql/BlogTag.h @@ -49,10 +49,10 @@ class BlogTag static const std::string _tag_id; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::vector primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::vector primaryKeyName; using PrimaryKeyType = std::tuple; // blog_id,tag_id PrimaryKeyType getPrimaryKey() const; diff --git a/orm_lib/tests/mysql/Category.cc b/orm_lib/tests/mysql/Category.cc index bf177eba0a..37102a0f87 100644 --- a/orm_lib/tests/mysql/Category.cc +++ b/orm_lib/tests/mysql/Category.cc @@ -167,7 +167,7 @@ void Category::updateByJson(const Json::Value &pJson) noexcept(false) const int32_t &Category::getValueOfId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (id_) return *id_; return defaultValue; @@ -192,7 +192,7 @@ const typename Category::PrimaryKeyType &Category::getPrimaryKey() const const std::string &Category::getValueOfName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (name_) return *name_; return defaultValue; @@ -529,7 +529,7 @@ bool Category::validJsonOfField(size_t index, std::vector Category::getBlogs(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from blog where category_id = ?"; + static const std::string sql = "select * from blog where category_id = ?"; Result r(nullptr); { auto binder = *clientPtr << sql; @@ -550,7 +550,7 @@ void Category::getBlogs(const DbClientPtr &clientPtr, const std::function)> &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = "select * from blog where category_id = ?"; + static const std::string sql = "select * from blog where category_id = ?"; *clientPtr << sql << *id_ >> [rcb = std::move(rcb)](const Result &r) { std::vector ret; ret.reserve(r.size()); diff --git a/orm_lib/tests/mysql/Category.h b/orm_lib/tests/mysql/Category.h index 72b6b8a415..858b99eed7 100644 --- a/orm_lib/tests/mysql/Category.h +++ b/orm_lib/tests/mysql/Category.h @@ -50,10 +50,10 @@ class Category static const std::string _name; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int32_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/mysql/Tag.cc b/orm_lib/tests/mysql/Tag.cc index 6a0ad36304..06709fc8bd 100644 --- a/orm_lib/tests/mysql/Tag.cc +++ b/orm_lib/tests/mysql/Tag.cc @@ -167,7 +167,7 @@ void Tag::updateByJson(const Json::Value &pJson) noexcept(false) const int32_t &Tag::getValueOfId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (id_) return *id_; return defaultValue; @@ -192,7 +192,7 @@ const typename Tag::PrimaryKeyType &Tag::getPrimaryKey() const const std::string &Tag::getValueOfName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (name_) return *name_; return defaultValue; @@ -529,7 +529,7 @@ bool Tag::validJsonOfField(size_t index, std::vector> Tag::getBlogs( const DbClientPtr &clientPtr) const { - const static std::string sql = + static const std::string sql = "select * from blog,blog_tag where blog_tag.tag_id = ? and " "blog_tag.blog_id = blog.id"; Result r(nullptr); @@ -555,7 +555,7 @@ void Tag::getBlogs( const std::function>)> &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = + static const std::string sql = "select * from blog,blog_tag where blog_tag.tag_id = ? and " "blog_tag.blog_id = blog.id"; *clientPtr << sql << *id_ >> [rcb = std::move(rcb)](const Result &r) { diff --git a/orm_lib/tests/mysql/Tag.h b/orm_lib/tests/mysql/Tag.h index f7005b52d1..f3ab5d6ded 100644 --- a/orm_lib/tests/mysql/Tag.h +++ b/orm_lib/tests/mysql/Tag.h @@ -51,10 +51,10 @@ class Tag static const std::string _name; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int32_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/mysql/Users.cc b/orm_lib/tests/mysql/Users.cc index 53f187b58d..1281ba4d42 100644 --- a/orm_lib/tests/mysql/Users.cc +++ b/orm_lib/tests/mysql/Users.cc @@ -519,7 +519,7 @@ void Users::updateByJson(const Json::Value &pJson) noexcept(false) const int32_t &Users::getValueOfId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (id_) return *id_; return defaultValue; @@ -544,7 +544,7 @@ const typename Users::PrimaryKeyType &Users::getPrimaryKey() const const std::string &Users::getValueOfUserId() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (userId_) return *userId_; return defaultValue; @@ -575,7 +575,7 @@ void Users::setUserIdToNull() noexcept const std::string &Users::getValueOfUserName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (userName_) return *userName_; return defaultValue; @@ -606,7 +606,7 @@ void Users::setUserNameToNull() noexcept const std::string &Users::getValueOfPassword() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (password_) return *password_; return defaultValue; @@ -637,7 +637,7 @@ void Users::setPasswordToNull() noexcept const std::string &Users::getValueOfOrgName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (orgName_) return *orgName_; return defaultValue; @@ -668,7 +668,7 @@ void Users::setOrgNameToNull() noexcept const std::string &Users::getValueOfSignature() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (signature_) return *signature_; return defaultValue; @@ -699,7 +699,7 @@ void Users::setSignatureToNull() noexcept const std::string &Users::getValueOfAvatarId() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (avatarId_) return *avatarId_; return defaultValue; @@ -730,7 +730,7 @@ void Users::setAvatarIdToNull() noexcept const std::string &Users::getValueOfSalt() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (salt_) return *salt_; return defaultValue; @@ -761,7 +761,7 @@ void Users::setSaltToNull() noexcept const int8_t &Users::getValueOfAdmin() const noexcept { - const static int8_t defaultValue = int8_t(); + static const int8_t defaultValue = int8_t(); if (admin_) return *admin_; return defaultValue; @@ -1824,7 +1824,7 @@ bool Users::validJsonOfField(size_t index, Wallets Users::getWallet(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from wallets where user_id = ?"; + static const std::string sql = "select * from wallets where user_id = ?"; Result r(nullptr); { auto binder = *clientPtr << sql; @@ -1847,7 +1847,7 @@ void Users::getWallet(const DbClientPtr &clientPtr, const std::function &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = "select * from wallets where user_id = ?"; + static const std::string sql = "select * from wallets where user_id = ?"; *clientPtr << sql << *userId_ >> [rcb = std::move(rcb), ecb](const Result &r) { if (r.size() == 0) diff --git a/orm_lib/tests/mysql/Users.h b/orm_lib/tests/mysql/Users.h index 49abd02dea..09ca9e25a7 100644 --- a/orm_lib/tests/mysql/Users.h +++ b/orm_lib/tests/mysql/Users.h @@ -57,10 +57,10 @@ class Users static const std::string _admin; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int32_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/mysql/Wallets.cc b/orm_lib/tests/mysql/Wallets.cc index cef92b7e4f..fce22a7b14 100644 --- a/orm_lib/tests/mysql/Wallets.cc +++ b/orm_lib/tests/mysql/Wallets.cc @@ -218,7 +218,7 @@ void Wallets::updateByJson(const Json::Value &pJson) noexcept(false) const int32_t &Wallets::getValueOfId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (id_) return *id_; return defaultValue; @@ -243,7 +243,7 @@ const typename Wallets::PrimaryKeyType &Wallets::getPrimaryKey() const const std::string &Wallets::getValueOfUserId() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (userId_) return *userId_; return defaultValue; @@ -274,7 +274,7 @@ void Wallets::setUserIdToNull() noexcept const std::string &Wallets::getValueOfAmount() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (amount_) return *amount_; return defaultValue; @@ -707,7 +707,7 @@ bool Wallets::validJsonOfField(size_t index, Users Wallets::getUser(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from users where user_id = ?"; + static const std::string sql = "select * from users where user_id = ?"; Result r(nullptr); { auto binder = *clientPtr << sql; @@ -730,7 +730,7 @@ void Wallets::getUser(const DbClientPtr &clientPtr, const std::function &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = "select * from users where user_id = ?"; + static const std::string sql = "select * from users where user_id = ?"; *clientPtr << sql << *userId_ >> [rcb = std::move(rcb), ecb](const Result &r) { if (r.size() == 0) diff --git a/orm_lib/tests/mysql/Wallets.h b/orm_lib/tests/mysql/Wallets.h index 7f5bd50f2d..e823e1941e 100644 --- a/orm_lib/tests/mysql/Wallets.h +++ b/orm_lib/tests/mysql/Wallets.h @@ -51,10 +51,10 @@ class Wallets static const std::string _amount; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int32_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/postgresql/Blog.cc b/orm_lib/tests/postgresql/Blog.cc index 83bef76625..c3260ae2be 100644 --- a/orm_lib/tests/postgresql/Blog.cc +++ b/orm_lib/tests/postgresql/Blog.cc @@ -219,7 +219,7 @@ void Blog::updateByJson(const Json::Value &pJson) noexcept(false) const int32_t &Blog::getValueOfId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (id_) return *id_; return defaultValue; @@ -244,7 +244,7 @@ const typename Blog::PrimaryKeyType &Blog::getPrimaryKey() const const std::string &Blog::getValueOfTitle() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (title_) return *title_; return defaultValue; @@ -275,7 +275,7 @@ void Blog::setTitleToNull() noexcept const int32_t &Blog::getValueOfCategoryId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (categoryId_) return *categoryId_; return defaultValue; @@ -702,7 +702,7 @@ bool Blog::validJsonOfField(size_t index, Category Blog::getCategory(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from category where id = $1"; + static const std::string sql = "select * from category where id = $1"; Result r(nullptr); { auto binder = *clientPtr << sql; @@ -725,7 +725,7 @@ void Blog::getCategory(const DbClientPtr &clientPtr, const std::function &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = "select * from category where id = $1"; + static const std::string sql = "select * from category where id = $1"; *clientPtr << sql << *categoryId_ >> [rcb = std::move(rcb), ecb](const Result &r) { if (r.size() == 0) @@ -746,7 +746,7 @@ void Blog::getCategory(const DbClientPtr &clientPtr, std::vector> Blog::getTags( const DbClientPtr &clientPtr) const { - const static std::string sql = + static const std::string sql = "select * from tag,blog_tag where blog_tag.blog_id = $1 and " "blog_tag.tag_id = tag.id"; Result r(nullptr); @@ -772,7 +772,7 @@ void Blog::getTags( const std::function>)> &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = + static const std::string sql = "select * from tag,blog_tag where blog_tag.blog_id = $1 and " "blog_tag.tag_id = tag.id"; *clientPtr << sql << *id_ >> [rcb = std::move(rcb)](const Result &r) { diff --git a/orm_lib/tests/postgresql/Blog.h b/orm_lib/tests/postgresql/Blog.h index 85042c756c..29401f0b71 100644 --- a/orm_lib/tests/postgresql/Blog.h +++ b/orm_lib/tests/postgresql/Blog.h @@ -53,10 +53,10 @@ class Blog static const std::string _category_id; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int32_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/postgresql/BlogTag.cc b/orm_lib/tests/postgresql/BlogTag.cc index 9be89dd1d2..f3749b9e8e 100644 --- a/orm_lib/tests/postgresql/BlogTag.cc +++ b/orm_lib/tests/postgresql/BlogTag.cc @@ -168,7 +168,7 @@ void BlogTag::updateByJson(const Json::Value &pJson) noexcept(false) const int32_t &BlogTag::getValueOfBlogId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (blogId_) return *blogId_; return defaultValue; @@ -187,7 +187,7 @@ void BlogTag::setBlogId(const int32_t &pBlogId) noexcept const int32_t &BlogTag::getValueOfTagId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (tagId_) return *tagId_; return defaultValue; diff --git a/orm_lib/tests/postgresql/BlogTag.h b/orm_lib/tests/postgresql/BlogTag.h index 44b2d95b4b..34808b25af 100644 --- a/orm_lib/tests/postgresql/BlogTag.h +++ b/orm_lib/tests/postgresql/BlogTag.h @@ -49,10 +49,10 @@ class BlogTag static const std::string _tag_id; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::vector primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::vector primaryKeyName; using PrimaryKeyType = std::tuple; // blog_id,tag_id PrimaryKeyType getPrimaryKey() const; diff --git a/orm_lib/tests/postgresql/Category.cc b/orm_lib/tests/postgresql/Category.cc index 1331fab170..5fe6d337c1 100644 --- a/orm_lib/tests/postgresql/Category.cc +++ b/orm_lib/tests/postgresql/Category.cc @@ -167,7 +167,7 @@ void Category::updateByJson(const Json::Value &pJson) noexcept(false) const int32_t &Category::getValueOfId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (id_) return *id_; return defaultValue; @@ -192,7 +192,7 @@ const typename Category::PrimaryKeyType &Category::getPrimaryKey() const const std::string &Category::getValueOfName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (name_) return *name_; return defaultValue; @@ -528,7 +528,7 @@ bool Category::validJsonOfField(size_t index, std::vector Category::getBlogs(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from blog where category_id = $1"; + static const std::string sql = "select * from blog where category_id = $1"; Result r(nullptr); { auto binder = *clientPtr << sql; @@ -549,7 +549,7 @@ void Category::getBlogs(const DbClientPtr &clientPtr, const std::function)> &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = "select * from blog where category_id = $1"; + static const std::string sql = "select * from blog where category_id = $1"; *clientPtr << sql << *id_ >> [rcb = std::move(rcb)](const Result &r) { std::vector ret; ret.reserve(r.size()); diff --git a/orm_lib/tests/postgresql/Category.h b/orm_lib/tests/postgresql/Category.h index 7bb584b453..79a8de8ac3 100644 --- a/orm_lib/tests/postgresql/Category.h +++ b/orm_lib/tests/postgresql/Category.h @@ -50,10 +50,10 @@ class Category static const std::string _name; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int32_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/postgresql/Tag.cc b/orm_lib/tests/postgresql/Tag.cc index fe48fe1829..9c52dd7d86 100644 --- a/orm_lib/tests/postgresql/Tag.cc +++ b/orm_lib/tests/postgresql/Tag.cc @@ -167,7 +167,7 @@ void Tag::updateByJson(const Json::Value &pJson) noexcept(false) const int32_t &Tag::getValueOfId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (id_) return *id_; return defaultValue; @@ -192,7 +192,7 @@ const typename Tag::PrimaryKeyType &Tag::getPrimaryKey() const const std::string &Tag::getValueOfName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (name_) return *name_; return defaultValue; @@ -528,7 +528,7 @@ bool Tag::validJsonOfField(size_t index, std::vector> Tag::getBlogs( const DbClientPtr &clientPtr) const { - const static std::string sql = + static const std::string sql = "select * from blog,blog_tag where blog_tag.tag_id = $1 and " "blog_tag.blog_id = blog.id"; Result r(nullptr); @@ -554,7 +554,7 @@ void Tag::getBlogs( const std::function>)> &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = + static const std::string sql = "select * from blog,blog_tag where blog_tag.tag_id = $1 and " "blog_tag.blog_id = blog.id"; *clientPtr << sql << *id_ >> [rcb = std::move(rcb)](const Result &r) { diff --git a/orm_lib/tests/postgresql/Tag.h b/orm_lib/tests/postgresql/Tag.h index 6f9f280cd5..c00d5c4852 100644 --- a/orm_lib/tests/postgresql/Tag.h +++ b/orm_lib/tests/postgresql/Tag.h @@ -51,10 +51,10 @@ class Tag static const std::string _name; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int32_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/postgresql/Users.cc b/orm_lib/tests/postgresql/Users.cc index 5a373239a8..f92e889ebd 100644 --- a/orm_lib/tests/postgresql/Users.cc +++ b/orm_lib/tests/postgresql/Users.cc @@ -519,7 +519,7 @@ void Users::updateByJson(const Json::Value &pJson) noexcept(false) const std::string &Users::getValueOfUserId() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (userId_) return *userId_; return defaultValue; @@ -550,7 +550,7 @@ void Users::setUserIdToNull() noexcept const std::string &Users::getValueOfUserName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (userName_) return *userName_; return defaultValue; @@ -581,7 +581,7 @@ void Users::setUserNameToNull() noexcept const std::string &Users::getValueOfPassword() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (password_) return *password_; return defaultValue; @@ -612,7 +612,7 @@ void Users::setPasswordToNull() noexcept const std::string &Users::getValueOfOrgName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (orgName_) return *orgName_; return defaultValue; @@ -643,7 +643,7 @@ void Users::setOrgNameToNull() noexcept const std::string &Users::getValueOfSignature() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (signature_) return *signature_; return defaultValue; @@ -674,7 +674,7 @@ void Users::setSignatureToNull() noexcept const std::string &Users::getValueOfAvatarId() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (avatarId_) return *avatarId_; return defaultValue; @@ -705,7 +705,7 @@ void Users::setAvatarIdToNull() noexcept const int32_t &Users::getValueOfId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (id_) return *id_; return defaultValue; @@ -730,7 +730,7 @@ const typename Users::PrimaryKeyType &Users::getPrimaryKey() const const std::string &Users::getValueOfSalt() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (salt_) return *salt_; return defaultValue; @@ -761,7 +761,7 @@ void Users::setSaltToNull() noexcept const bool &Users::getValueOfAdmin() const noexcept { - const static bool defaultValue = bool(); + static const bool defaultValue = bool(); if (admin_) return *admin_; return defaultValue; @@ -1823,7 +1823,7 @@ bool Users::validJsonOfField(size_t index, Wallets Users::getWallet(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from wallets where user_id = $1"; + static const std::string sql = "select * from wallets where user_id = $1"; Result r(nullptr); { auto binder = *clientPtr << sql; @@ -1846,7 +1846,7 @@ void Users::getWallet(const DbClientPtr &clientPtr, const std::function &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = "select * from wallets where user_id = $1"; + static const std::string sql = "select * from wallets where user_id = $1"; *clientPtr << sql << *userId_ >> [rcb = std::move(rcb), ecb](const Result &r) { if (r.size() == 0) diff --git a/orm_lib/tests/postgresql/Users.h b/orm_lib/tests/postgresql/Users.h index c5e0d4f34d..aed8e7982e 100644 --- a/orm_lib/tests/postgresql/Users.h +++ b/orm_lib/tests/postgresql/Users.h @@ -57,10 +57,10 @@ class Users static const std::string _admin; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int32_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/postgresql/Wallets.cc b/orm_lib/tests/postgresql/Wallets.cc index 5dd4d77643..7245fe1443 100644 --- a/orm_lib/tests/postgresql/Wallets.cc +++ b/orm_lib/tests/postgresql/Wallets.cc @@ -218,7 +218,7 @@ void Wallets::updateByJson(const Json::Value &pJson) noexcept(false) const int32_t &Wallets::getValueOfId() const noexcept { - const static int32_t defaultValue = int32_t(); + static const int32_t defaultValue = int32_t(); if (id_) return *id_; return defaultValue; @@ -243,7 +243,7 @@ const typename Wallets::PrimaryKeyType &Wallets::getPrimaryKey() const const std::string &Wallets::getValueOfUserId() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (userId_) return *userId_; return defaultValue; @@ -274,7 +274,7 @@ void Wallets::setUserIdToNull() noexcept const std::string &Wallets::getValueOfAmount() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (amount_) return *amount_; return defaultValue; @@ -706,7 +706,7 @@ bool Wallets::validJsonOfField(size_t index, Users Wallets::getUser(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from users where user_id = $1"; + static const std::string sql = "select * from users where user_id = $1"; Result r(nullptr); { auto binder = *clientPtr << sql; @@ -729,7 +729,7 @@ void Wallets::getUser(const DbClientPtr &clientPtr, const std::function &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = "select * from users where user_id = $1"; + static const std::string sql = "select * from users where user_id = $1"; *clientPtr << sql << *userId_ >> [rcb = std::move(rcb), ecb](const Result &r) { if (r.size() == 0) diff --git a/orm_lib/tests/postgresql/Wallets.h b/orm_lib/tests/postgresql/Wallets.h index 0637f9bbd6..5afb4f7e3e 100644 --- a/orm_lib/tests/postgresql/Wallets.h +++ b/orm_lib/tests/postgresql/Wallets.h @@ -51,10 +51,10 @@ class Wallets static const std::string _amount; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int32_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/sqlite3/Blog.cc b/orm_lib/tests/sqlite3/Blog.cc index 2675a95bc7..86ae79b7a7 100644 --- a/orm_lib/tests/sqlite3/Blog.cc +++ b/orm_lib/tests/sqlite3/Blog.cc @@ -219,7 +219,7 @@ void Blog::updateByJson(const Json::Value &pJson) noexcept(false) const int64_t &Blog::getValueOfId() const noexcept { - const static int64_t defaultValue = int64_t(); + static const int64_t defaultValue = int64_t(); if (id_) return *id_; return defaultValue; @@ -250,7 +250,7 @@ const typename Blog::PrimaryKeyType &Blog::getPrimaryKey() const const std::string &Blog::getValueOfTitle() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (title_) return *title_; return defaultValue; @@ -281,7 +281,7 @@ void Blog::setTitleToNull() noexcept const int64_t &Blog::getValueOfCategoryId() const noexcept { - const static int64_t defaultValue = int64_t(); + static const int64_t defaultValue = int64_t(); if (categoryId_) return *categoryId_; return defaultValue; @@ -722,7 +722,7 @@ bool Blog::validJsonOfField(size_t index, Category Blog::getCategory(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from category where id = ?"; + static const std::string sql = "select * from category where id = ?"; Result r(nullptr); { auto binder = *clientPtr << sql; @@ -745,7 +745,7 @@ void Blog::getCategory(const DbClientPtr &clientPtr, const std::function &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = "select * from category where id = ?"; + static const std::string sql = "select * from category where id = ?"; *clientPtr << sql << *categoryId_ >> [rcb = std::move(rcb), ecb](const Result &r) { if (r.size() == 0) @@ -766,7 +766,7 @@ void Blog::getCategory(const DbClientPtr &clientPtr, std::vector> Blog::getTags( const DbClientPtr &clientPtr) const { - const static std::string sql = + static const std::string sql = "select * from tag,blog_tag where blog_tag.blog_id = ? and " "blog_tag.tag_id = tag.id"; Result r(nullptr); @@ -792,7 +792,7 @@ void Blog::getTags( const std::function>)> &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = + static const std::string sql = "select * from tag,blog_tag where blog_tag.blog_id = ? and " "blog_tag.tag_id = tag.id"; *clientPtr << sql << *id_ >> [rcb = std::move(rcb)](const Result &r) { diff --git a/orm_lib/tests/sqlite3/Blog.h b/orm_lib/tests/sqlite3/Blog.h index 522ca42f60..5f3aa9a9fa 100644 --- a/orm_lib/tests/sqlite3/Blog.h +++ b/orm_lib/tests/sqlite3/Blog.h @@ -53,10 +53,10 @@ class Blog static const std::string _category_id; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int64_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/sqlite3/BlogTag.cc b/orm_lib/tests/sqlite3/BlogTag.cc index 680dcad78d..5edfc2328d 100644 --- a/orm_lib/tests/sqlite3/BlogTag.cc +++ b/orm_lib/tests/sqlite3/BlogTag.cc @@ -168,7 +168,7 @@ void BlogTag::updateByJson(const Json::Value &pJson) noexcept(false) const int64_t &BlogTag::getValueOfBlogId() const noexcept { - const static int64_t defaultValue = int64_t(); + static const int64_t defaultValue = int64_t(); if (blogId_) return *blogId_; return defaultValue; @@ -187,7 +187,7 @@ void BlogTag::setBlogId(const int64_t &pBlogId) noexcept const int64_t &BlogTag::getValueOfTagId() const noexcept { - const static int64_t defaultValue = int64_t(); + static const int64_t defaultValue = int64_t(); if (tagId_) return *tagId_; return defaultValue; diff --git a/orm_lib/tests/sqlite3/BlogTag.h b/orm_lib/tests/sqlite3/BlogTag.h index d7ddc358ff..a9bc758eec 100644 --- a/orm_lib/tests/sqlite3/BlogTag.h +++ b/orm_lib/tests/sqlite3/BlogTag.h @@ -49,10 +49,10 @@ class BlogTag static const std::string _tag_id; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::vector primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::vector primaryKeyName; using PrimaryKeyType = std::tuple; // blog_id,tag_id PrimaryKeyType getPrimaryKey() const; diff --git a/orm_lib/tests/sqlite3/Category.cc b/orm_lib/tests/sqlite3/Category.cc index ad27ba7643..8c5216cc3f 100644 --- a/orm_lib/tests/sqlite3/Category.cc +++ b/orm_lib/tests/sqlite3/Category.cc @@ -167,7 +167,7 @@ void Category::updateByJson(const Json::Value &pJson) noexcept(false) const int64_t &Category::getValueOfId() const noexcept { - const static int64_t defaultValue = int64_t(); + static const int64_t defaultValue = int64_t(); if (id_) return *id_; return defaultValue; @@ -198,7 +198,7 @@ const typename Category::PrimaryKeyType &Category::getPrimaryKey() const const std::string &Category::getValueOfName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (name_) return *name_; return defaultValue; @@ -545,7 +545,7 @@ bool Category::validJsonOfField(size_t index, std::vector Category::getBlogs(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from blog where category_id = ?"; + static const std::string sql = "select * from blog where category_id = ?"; Result r(nullptr); { auto binder = *clientPtr << sql; @@ -566,7 +566,7 @@ void Category::getBlogs(const DbClientPtr &clientPtr, const std::function)> &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = "select * from blog where category_id = ?"; + static const std::string sql = "select * from blog where category_id = ?"; *clientPtr << sql << *id_ >> [rcb = std::move(rcb)](const Result &r) { std::vector ret; ret.reserve(r.size()); diff --git a/orm_lib/tests/sqlite3/Category.h b/orm_lib/tests/sqlite3/Category.h index 7d2b6433fb..d1f91d0355 100644 --- a/orm_lib/tests/sqlite3/Category.h +++ b/orm_lib/tests/sqlite3/Category.h @@ -50,10 +50,10 @@ class Category static const std::string _name; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int64_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/sqlite3/Tag.cc b/orm_lib/tests/sqlite3/Tag.cc index 31787de1f4..32213c33af 100644 --- a/orm_lib/tests/sqlite3/Tag.cc +++ b/orm_lib/tests/sqlite3/Tag.cc @@ -167,7 +167,7 @@ void Tag::updateByJson(const Json::Value &pJson) noexcept(false) const int64_t &Tag::getValueOfId() const noexcept { - const static int64_t defaultValue = int64_t(); + static const int64_t defaultValue = int64_t(); if (id_) return *id_; return defaultValue; @@ -198,7 +198,7 @@ const typename Tag::PrimaryKeyType &Tag::getPrimaryKey() const const std::string &Tag::getValueOfName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (name_) return *name_; return defaultValue; @@ -545,7 +545,7 @@ bool Tag::validJsonOfField(size_t index, std::vector> Tag::getBlogs( const DbClientPtr &clientPtr) const { - const static std::string sql = + static const std::string sql = "select * from blog,blog_tag where blog_tag.tag_id = ? and " "blog_tag.blog_id = blog.id"; Result r(nullptr); @@ -571,7 +571,7 @@ void Tag::getBlogs( const std::function>)> &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = + static const std::string sql = "select * from blog,blog_tag where blog_tag.tag_id = ? and " "blog_tag.blog_id = blog.id"; *clientPtr << sql << *id_ >> [rcb = std::move(rcb)](const Result &r) { diff --git a/orm_lib/tests/sqlite3/Tag.h b/orm_lib/tests/sqlite3/Tag.h index 3908cd3cca..712b97837c 100644 --- a/orm_lib/tests/sqlite3/Tag.h +++ b/orm_lib/tests/sqlite3/Tag.h @@ -51,10 +51,10 @@ class Tag static const std::string _name; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int64_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/sqlite3/Users.cc b/orm_lib/tests/sqlite3/Users.cc index 4101559018..658133e30e 100644 --- a/orm_lib/tests/sqlite3/Users.cc +++ b/orm_lib/tests/sqlite3/Users.cc @@ -679,7 +679,7 @@ void Users::updateByJson(const Json::Value &pJson) noexcept(false) const int64_t &Users::getValueOfId() const noexcept { - const static int64_t defaultValue = int64_t(); + static const int64_t defaultValue = int64_t(); if (id_) return *id_; return defaultValue; @@ -710,7 +710,7 @@ const typename Users::PrimaryKeyType &Users::getPrimaryKey() const const std::string &Users::getValueOfUserId() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (userId_) return *userId_; return defaultValue; @@ -741,7 +741,7 @@ void Users::setUserIdToNull() noexcept const std::string &Users::getValueOfUserName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (userName_) return *userName_; return defaultValue; @@ -772,7 +772,7 @@ void Users::setUserNameToNull() noexcept const std::string &Users::getValueOfPassword() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (password_) return *password_; return defaultValue; @@ -803,7 +803,7 @@ void Users::setPasswordToNull() noexcept const std::string &Users::getValueOfOrgName() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (orgName_) return *orgName_; return defaultValue; @@ -834,7 +834,7 @@ void Users::setOrgNameToNull() noexcept const std::string &Users::getValueOfSignature() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (signature_) return *signature_; return defaultValue; @@ -865,7 +865,7 @@ void Users::setSignatureToNull() noexcept const std::string &Users::getValueOfAvatarId() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (avatarId_) return *avatarId_; return defaultValue; @@ -896,7 +896,7 @@ void Users::setAvatarIdToNull() noexcept const std::string &Users::getValueOfSalt() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (salt_) return *salt_; return defaultValue; @@ -927,7 +927,7 @@ void Users::setSaltToNull() noexcept const std::string &Users::getValueOfAdmin() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (admin_) return *admin_; return defaultValue; @@ -958,7 +958,7 @@ void Users::setAdminToNull() noexcept const ::trantor::Date &Users::getValueOfCreateTime() const noexcept { - const static ::trantor::Date defaultValue = ::trantor::Date(); + static const ::trantor::Date defaultValue = ::trantor::Date(); if (createTime_) return *createTime_; return defaultValue; @@ -2057,7 +2057,7 @@ bool Users::validJsonOfField(size_t index, Wallets Users::getWallet(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from wallets where user_id = ?"; + static const std::string sql = "select * from wallets where user_id = ?"; Result r(nullptr); { auto binder = *clientPtr << sql; @@ -2080,7 +2080,7 @@ void Users::getWallet(const DbClientPtr &clientPtr, const std::function &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = "select * from wallets where user_id = ?"; + static const std::string sql = "select * from wallets where user_id = ?"; *clientPtr << sql << *userId_ >> [rcb = std::move(rcb), ecb](const Result &r) { if (r.size() == 0) diff --git a/orm_lib/tests/sqlite3/Users.h b/orm_lib/tests/sqlite3/Users.h index dbdaddcfdf..0bb4ea7b6d 100644 --- a/orm_lib/tests/sqlite3/Users.h +++ b/orm_lib/tests/sqlite3/Users.h @@ -58,10 +58,10 @@ class Users static const std::string _create_time; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int64_t; const PrimaryKeyType &getPrimaryKey() const; diff --git a/orm_lib/tests/sqlite3/Wallets.cc b/orm_lib/tests/sqlite3/Wallets.cc index d74ec57acc..7badf62ecf 100644 --- a/orm_lib/tests/sqlite3/Wallets.cc +++ b/orm_lib/tests/sqlite3/Wallets.cc @@ -218,7 +218,7 @@ void Wallets::updateByJson(const Json::Value &pJson) noexcept(false) const int64_t &Wallets::getValueOfId() const noexcept { - const static int64_t defaultValue = int64_t(); + static const int64_t defaultValue = int64_t(); if (id_) return *id_; return defaultValue; @@ -249,7 +249,7 @@ const typename Wallets::PrimaryKeyType &Wallets::getPrimaryKey() const const std::string &Wallets::getValueOfUserId() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (userId_) return *userId_; return defaultValue; @@ -280,7 +280,7 @@ void Wallets::setUserIdToNull() noexcept const std::string &Wallets::getValueOfAmount() const noexcept { - const static std::string defaultValue = std::string(); + static const std::string defaultValue = std::string(); if (amount_) return *amount_; return defaultValue; @@ -703,7 +703,7 @@ bool Wallets::validJsonOfField(size_t index, Users Wallets::getUser(const DbClientPtr &clientPtr) const { - const static std::string sql = "select * from users where user_id = ?"; + static const std::string sql = "select * from users where user_id = ?"; Result r(nullptr); { auto binder = *clientPtr << sql; @@ -726,7 +726,7 @@ void Wallets::getUser(const DbClientPtr &clientPtr, const std::function &rcb, const ExceptionCallback &ecb) const { - const static std::string sql = "select * from users where user_id = ?"; + static const std::string sql = "select * from users where user_id = ?"; *clientPtr << sql << *userId_ >> [rcb = std::move(rcb), ecb](const Result &r) { if (r.size() == 0) diff --git a/orm_lib/tests/sqlite3/Wallets.h b/orm_lib/tests/sqlite3/Wallets.h index 7cabc579bf..a5dd8b1622 100644 --- a/orm_lib/tests/sqlite3/Wallets.h +++ b/orm_lib/tests/sqlite3/Wallets.h @@ -51,10 +51,10 @@ class Wallets static const std::string _amount; }; - const static int primaryKeyNumber; - const static std::string tableName; - const static bool hasPrimaryKey; - const static std::string primaryKeyName; + static const int primaryKeyNumber; + static const std::string tableName; + static const bool hasPrimaryKey; + static const std::string primaryKeyName; using PrimaryKeyType = int64_t; const PrimaryKeyType &getPrimaryKey() const; From 3d469112ca48c9bc8ad1e7aed296eddd92a74581 Mon Sep 17 00:00:00 2001 From: Ken Matsui <26405363+ken-matsui@users.noreply.github.com> Date: Wed, 31 Jan 2024 04:17:59 -0800 Subject: [PATCH 10/19] Enable readability/multiline_string for cpplint (#1940) --- CPPLINT.cfg | 1 - drogon_ctl/create_model.cc | 24 ++++++++++++------------ orm_lib/src/sqlite3_impl/test/test1.cc | 19 ++++++++++--------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/CPPLINT.cfg b/CPPLINT.cfg index 1ae88a6e1e..76f322eb36 100644 --- a/CPPLINT.cfg +++ b/CPPLINT.cfg @@ -29,7 +29,6 @@ filter=-build/include_what_you_use filter=-runtime/explicit filter=-runtime/string filter=-runtime/int -filter=-readability/multiline_string filter=-readability/casting filter=-readability/braces filter=-readability/fn_size diff --git a/drogon_ctl/create_model.cc b/drogon_ctl/create_model.cc index 9dc6291f4d..1eb4e655f9 100644 --- a/drogon_ctl/create_model.cc +++ b/drogon_ctl/create_model.cc @@ -178,10 +178,10 @@ void create_model::createModelClassFromPG( data["schema"] = schema; } std::vector cols; - *client << "SELECT * \ - FROM information_schema.columns \ - WHERE table_schema = $1 \ - AND table_name = $2" + *client << "SELECT * " + "FROM information_schema.columns " + "WHERE table_schema = $1 " + "AND table_name = $2" << schema << tableName << Mode::Blocking >> [&](const Result &r) { if (r.size() == 0) @@ -284,14 +284,14 @@ void create_model::createModelClassFromPG( exit(1); }; size_t pkNumber = 0; - *client << "SELECT \ - pg_constraint.conname AS pk_name,\ - pg_constraint.conkey AS pk_vector \ - FROM pg_constraint \ - INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid \ - WHERE \ - pg_class.relname = $1 \ - AND pg_constraint.contype = 'p'" + *client << "SELECT " + "pg_constraint.conname AS pk_name," + "pg_constraint.conkey AS pk_vector " + "FROM pg_constraint " + "INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid " + "WHERE " + "pg_class.relname = $1 " + "AND pg_constraint.contype = 'p'" << tableName << Mode::Blocking >> [&](bool isNull, const std::string &pkName, diff --git a/orm_lib/src/sqlite3_impl/test/test1.cc b/orm_lib/src/sqlite3_impl/test/test1.cc index 091cc9c34e..e9dffca116 100644 --- a/orm_lib/src/sqlite3_impl/test/test1.cc +++ b/orm_lib/src/sqlite3_impl/test/test1.cc @@ -27,15 +27,16 @@ int main() // std::cout << e.base().what() << std::endl; // }; // ; - *clientPtr - << "CREATE TABLE IF NOT EXISTS GROUPS (GROUP_ID INTEGER PRIMARY KEY autoincrement,\ - GROUP_NAME TEXT,\ - CREATER_ID INTEGER,\ - CREATE_TIME TEXT,\ - INVITING INTEGER,\ - INVITING_USER_ID INTEGER,\ - AVATAR_ID TEXT, uuu double, text VARCHAR(255),avatar blob,is_default bool)" - << Mode::Blocking >> + *clientPtr << "CREATE TABLE IF NOT EXISTS GROUPS (GROUP_ID INTEGER PRIMARY " + "KEY autoincrement," + "GROUP_NAME TEXT," + "CREATER_ID INTEGER," + "CREATE_TIME TEXT," + "INVITING INTEGER," + "INVITING_USER_ID INTEGER," + "AVATAR_ID TEXT, uuu double, text VARCHAR(255),avatar " + "blob,is_default bool)" + << Mode::Blocking >> [](const Result &r) { LOG_DEBUG << "created"; } >> [](const DrogonDbException &e) { std::cout << e.base().what() << std::endl; From 6aed658fabc252eeedc29175fc63212c4e930364 Mon Sep 17 00:00:00 2001 From: Muhammad <73486659+Mis1eader-dev@users.noreply.github.com> Date: Sun, 4 Feb 2024 16:32:12 +0300 Subject: [PATCH 11/19] Change `drogon::MultiPartParser`'s parameters data type from `std::map` to `std::unordered_map` (#1946) --- lib/inc/drogon/MultiPart.h | 11 ++++++++--- lib/src/MultiPart.cc | 4 +++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/inc/drogon/MultiPart.h b/lib/inc/drogon/MultiPart.h index d606551ef3..057aa6c150 100644 --- a/lib/inc/drogon/MultiPart.h +++ b/lib/inc/drogon/MultiPart.h @@ -14,9 +14,9 @@ #pragma once +#include "drogon/utils/Utilities.h" #include #include -#include #include #include #include @@ -133,7 +133,10 @@ class DROGON_EXPORT MultiPartParser /// Get parameters, This method should be called after calling the parse () /// method. - const std::map &getParameters() const; + const std::unordered_map & + getParameters() const; /// Get the value of an optional parameter /// This method should be called after calling the parse() method. @@ -174,7 +177,9 @@ class DROGON_EXPORT MultiPartParser protected: std::vector files_; - std::map parameters_; + std:: + unordered_map + parameters_; int parse(const HttpRequestPtr &req, const char *boundaryData, size_t boundaryLen); diff --git a/lib/src/MultiPart.cc b/lib/src/MultiPart.cc index ba43af51d6..b22b0d442f 100644 --- a/lib/src/MultiPart.cc +++ b/lib/src/MultiPart.cc @@ -45,7 +45,9 @@ std::unordered_map MultiPartParser::getFilesMap() const return result; } -const std::map &MultiPartParser::getParameters() const +const std:: + unordered_map & + MultiPartParser::getParameters() const { return parameters_; } From 99d97df25f892af9583fd7ff85cf2559f24fdd12 Mon Sep 17 00:00:00 2001 From: An Tao Date: Sun, 4 Feb 2024 23:13:01 +0800 Subject: [PATCH 12/19] Alias the safe hashmap template (#1947) --- lib/inc/drogon/HttpRequest.h | 30 ++++--------------- lib/inc/drogon/HttpResponse.h | 18 +++-------- lib/inc/drogon/MultiPart.h | 9 ++---- lib/inc/drogon/utils/Utilities.h | 5 ++++ lib/src/HttpRequestImpl.h | 27 ++++------------- lib/src/HttpResponseImpl.h | 16 +++------- lib/src/MultiPart.cc | 4 +-- .../integration_test/server/ListParaView.csp | 2 +- .../integration_test/server/api_v1_ApiTest.cc | 8 ++--- lib/tests/integration_test/server/main.cc | 30 ++++--------------- 10 files changed, 37 insertions(+), 112 deletions(-) diff --git a/lib/inc/drogon/HttpRequest.h b/lib/inc/drogon/HttpRequest.h index 2921358969..96f9f662ba 100644 --- a/lib/inc/drogon/HttpRequest.h +++ b/lib/inc/drogon/HttpRequest.h @@ -162,31 +162,19 @@ class DROGON_EXPORT HttpRequest virtual const std::string &getCookie(const std::string &field) const = 0; /// Get all headers of the request - virtual const std::unordered_map & - headers() const = 0; + virtual const SafeStringMap &headers() const = 0; /// Get all headers of the request - const std::unordered_map & - getHeaders() const + const SafeStringMap &getHeaders() const { return headers(); } /// Get all cookies of the request - virtual const std::unordered_map & - cookies() const = 0; + virtual const SafeStringMap &cookies() const = 0; /// Get all cookies of the request - const std::unordered_map & - getCookies() const + const SafeStringMap &getCookies() const { return cookies(); } @@ -304,16 +292,10 @@ class DROGON_EXPORT HttpRequest } /// Get parameters of the request. - virtual const std::unordered_map & - parameters() const = 0; + virtual const SafeStringMap ¶meters() const = 0; /// Get parameters of the request. - const std::unordered_map & - getParameters() const + const SafeStringMap &getParameters() const { return parameters(); } diff --git a/lib/inc/drogon/HttpResponse.h b/lib/inc/drogon/HttpResponse.h index 58401b1573..620577e571 100644 --- a/lib/inc/drogon/HttpResponse.h +++ b/lib/inc/drogon/HttpResponse.h @@ -244,16 +244,10 @@ class DROGON_EXPORT HttpResponse virtual void removeHeader(std::string key) = 0; /// Get all headers of the response - virtual const std::unordered_map & - headers() const = 0; + virtual const SafeStringMap &headers() const = 0; /// Get all headers of the response - const std::unordered_map & - getHeaders() const + const SafeStringMap &getHeaders() const { return headers(); } @@ -281,14 +275,10 @@ class DROGON_EXPORT HttpResponse virtual const Cookie &getCookie(const std::string &key) const = 0; /// Get all cookies. - virtual const std:: - unordered_map & - cookies() const = 0; + virtual const SafeStringMap &cookies() const = 0; /// Get all cookies. - const std:: - unordered_map & - getCookies() const + const SafeStringMap &getCookies() const { return cookies(); } diff --git a/lib/inc/drogon/MultiPart.h b/lib/inc/drogon/MultiPart.h index 057aa6c150..eb6531ed45 100644 --- a/lib/inc/drogon/MultiPart.h +++ b/lib/inc/drogon/MultiPart.h @@ -133,10 +133,7 @@ class DROGON_EXPORT MultiPartParser /// Get parameters, This method should be called after calling the parse () /// method. - const std::unordered_map & - getParameters() const; + const SafeStringMap &getParameters() const; /// Get the value of an optional parameter /// This method should be called after calling the parse() method. @@ -177,9 +174,7 @@ class DROGON_EXPORT MultiPartParser protected: std::vector files_; - std:: - unordered_map - parameters_; + SafeStringMap parameters_; int parse(const HttpRequestPtr &req, const char *boundaryData, size_t boundaryLen); diff --git a/lib/inc/drogon/utils/Utilities.h b/lib/inc/drogon/utils/Utilities.h index 97ef1ff40d..6665cdce99 100644 --- a/lib/inc/drogon/utils/Utilities.h +++ b/lib/inc/drogon/utils/Utilities.h @@ -28,6 +28,7 @@ #include #include #include +#include #ifdef _WIN32 #include DROGON_EXPORT char *strptime(const char *s, const char *f, struct tm *tm); @@ -558,6 +559,10 @@ struct SafeStringHash }; } // namespace internal } // namespace utils + +template +using SafeStringMap = + std::unordered_map; } // namespace drogon namespace trantor diff --git a/lib/src/HttpRequestImpl.h b/lib/src/HttpRequestImpl.h index 3dd503ded6..fad0e3f13c 100644 --- a/lib/src/HttpRequestImpl.h +++ b/lib/src/HttpRequestImpl.h @@ -169,10 +169,7 @@ class HttpRequestImpl : public HttpRequest pathEncode_ = pathEncode; } - const std::unordered_map & - parameters() const override + const SafeStringMap ¶meters() const override { parseParametersOnce(); return parameters_; @@ -342,18 +339,12 @@ class HttpRequestImpl : public HttpRequest return defaultVal; } - const std::unordered_map & - headers() const override + const SafeStringMap &headers() const override { return headers_; } - const std::unordered_map & - cookies() const override + const SafeStringMap &cookies() const override { return cookies_; } @@ -611,15 +602,9 @@ class HttpRequestImpl : public HttpRequest bool pathEncode_{true}; std::string_view matchedPathPattern_{""}; std::string query_; - std:: - unordered_map - headers_; - std:: - unordered_map - cookies_; - mutable std:: - unordered_map - parameters_; + SafeStringMap headers_; + SafeStringMap cookies_; + mutable SafeStringMap parameters_; mutable std::shared_ptr jsonPtr_; SessionPtr sessionPtr_; mutable AttributesPtr attributesPtr_; diff --git a/lib/src/HttpResponseImpl.h b/lib/src/HttpResponseImpl.h index a979fa692d..6d02bb3736 100644 --- a/lib/src/HttpResponseImpl.h +++ b/lib/src/HttpResponseImpl.h @@ -133,10 +133,7 @@ class DROGON_EXPORT HttpResponseImpl : public HttpResponse removeHeaderBy(key); } - const std::unordered_map & - headers() const override + const SafeStringMap &headers() const override { return headers_; } @@ -206,9 +203,7 @@ class DROGON_EXPORT HttpResponseImpl : public HttpResponse return defaultCookie; } - const std:: - unordered_map & - cookies() const override + const SafeStringMap &cookies() const override { return cookies_; } @@ -499,11 +494,8 @@ class DROGON_EXPORT HttpResponseImpl : public HttpResponse statusMessage_ = std::string_view{message, messageLength}; } - std:: - unordered_map - headers_; - std::unordered_map - cookies_; + SafeStringMap headers_; + SafeStringMap cookies_; int customStatusCode_{-1}; HttpStatusCode statusCode_{kUnknown}; diff --git a/lib/src/MultiPart.cc b/lib/src/MultiPart.cc index b22b0d442f..43c9fbbcf1 100644 --- a/lib/src/MultiPart.cc +++ b/lib/src/MultiPart.cc @@ -45,9 +45,7 @@ std::unordered_map MultiPartParser::getFilesMap() const return result; } -const std:: - unordered_map & - MultiPartParser::getParameters() const +const SafeStringMap &MultiPartParser::getParameters() const { return parameters_; } diff --git a/lib/tests/integration_test/server/ListParaView.csp b/lib/tests/integration_test/server/ListParaView.csp index 722276983a..b4b1a466e3 100644 --- a/lib/tests/integration_test/server/ListParaView.csp +++ b/lib/tests/integration_test/server/ListParaView.csp @@ -4,7 +4,7 @@ <%c++ - auto para=@@.get>("parameters"); + auto para=@@.get>("parameters"); %> diff --git a/lib/tests/integration_test/server/api_v1_ApiTest.cc b/lib/tests/integration_test/server/api_v1_ApiTest.cc index aa6b573497..4af74b0ff9 100644 --- a/lib/tests/integration_test/server/api_v1_ApiTest.cc +++ b/lib/tests/integration_test/server/api_v1_ApiTest.cc @@ -27,9 +27,7 @@ void ApiTest::get(const HttpRequestPtr &req, { HttpViewData data; data.insert("title", std::string("ApiTest::get")); - std:: - unordered_map - para; + SafeStringMap para; para["p1"] = std::to_string(p1); para["p2"] = p2; data.insert("parameters", para); @@ -46,9 +44,7 @@ void ApiTest::your_method_name( LOG_WARN << req->matchedPathPatternData(); HttpViewData data; data.insert("title", std::string("ApiTest::get")); - std:: - unordered_map - para; + SafeStringMap para; para["p1"] = std::to_string(p1); para["p2"] = std::to_string(p2); para["p3"] = HttpViewData::htmlTranslate(std::string_view( diff --git a/lib/tests/integration_test/server/main.cc b/lib/tests/integration_test/server/main.cc index deefa07049..3c95e3d152 100644 --- a/lib/tests/integration_test/server/main.cc +++ b/lib/tests/integration_test/server/main.cc @@ -25,10 +25,7 @@ class A : public DrObjectBase { HttpViewData data; data.insert("title", std::string("ApiTest::get")); - std::unordered_map - para; + SafeStringMap para; para["int p1"] = std::to_string(p1); para["string p2"] = p2; para["string p3"] = p3; @@ -49,10 +46,7 @@ class A : public DrObjectBase { HttpViewData data; data.insert("title", std::string("ApiTest::get")); - std::unordered_map - para; + SafeStringMap para; para["int p1"] = std::to_string(p1); para["string p2"] = p2; para["string p3"] = p3; @@ -74,10 +68,7 @@ class B : public DrObjectBase { HttpViewData data; data.insert("title", std::string("ApiTest::get")); - std::unordered_map - para; + SafeStringMap para; para["p1"] = std::to_string(p1); para["p2"] = std::to_string(p2); data.insert("parameters", para); @@ -125,10 +116,7 @@ class Test : public HttpController { HttpViewData data; data.insert("title", std::string("ApiTest::get")); - std::unordered_map - para; + SafeStringMap para; para["p1"] = std::to_string(p1); para["p2"] = std::to_string(p2); data.insert("parameters", para); @@ -143,10 +131,7 @@ class Test : public HttpController { HttpViewData data; data.insert("title", std::string("ApiTest::get")); - std::unordered_map - para; + SafeStringMap para; para["p1"] = std::to_string(p1); para["p2"] = std::to_string(p2); data.insert("parameters", para); @@ -205,10 +190,7 @@ int main() ) { HttpViewData data; data.insert("title", std::string("ApiTest::get")); - std::unordered_map - para; + SafeStringMap para; para["a"] = std::to_string(a); para["b"] = std::to_string(b); data.insert("parameters", para); From 22f4b4fad6e245d87df47a1cf7f85422693d6d84 Mon Sep 17 00:00:00 2001 From: Ken Matsui <26405363+ken-matsui@users.noreply.github.com> Date: Wed, 7 Feb 2024 08:25:31 -0800 Subject: [PATCH 13/19] Simplify traits in utils (#1952) --- lib/inc/drogon/utils/OStringStream.h | 23 ++---- lib/inc/drogon/utils/Utilities.h | 55 +++--------- lib/tests/CMakeLists.txt | 3 +- lib/tests/unittests/OStringStreamTest.cc | 18 ++++ lib/tests/unittests/UtilitiesTest.cc | 101 +++++++++++++++++++++++ 5 files changed, 142 insertions(+), 58 deletions(-) create mode 100644 lib/tests/unittests/UtilitiesTest.cc diff --git a/lib/inc/drogon/utils/OStringStream.h b/lib/inc/drogon/utils/OStringStream.h index ac8b4ec16d..414625e77b 100644 --- a/lib/inc/drogon/utils/OStringStream.h +++ b/lib/inc/drogon/utils/OStringStream.h @@ -21,23 +21,16 @@ namespace drogon { namespace internal { -template -struct CanConvertToString +template +struct CanConvertToString : std::false_type { - using Type = std::remove_reference_t>; - - private: - using yes = std::true_type; - using no = std::false_type; - - template - static auto test(int) -> decltype(std::to_string(U{}), yes()); - - template - static no test(...); +}; - public: - static constexpr bool value = std::is_same_v(0)), yes>; +template +struct CanConvertToString< + T, + std::void_t()))>> : std::true_type +{ }; } // namespace internal diff --git a/lib/inc/drogon/utils/Utilities.h b/lib/inc/drogon/utils/Utilities.h index 6665cdce99..4f4a3b199d 100644 --- a/lib/inc/drogon/utils/Utilities.h +++ b/lib/inc/drogon/utils/Utilities.h @@ -29,6 +29,7 @@ #include #include #include +#include #ifdef _WIN32 #include DROGON_EXPORT char *strptime(const char *s, const char *f, struct tm *tm); @@ -38,57 +39,27 @@ namespace drogon { namespace internal { -template -struct CanConvertFromStringStream +template +struct CanConvertFromStringStream : std::false_type { - private: - using yes = std::true_type; - using no = std::false_type; - - template - static auto test(U *p, std::stringstream &&ss) - -> decltype((ss >> *p), yes()); - - template - static no test(...); - - public: - static constexpr bool value = - std::is_same_v(nullptr, std::stringstream())), yes>; }; template -struct CanConstructFromString +struct CanConvertFromStringStream< + T, + std::void_t() >> + std::declval())>> : std::true_type { - private: - using yes = std::true_type; - using no = std::false_type; - - template - static auto test(U *p) -> decltype(U(std::string{}), yes()); - - template - static no test(...); +}; - public: - static constexpr bool value = - std::is_same_v(nullptr)), yes>; +template +struct CanConstructFromString : std::is_constructible +{ }; template -struct CanConvertFromString -{ - private: - using yes = std::true_type; - using no = std::false_type; - template - static auto test(U *p) -> decltype(*p = std::string(), yes()); - template - static no test(...); - - public: - static constexpr bool value = - std::is_same_v(nullptr)), yes>; +struct CanConvertFromString : std::is_assignable +{ }; } // namespace internal diff --git a/lib/tests/CMakeLists.txt b/lib/tests/CMakeLists.txt index c138428c82..671e744b8f 100644 --- a/lib/tests/CMakeLists.txt +++ b/lib/tests/CMakeLists.txt @@ -26,6 +26,7 @@ set(UNITTEST_SOURCES unittests/ControllerCreationTest.cc unittests/MultiPartParserTest.cc unittests/SlashRemoverTest.cc + unittests/UtilitiesTest.cc unittests/UuidUnittest.cc ) @@ -113,7 +114,7 @@ if (BUILD_CTL) $/a-directory) endif(BUILD_CTL) -set(COOKIE_SAME_SITE +set(COOKIE_SAME_SITE main_CookieSameSite.cc CookieSameSite.cc ) diff --git a/lib/tests/unittests/OStringStreamTest.cc b/lib/tests/unittests/OStringStreamTest.cc index c19246a4e5..89ab22acc1 100644 --- a/lib/tests/unittests/OStringStreamTest.cc +++ b/lib/tests/unittests/OStringStreamTest.cc @@ -1,10 +1,28 @@ #include #include #include +#include #include DROGON_TEST(OStringStreamTest) { + SUBSECTION(CanConvertToString) + { + using drogon::internal::CanConvertToString; + + static_assert(CanConvertToString::value); + static_assert(CanConvertToString::value); + static_assert(CanConvertToString::value); + static_assert(CanConvertToString::value); + static_assert(CanConvertToString::value); + static_assert(CanConvertToString::value); + static_assert(CanConvertToString::value); + static_assert(CanConvertToString::value); + static_assert(CanConvertToString::value); + static_assert(!CanConvertToString::value); + static_assert(!CanConvertToString::value); + } + SUBSECTION(integer) { drogon::OStringStream ss; diff --git a/lib/tests/unittests/UtilitiesTest.cc b/lib/tests/unittests/UtilitiesTest.cc new file mode 100644 index 0000000000..1440ddd96b --- /dev/null +++ b/lib/tests/unittests/UtilitiesTest.cc @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include +#include +#include + +struct ConvertibleFromStringStream +{ + friend std::istream &operator>>(std::istream &os, + ConvertibleFromStringStream &) + { + return os; + } +}; + +struct NotConvertibleFromStringStream +{ +}; + +DROGON_TEST(CanConvertFromStringStream) +{ + using drogon::internal::CanConvertFromStringStream; + + static_assert(CanConvertFromStringStream::value); + static_assert(CanConvertFromStringStream::value); + static_assert(CanConvertFromStringStream::value); + static_assert(CanConvertFromStringStream::value); + static_assert(CanConvertFromStringStream::value); + static_assert(CanConvertFromStringStream::value); + static_assert(CanConvertFromStringStream::value); + static_assert(CanConvertFromStringStream::value); + static_assert(CanConvertFromStringStream::value); + static_assert(CanConvertFromStringStream::value); + static_assert(CanConvertFromStringStream::value); + static_assert(CanConvertFromStringStream::value); + static_assert(CanConvertFromStringStream::value); + + static_assert( + CanConvertFromStringStream::value); + static_assert( + !CanConvertFromStringStream::value); +} + +struct ConstructibleFromString +{ + ConstructibleFromString(const std::string &) + { + } +}; + +struct NotConstructibleFromString +{ +}; + +DROGON_TEST(CanConstructFromString) +{ + using drogon::internal::CanConstructFromString; + + static_assert(CanConstructFromString::value); + static_assert(!CanConstructFromString::value); + static_assert(!CanConstructFromString::value); + static_assert(!CanConstructFromString::value); + static_assert(CanConstructFromString::value); + static_assert(CanConstructFromString::value); + static_assert(CanConstructFromString::value); + static_assert(!CanConstructFromString::value); + static_assert(CanConstructFromString::value); + static_assert(!CanConstructFromString::value); +} + +struct ConvertibleFromString +{ + ConvertibleFromString &operator=(const std::string &) + { + return *this; + } +}; + +struct NotConvertibleFromString +{ +}; + +DROGON_TEST(CanConvertFromString) +{ + using drogon::internal::CanConvertFromString; + + static_assert(CanConvertFromString::value); + static_assert(!CanConvertFromString::value); + static_assert(CanConvertFromString::value); + static_assert(!CanConvertFromString::value); + static_assert(!CanConvertFromString::value); + static_assert(!CanConvertFromString::value); + static_assert(CanConvertFromString::value); + static_assert(!CanConvertFromString::value); + static_assert(!CanConvertFromString>::value); + static_assert(!CanConvertFromString>::value); + static_assert(!CanConvertFromString::value); + static_assert(!CanConvertFromString::value); +} From 1a9ad1a2c9575ba13a686465a4860a7ab9ac3930 Mon Sep 17 00:00:00 2001 From: Muhammad <73486659+Mis1eader-dev@users.noreply.github.com> Date: Thu, 8 Feb 2024 08:44:08 +0300 Subject: [PATCH 14/19] Use `std::string_view` for WebSockets (#1949) --- lib/inc/drogon/WebSocketConnection.h | 3 ++- lib/src/WebSocketConnectionImpl.cc | 2 +- lib/src/WebSocketConnectionImpl.h | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/inc/drogon/WebSocketConnection.h b/lib/inc/drogon/WebSocketConnection.h index 24defa1c04..3b1ad5f316 100644 --- a/lib/inc/drogon/WebSocketConnection.h +++ b/lib/inc/drogon/WebSocketConnection.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -112,7 +113,7 @@ class WebSocketConnection * @param type The message type. */ virtual void send( - const std::string &msg, + std::string_view msg, const WebSocketMessageType type = WebSocketMessageType::Text) = 0; /// Return the local IP address and port number of the connection diff --git a/lib/src/WebSocketConnectionImpl.cc b/lib/src/WebSocketConnectionImpl.cc index 46ecf3a541..a5034aa7e0 100644 --- a/lib/src/WebSocketConnectionImpl.cc +++ b/lib/src/WebSocketConnectionImpl.cc @@ -159,7 +159,7 @@ void WebSocketConnectionImpl::sendWsData(const char *msg, tcpConnectionPtr_->send(std::move(bytesFormatted)); } -void WebSocketConnectionImpl::send(const std::string &msg, +void WebSocketConnectionImpl::send(const std::string_view msg, const WebSocketMessageType type) { send(msg.data(), msg.length(), type); diff --git a/lib/src/WebSocketConnectionImpl.h b/lib/src/WebSocketConnectionImpl.h index 1970884084..e8640b5b1b 100644 --- a/lib/src/WebSocketConnectionImpl.h +++ b/lib/src/WebSocketConnectionImpl.h @@ -16,6 +16,7 @@ #include "impl_forwards.h" #include +#include #include #include @@ -60,7 +61,7 @@ class WebSocketConnectionImpl final uint64_t len, const WebSocketMessageType type = WebSocketMessageType::Text) override; void send( - const std::string &msg, + std::string_view msg, const WebSocketMessageType type = WebSocketMessageType::Text) override; const trantor::InetAddress &localAddr() const override; From aa04d33e0284dd15d381d876df7269392aeb9c84 Mon Sep 17 00:00:00 2001 From: Greisberger Christophe Date: Fri, 9 Feb 2024 08:30:50 +0100 Subject: [PATCH 15/19] Enhancement: extend drogon::ContentType for file handling (#1921) --- lib/inc/drogon/HttpTypes.h | 67 +++- lib/src/HttpFileImpl.h | 3 + lib/src/HttpUtils.cc | 583 ++++++++++++++-------------- lib/src/HttpUtils.h | 9 + lib/tests/unittests/FileTypeTest.cc | 59 +++ 5 files changed, 416 insertions(+), 305 deletions(-) diff --git a/lib/inc/drogon/HttpTypes.h b/lib/inc/drogon/HttpTypes.h index a2f3af5c3e..63407fd4c1 100644 --- a/lib/inc/drogon/HttpTypes.h +++ b/lib/inc/drogon/HttpTypes.h @@ -106,26 +106,71 @@ enum ContentType CT_APPLICATION_X_JAVASCRIPT [[deprecated("use CT_TEXT_JAVASCRIPT")]], CT_TEXT_JAVASCRIPT, CT_TEXT_CSS, - CT_TEXT_XML, - CT_APPLICATION_XML, + CT_TEXT_CSV, + CT_TEXT_XML, // suggests human readable xml + CT_APPLICATION_XML, // suggest machine-to-machine xml CT_TEXT_XSL, CT_APPLICATION_WASM, CT_APPLICATION_OCTET_STREAM, - CT_APPLICATION_X_FONT_TRUETYPE, - CT_APPLICATION_X_FONT_OPENTYPE, CT_APPLICATION_FONT_WOFF, CT_APPLICATION_FONT_WOFF2, - CT_APPLICATION_VND_MS_FONTOBJ, + CT_APPLICATION_GZIP, + CT_APPLICATION_JAVA_ARCHIVE, CT_APPLICATION_PDF, - CT_IMAGE_SVG_XML, - CT_IMAGE_PNG, - CT_IMAGE_WEBP, + CT_APPLICATION_MSWORD, + CT_APPLICATION_MSWORDX, + CT_APPLICATION_VND_MS_FONTOBJ, + CT_APPLICATION_VND_RAR, + CT_APPLICATION_XHTML, + CT_APPLICATION_X_7Z, + CT_APPLICATION_X_BZIP, + CT_APPLICATION_X_BZIP2, + CT_APPLICATION_X_HTTPD_PHP, + CT_APPLICATION_X_FONT_TRUETYPE, + CT_APPLICATION_X_FONT_OPENTYPE, + CT_APPLICATION_X_TAR, + CT_APPLICATION_X_TGZ, + CT_APPLICATION_X_XZ, + CT_APPLICATION_ZIP, + CT_AUDIO_AAC, + CT_AUDIO_AC3, + CT_AUDIO_AIFF, + CT_AUDIO_FLAC, + CT_AUDIO_MATROSKA, + CT_AUDIO_MPEG, + CT_AUDIO_MPEG4, + CT_AUDIO_OGG, + CT_AUDIO_WAVE, + CT_AUDIO_WEBM, + CT_AUDIO_X_APE, + CT_AUDIO_X_MS_WMA, + CT_AUDIO_X_TTA, + CT_AUDIO_X_WAVPACK, + CT_IMAGE_APNG, CT_IMAGE_AVIF, - CT_IMAGE_JPG, + CT_IMAGE_BMP, CT_IMAGE_GIF, - CT_IMAGE_XICON, CT_IMAGE_ICNS, - CT_IMAGE_BMP, + CT_IMAGE_JPG, + CT_IMAGE_JP2, + CT_IMAGE_PNG, + CT_IMAGE_SVG_XML, + CT_IMAGE_TIFF, + CT_IMAGE_WEBP, + CT_IMAGE_X_MNG, + CT_IMAGE_X_TGA, + CT_IMAGE_XICON, + CT_VIDEO_APG, + CT_VIDEO_AV1, + CT_VIDEO_QUICKTIME, + CT_VIDEO_MATROSKA, + CT_VIDEO_MP4, + CT_VIDEO_MPEG, + CT_VIDEO_MPEG2TS, + CT_VIDEO_OGG, + CT_VIDEO_WEBM, + CT_VIDEO_X_M4V, + CT_VIDEO_X_MSVIDEO, CT_MULTIPART_FORM_DATA, CT_CUSTOM }; diff --git a/lib/src/HttpFileImpl.h b/lib/src/HttpFileImpl.h index cd05c9fd5c..f0c7a2d65f 100644 --- a/lib/src/HttpFileImpl.h +++ b/lib/src/HttpFileImpl.h @@ -117,6 +117,9 @@ class HttpFileImpl /// Return the type of file. FileType getFileType() const noexcept { + auto ft = drogon::getFileType(contentType_); + if ((ft != FT_UNKNOWN) && (ft != FT_CUSTOM)) + return ft; return parseFileType(getFileExtension()); } diff --git a/lib/src/HttpUtils.cc b/lib/src/HttpUtils.cc index 4fad29b736..5cfcbb7d25 100644 --- a/lib/src/HttpUtils.cc +++ b/lib/src/HttpUtils.cc @@ -15,12 +15,219 @@ #include "HttpUtils.h" #include #include +#include #include +#include namespace drogon { static std::unordered_map customMime; +// https://en.wikipedia.org/wiki/List_of_file_formats +// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types +// https://www.digipres.org/formats/mime-types/ +// https://www.iana.org/assignments/media-types/media-types.xhtml +// content type -> list of corresponding mime types, the first being the default +// (more standard) one + the mime type to return in contentTypeToMime() when not +// empty (mainly to return the charset for text types) +static const std::unordered_map< + ContentType, + std::pair, std::string_view>> + mimeTypeDatabase_{ + {CT_NONE, {{""}, ""}}, + {CT_APPLICATION_OCTET_STREAM, {{"application/octet-stream"}, ""}}, + {CT_APPLICATION_X_FORM, {{"application/x-www-form-urlencoded"}, ""}}, + {CT_MULTIPART_FORM_DATA, {{"multipart/form-data"}, ""}}, + {CT_APPLICATION_GZIP, {{"application/gzip"}, ""}}, + {CT_APPLICATION_JSON, + {{"application/json"}, "application/json; charset=utf-8"}}, + {CT_APPLICATION_FONT_WOFF, {{"application/font-woff"}, ""}}, + {CT_APPLICATION_FONT_WOFF2, {{"application/font-woff2"}, ""}}, + {CT_APPLICATION_JAVA_ARCHIVE, + {{"application/java-archive", "application/x-java-archive"}, ""}}, + {CT_APPLICATION_MSWORD, {{"application/msword"}, ""}}, + {CT_APPLICATION_MSWORDX, + {{"application/" + "vnd.openxmlformats-officedocument.wordprocessingml.document"}, + ""}}, + {CT_APPLICATION_PDF, {{"application/pdf"}, ""}}, + {CT_APPLICATION_VND_MS_FONTOBJ, + {{"application/vnd.ms-fontobject"}, ""}}, + {CT_APPLICATION_VND_RAR, {{"application/vnd.rar"}, ""}}, + {CT_APPLICATION_WASM, {{"application/wasm"}, ""}}, + {CT_APPLICATION_X_BZIP, {{"application/x-bzip"}, ""}}, + {CT_APPLICATION_X_BZIP2, {{"application/x-bzip2"}, ""}}, + {CT_APPLICATION_X_7Z, {{"application/x-7z-compressed"}, ""}}, + {CT_APPLICATION_X_HTTPD_PHP, {{"application/x-httpd-php"}, ""}}, + {CT_APPLICATION_X_JAVASCRIPT, + {{"application/x-javascript"}, + "application/x-javascript; charset=utf-8"}}, + {CT_APPLICATION_X_FONT_OPENTYPE, + {{"application/x-font-opentype", "font/otf"}, ""}}, + {CT_APPLICATION_X_FONT_TRUETYPE, + {{"application/x-font-truetype", "font/ttf"}, ""}}, + {CT_APPLICATION_X_TAR, {{"application/x-tar"}, ""}}, + {CT_APPLICATION_X_TGZ, {{"application/x-tgz"}, ""}}, + {CT_APPLICATION_X_XZ, {{"application/x-xz", "application/x-lzma"}, ""}}, + {CT_APPLICATION_XHTML, + {{"application/xhtml+xml", "application/xhtml"}, + "application/xhtml+xml; charset=utf-8"}}, + {CT_APPLICATION_XML, + {{"application/xml"}, "application/xml; charset=utf-8"}}, + {CT_APPLICATION_ZIP, {{"application/zip"}, ""}}, + {CT_AUDIO_AAC, {{"audio/aac", "audio/aacp"}, ""}}, + {CT_AUDIO_AC3, {{"audio/ac3"}, ""}}, + {CT_AUDIO_AIFF, {{"audio/aiff", "audio/x-aiff"}, ""}}, + {CT_AUDIO_FLAC, {{"audio/flac"}, ""}}, + {CT_AUDIO_MATROSKA, {{"audio/matroska", "audio/x-matroska"}, ""}}, + {CT_AUDIO_MPEG, {{"audio/mpeg"}, ""}}, + {CT_AUDIO_MPEG4, {{"audio/mp4", "audio/x-m4a"}, ""}}, + {CT_AUDIO_OGG, {{"audio/ogg"}, ""}}, + {CT_AUDIO_WAVE, {{"audio/wav", "audio/x-wav"}, ""}}, + {CT_AUDIO_X_APE, {{"audio/x-ape"}, ""}}, + {CT_AUDIO_X_MS_WMA, {{"audio/x-ms-wma"}, ""}}, + {CT_AUDIO_X_TTA, {{"audio/x-tta"}, ""}}, + {CT_AUDIO_X_WAVPACK, {{"audio/x-wavpack"}, ""}}, + {CT_AUDIO_WEBM, {{"audio/webm"}, ""}}, + {CT_IMAGE_APNG, {{"image/apng"}, ""}}, + {CT_IMAGE_AVIF, {{"image/avif"}, ""}}, + {CT_IMAGE_BMP, {{"image/bmp"}, ""}}, + {CT_IMAGE_GIF, {{"image/gif"}, ""}}, + {CT_IMAGE_ICNS, {{"image/icns"}, ""}}, + {CT_IMAGE_JP2, {{"image/jp2", "image/jpx", "image/jpm"}, ""}}, + {CT_IMAGE_JPG, {{"image/jpeg"}, ""}}, + {CT_IMAGE_PNG, {{"image/png"}, ""}}, + {CT_IMAGE_SVG_XML, {{"image/svg+xml"}, ""}}, + {CT_IMAGE_TIFF, {{"image/tiff"}, ""}}, + {CT_IMAGE_WEBP, {{"image/webp"}, ""}}, + {CT_IMAGE_X_MNG, {{"image/x-mng"}, ""}}, + {CT_IMAGE_X_TGA, {{"image/x-tga", "image/x-targa"}, ""}}, + {CT_IMAGE_XICON, {{"image/vnd.microsoft.icon", "image/x-icon"}, ""}}, + {CT_TEXT_CSS, {{"text/css"}, "text/css; charset=utf-8"}}, + {CT_TEXT_CSV, {{"text/csv"}, "text/csv; charset=utf-8"}}, + {CT_TEXT_HTML, {{"text/html"}, "text/html; charset=utf-8"}}, + {CT_TEXT_JAVASCRIPT, + {{"text/javascript"}, "text/javascript; charset=utf-8"}}, + {CT_TEXT_PLAIN, {{"text/plain"}, "text/plain; charset=utf-8"}}, + {CT_TEXT_XML, {{"text/xml"}, "text/xml; charset=utf-8"}}, + {CT_TEXT_XSL, {{"text/xsl"}, "text/xsl; charset=utf-8"}}, + {CT_VIDEO_APG, {{"video/apg"}, ""}}, + {CT_VIDEO_AV1, {{"video/av01", "video/av1"}, ""}}, + {CT_VIDEO_QUICKTIME, {{"video/quicktime"}, ""}}, + {CT_VIDEO_MPEG, {{"video/mpeg"}, ""}}, + {CT_VIDEO_MPEG2TS, {{"video/mp2t"}, ""}}, + {CT_VIDEO_MP4, {{"video/mp4"}, ""}}, + {CT_VIDEO_OGG, {{"video/ogg"}, ""}}, + {CT_VIDEO_WEBM, {{"video/webm"}, ""}}, + {CT_VIDEO_X_M4V, {{"video/x-m4v"}, ""}}, + {CT_VIDEO_MATROSKA, {{"video/matroska", "video/x-matroska"}, ""}}, + {CT_VIDEO_X_MSVIDEO, {{"video/x-msvideo"}, ""}}, + }; + +static const std::unordered_map> + fileTypeDatabase_{ + {"", {FT_UNKNOWN, CT_CUSTOM}}, + {"aac", {FT_AUDIO, CT_AUDIO_AAC}}, + {"ac3", {FT_AUDIO, CT_AUDIO_AC3}}, + {"aif", {FT_AUDIO, CT_AUDIO_AIFF}}, + {"aifc", {FT_AUDIO, CT_AUDIO_AIFF}}, + {"aiff", {FT_AUDIO, CT_AUDIO_AIFF}}, + {"apg", {FT_AUDIO, CT_VIDEO_APG}}, + {"ape", {FT_AUDIO, CT_AUDIO_X_APE}}, + {"apng", {FT_IMAGE, CT_IMAGE_APNG}}, + {"av1", {FT_MEDIA, CT_VIDEO_AV1}}, + {"avi", {FT_MEDIA, CT_VIDEO_X_MSVIDEO}}, + {"avif", {FT_IMAGE, CT_IMAGE_AVIF}}, + {"bmp", {FT_IMAGE, CT_IMAGE_BMP}}, + {"bz", {FT_ARCHIVE, CT_APPLICATION_X_BZIP}}, + {"bz2", {FT_ARCHIVE, CT_APPLICATION_X_BZIP2}}, + {"css", {FT_DOCUMENT, CT_TEXT_CSS}}, + {"csv", {FT_DOCUMENT, CT_TEXT_CSV}}, + {"doc", {FT_DOCUMENT, CT_APPLICATION_MSWORD}}, + {"docx", {FT_DOCUMENT, CT_APPLICATION_MSWORDX}}, + {"eot", {FT_DOCUMENT, CT_APPLICATION_VND_MS_FONTOBJ}}, + {"flac", {FT_AUDIO, CT_AUDIO_FLAC}}, + {"gif", {FT_MEDIA, CT_IMAGE_GIF}}, + {"gz", {FT_ARCHIVE, CT_APPLICATION_GZIP}}, + {"htm", {FT_DOCUMENT, CT_TEXT_HTML}}, + {"html", {FT_DOCUMENT, CT_TEXT_HTML}}, + {"icns", {FT_IMAGE, CT_IMAGE_ICNS}}, + {"ico", {FT_IMAGE, CT_IMAGE_XICON}}, + {"j2k", {FT_IMAGE, CT_IMAGE_JP2}}, + {"jar", {FT_DOCUMENT, CT_APPLICATION_JAVA_ARCHIVE}}, + {"j2c", {FT_IMAGE, CT_IMAGE_JP2}}, + {"jp2", {FT_IMAGE, CT_IMAGE_JP2}}, + {"jpeg", {FT_IMAGE, CT_IMAGE_JPG}}, + {"jpc", {FT_IMAGE, CT_IMAGE_JP2}}, + {"jpf", {FT_IMAGE, CT_IMAGE_JP2}}, + {"jpg", {FT_IMAGE, CT_IMAGE_JPG}}, + {"jpg2", {FT_IMAGE, CT_IMAGE_JP2}}, + {"jpm", {FT_IMAGE, CT_IMAGE_JP2}}, + {"jpx", {FT_IMAGE, CT_IMAGE_JP2}}, + {"js", {FT_DOCUMENT, CT_TEXT_JAVASCRIPT}}, + {"json", {FT_DOCUMENT, CT_APPLICATION_JSON}}, + {"lzma", {FT_ARCHIVE, CT_APPLICATION_X_XZ}}, + {"m1a", {FT_AUDIO, CT_AUDIO_MPEG}}, + {"m1v", {FT_MEDIA, CT_VIDEO_MPEG}}, + {"m2a", {FT_AUDIO, CT_AUDIO_MPEG}}, + {"m2ts", {FT_MEDIA, CT_VIDEO_MPEG2TS}}, + {"m2v", {FT_MEDIA, CT_VIDEO_MPEG}}, + {"m4a", {FT_AUDIO, CT_AUDIO_MPEG4}}, + {"m4v", {FT_MEDIA, CT_VIDEO_X_M4V}}, + {"mjs", {FT_DOCUMENT, CT_TEXT_JAVASCRIPT}}, + {"mka", {FT_AUDIO, CT_AUDIO_MATROSKA}}, + {"mkv", {FT_MEDIA, CT_VIDEO_MATROSKA}}, + {"mng", {FT_MEDIA, CT_IMAGE_X_MNG}}, + {"mov", {FT_MEDIA, CT_VIDEO_QUICKTIME}}, + {"mp1", {FT_AUDIO, CT_AUDIO_MPEG}}, + {"mp2", {FT_AUDIO, CT_AUDIO_MPEG}}, + {"mp3", {FT_AUDIO, CT_AUDIO_MPEG}}, + {"mp4", {FT_MEDIA, CT_VIDEO_MP4}}, + {"mpa", {FT_AUDIO, CT_AUDIO_MPEG}}, + {"mpe", {FT_MEDIA, CT_VIDEO_MPEG}}, + {"mpeg", {FT_MEDIA, CT_VIDEO_MPEG}}, + {"mpg", {FT_MEDIA, CT_VIDEO_MPEG}}, + {"mpv", {FT_MEDIA, CT_VIDEO_MPEG}}, + {"oga", {FT_AUDIO, CT_AUDIO_OGG}}, + {"ogg", {FT_AUDIO, CT_AUDIO_OGG}}, + {"ogv", {FT_MEDIA, CT_VIDEO_OGG}}, + {"otf", {FT_DOCUMENT, CT_APPLICATION_X_FONT_OPENTYPE}}, + {"pdf", {FT_DOCUMENT, CT_APPLICATION_PDF}}, + {"php", {FT_DOCUMENT, CT_APPLICATION_X_HTTPD_PHP}}, + {"png", {FT_IMAGE, CT_IMAGE_PNG}}, + {"rar", {FT_ARCHIVE, CT_APPLICATION_VND_RAR}}, + {"svg", {FT_IMAGE, CT_IMAGE_SVG_XML}}, + {"tar", {FT_ARCHIVE, CT_APPLICATION_X_TAR}}, + {"targa", {FT_IMAGE, CT_IMAGE_X_TGA}}, + {"tif", {FT_IMAGE, CT_IMAGE_TIFF}}, + {"tiff", {FT_IMAGE, CT_IMAGE_TIFF}}, + {"tga", {FT_IMAGE, CT_IMAGE_X_TGA}}, + {"tgz", {FT_ARCHIVE, CT_APPLICATION_X_TGZ}}, + {"ts", {FT_MEDIA, CT_VIDEO_MPEG2TS}}, + {"tta", {FT_AUDIO, CT_AUDIO_X_TTA}}, + {"ttf", {FT_DOCUMENT, CT_APPLICATION_X_FONT_TRUETYPE}}, + {"txt", {FT_DOCUMENT, CT_TEXT_PLAIN}}, + {"w64", {FT_AUDIO, CT_AUDIO_WAVE}}, + {"wav", {FT_AUDIO, CT_AUDIO_WAVE}}, + {"wave", {FT_AUDIO, CT_AUDIO_WAVE}}, + {"wasm", {FT_DOCUMENT, CT_APPLICATION_WASM}}, + {"weba", {FT_AUDIO, CT_AUDIO_WEBM}}, + {"webm", {FT_MEDIA, CT_VIDEO_WEBM}}, + {"webp", {FT_IMAGE, CT_IMAGE_WEBP}}, + {"wma", {FT_AUDIO, CT_AUDIO_X_MS_WMA}}, + {"woff", {FT_DOCUMENT, CT_APPLICATION_FONT_WOFF}}, + {"woff2", {FT_DOCUMENT, CT_APPLICATION_FONT_WOFF2}}, + {"wv", {FT_AUDIO, CT_AUDIO_X_WAVPACK}}, + {"xht", {FT_DOCUMENT, CT_APPLICATION_XHTML}}, + {"xhtml", {FT_DOCUMENT, CT_APPLICATION_XHTML}}, + {"xml", {FT_DOCUMENT, CT_APPLICATION_XML}}, + {"xsl", {FT_DOCUMENT, CT_TEXT_XSL}}, + {"xz", {FT_ARCHIVE, CT_APPLICATION_X_XZ}}, + {"zip", {FT_ARCHIVE, CT_APPLICATION_ZIP}}, + {"7z", {FT_ARCHIVE, CT_APPLICATION_X_7Z}}, + }; + const std::string_view &statusCodeToString(int code) { switch (code) @@ -386,305 +593,69 @@ ContentType getContentType(const std::string &fileName) extName.begin(), [](unsigned char c) { return tolower(c); }); } - switch (extName.length()) - { - case 0: - return CT_APPLICATION_OCTET_STREAM; - case 2: - { - if (extName == "js") - return CT_TEXT_JAVASCRIPT; - return CT_APPLICATION_OCTET_STREAM; - } - case 3: - { - switch (extName[0]) - { - case 'b': - if (extName == "bmp") - return CT_IMAGE_BMP; - break; - case 'c': - if (extName == "css") - return CT_TEXT_CSS; - break; - case 'e': - if (extName == "eot") - return CT_APPLICATION_VND_MS_FONTOBJ; - break; - case 'g': - if (extName == "gif") - return CT_IMAGE_GIF; - break; - case 'i': - if (extName == "ico") - return CT_IMAGE_XICON; - break; - case 'j': - if (extName == "jpg") - return CT_IMAGE_JPG; - break; - case 'o': - if (extName == "otf") - return CT_APPLICATION_X_FONT_OPENTYPE; - break; - case 'p': - if (extName == "png") - return CT_IMAGE_PNG; - else if (extName == "pdf") - return CT_APPLICATION_PDF; - break; - case 's': - if (extName == "svg") - return CT_IMAGE_SVG_XML; - break; - case 't': - if (extName == "txt") - return CT_TEXT_PLAIN; - else if (extName == "ttf") - return CT_APPLICATION_X_FONT_TRUETYPE; - break; - case 'x': - if (extName == "xml") - return CT_TEXT_XML; - else if (extName == "xsl") - return CT_TEXT_XSL; - break; - default: - break; - } - return CT_APPLICATION_OCTET_STREAM; - } - case 4: - { - if (extName == "avif") - return CT_IMAGE_AVIF; - else if (extName == "html") - return CT_TEXT_HTML; - else if (extName == "jpeg") - return CT_IMAGE_JPG; - else if (extName == "icns") - return CT_IMAGE_ICNS; - else if (extName == "webp") - return CT_IMAGE_WEBP; - else if (extName == "wasm") - return CT_APPLICATION_WASM; - else if (extName == "woff") - return CT_APPLICATION_FONT_WOFF; - return CT_APPLICATION_OCTET_STREAM; - } - case 5: - { - if (extName == "woff2") - return CT_APPLICATION_FONT_WOFF2; - return CT_APPLICATION_OCTET_STREAM; - } - default: - return CT_APPLICATION_OCTET_STREAM; - } + auto it = fileTypeDatabase_.find(extName); + return (it == fileTypeDatabase_.end()) ? CT_APPLICATION_OCTET_STREAM + : it->second.second; } ContentType parseContentType(const std::string_view &contentType) { - static const std::unordered_map map_{ - {"text/html", CT_TEXT_HTML}, - {"application/x-www-form-urlencoded", CT_APPLICATION_X_FORM}, - {"application/xml", CT_APPLICATION_XML}, - {"application/json", CT_APPLICATION_JSON}, - {"application/x-javascript", CT_APPLICATION_X_JAVASCRIPT}, - {"text/javascript", CT_TEXT_JAVASCRIPT}, - {"text/css", CT_TEXT_CSS}, - {"text/xml", CT_TEXT_XML}, - {"text/xsl", CT_TEXT_XSL}, - {"application/octet-stream", CT_APPLICATION_OCTET_STREAM}, - {"image/svg+xml", CT_IMAGE_SVG_XML}, - {"application/x-font-truetype", CT_APPLICATION_X_FONT_TRUETYPE}, - {"application/x-font-opentype", CT_APPLICATION_X_FONT_OPENTYPE}, - {"application/font-woff", CT_APPLICATION_FONT_WOFF}, - {"application/font-woff2", CT_APPLICATION_FONT_WOFF2}, - {"application/vnd.ms-fontobject", CT_APPLICATION_VND_MS_FONTOBJ}, - {"application/pdf", CT_APPLICATION_PDF}, - {"image/png", CT_IMAGE_PNG}, - {"image/webp", CT_IMAGE_WEBP}, - {"image/avif", CT_IMAGE_AVIF}, - {"image/jpeg", CT_IMAGE_JPG}, - {"image/gif", CT_IMAGE_GIF}, - {"image/x-icon", CT_IMAGE_XICON}, - {"image/bmp", CT_IMAGE_BMP}, - {"image/icns", CT_IMAGE_ICNS}, - {"application/wasm", CT_APPLICATION_WASM}, - {"text/plain", CT_TEXT_PLAIN}, - {"multipart/form-data", CT_MULTIPART_FORM_DATA}}; - auto iter = map_.find(contentType); - if (iter == map_.end()) - return CT_NONE; - return iter->second; + // Generate map from database for faster query + static std::unordered_map contentTypeMap_; + // Thread safe initialization + static std::once_flag flag; + std::call_once(flag, []() { + for (const auto &e : mimeTypeDatabase_) + { + for (const auto &type : e.second.first) + contentTypeMap_[type] = e.first; + } + }); + auto ext = contentType.find(';'); + if (ext != std::string_view::npos) + return parseContentType(contentType.substr(0, ext)); + if (contentType == "application/x-www-form-urlencoded") + return CT_APPLICATION_X_FORM; + if (contentType == "multipart/form-data") + return CT_MULTIPART_FORM_DATA; + auto it = contentTypeMap_.find(contentType); + return (it == contentTypeMap_.end()) ? CT_CUSTOM : it->second; } FileType parseFileType(const std::string_view &fileExtension) { - // https://en.wikipedia.org/wiki/List_of_file_formats - static const std::unordered_map map_{ - {"", FT_UNKNOWN}, {"html", FT_DOCUMENT}, {"docx", FT_DOCUMENT}, - {"zip", FT_ARCHIVE}, {"rar", FT_ARCHIVE}, {"xz", FT_ARCHIVE}, - {"7z", FT_ARCHIVE}, {"tgz", FT_ARCHIVE}, {"gz", FT_ARCHIVE}, - {"bz2", FT_ARCHIVE}, {"mp3", FT_AUDIO}, {"wav", FT_AUDIO}, - {"avi", FT_MEDIA}, {"gif", FT_MEDIA}, {"mp4", FT_MEDIA}, - {"mov", FT_MEDIA}, {"png", FT_IMAGE}, {"jpeg", FT_IMAGE}, - {"jpg", FT_IMAGE}, {"ico", FT_IMAGE}}; - auto iter = map_.find(fileExtension); - if (iter == map_.end()) - return FT_CUSTOM; - return iter->second; + std::string extName(fileExtension); + transform(extName.begin(), + extName.end(), + extName.begin(), + [](unsigned char c) { return tolower(c); }); + auto it = fileTypeDatabase_.find(extName); + return (it == fileTypeDatabase_.end()) ? FT_CUSTOM : it->second.first; } -const std::string_view &contentTypeToMime(ContentType contenttype) +FileType getFileType(ContentType contentType) { - switch (contenttype) - { - case CT_TEXT_HTML: - { - static std::string_view sv = "text/html; charset=utf-8"; - return sv; - } - case CT_APPLICATION_X_FORM: - { - static std::string_view sv = "application/x-www-form-urlencoded"; - return sv; - } - case CT_APPLICATION_XML: - { - static std::string_view sv = "application/xml; charset=utf-8"; - return sv; - } - case CT_APPLICATION_JSON: - { - static std::string_view sv = "application/json; charset=utf-8"; - return sv; - } - case CT_APPLICATION_X_JAVASCRIPT: - { - static std::string_view sv = - "application/x-javascript; charset=utf-8"; - return sv; - } - case CT_TEXT_JAVASCRIPT: - { - static std::string_view sv = "text/javascript; charset=utf-8"; - return sv; - } - case CT_TEXT_CSS: - { - static std::string_view sv = "text/css; charset=utf-8"; - return sv; - } - case CT_TEXT_XML: - { - static std::string_view sv = "text/xml; charset=utf-8"; - return sv; - } - case CT_TEXT_XSL: - { - static std::string_view sv = "text/xsl; charset=utf-8"; - return sv; - } - case CT_APPLICATION_OCTET_STREAM: - { - static std::string_view sv = "application/octet-stream"; - return sv; - } - case CT_IMAGE_SVG_XML: - { - static std::string_view sv = "image/svg+xml"; - return sv; - } - case CT_APPLICATION_X_FONT_TRUETYPE: - { - static std::string_view sv = "application/x-font-truetype"; - return sv; - } - case CT_APPLICATION_X_FONT_OPENTYPE: - { - static std::string_view sv = "application/x-font-opentype"; - return sv; - } - case CT_APPLICATION_FONT_WOFF: - { - static std::string_view sv = "application/font-woff"; - return sv; - } - case CT_APPLICATION_FONT_WOFF2: - { - static std::string_view sv = "application/font-woff2"; - return sv; - } - case CT_APPLICATION_VND_MS_FONTOBJ: - { - static std::string_view sv = "application/vnd.ms-fontobject"; - return sv; - } - case CT_APPLICATION_PDF: - { - static std::string_view sv = "application/pdf"; - return sv; - } - case CT_IMAGE_PNG: - { - static std::string_view sv = "image/png"; - return sv; - } - case CT_IMAGE_AVIF: - { - static std::string_view sv = "image/avif"; - return sv; - } - case CT_IMAGE_WEBP: - { - static std::string_view sv = "image/webp"; - return sv; - } - case CT_IMAGE_JPG: - { - static std::string_view sv = "image/jpeg"; - return sv; - } - case CT_IMAGE_GIF: - { - static std::string_view sv = "image/gif"; - return sv; - } - case CT_IMAGE_XICON: - { - static std::string_view sv = "image/x-icon"; - return sv; - } - case CT_IMAGE_BMP: - { - static std::string_view sv = "image/bmp"; - return sv; - } - case CT_IMAGE_ICNS: - { - static std::string_view sv = "image/icns"; - return sv; - } - case CT_APPLICATION_WASM: - { - static std::string_view sv = "application/wasm"; - return sv; - } - case CT_NONE: - { - static std::string_view sv = ""; - return sv; - } - default: - case CT_TEXT_PLAIN: - { - static std::string_view sv = "text/plain; charset=utf-8"; - return sv; - } - } + // Generate map from database for faster query + static std::unordered_map fileTypeMap_; + // Thread safe initialization + static std::once_flag flag; + std::call_once(flag, []() { + for (const auto &e : fileTypeDatabase_) + fileTypeMap_[e.second.second] = e.second.first; + fileTypeMap_[CT_NONE] = FT_UNKNOWN; + fileTypeMap_[CT_CUSTOM] = FT_CUSTOM; + }); + auto it = fileTypeMap_.find(contentType); + return (it == fileTypeMap_.end()) ? FT_UNKNOWN : it->second; +} + +const std::string_view &contentTypeToMime(ContentType contentType) +{ + auto it = mimeTypeDatabase_.find(contentType); + return (it == mimeTypeDatabase_.end()) + ? mimeTypeDatabase_.at(CT_APPLICATION_OCTET_STREAM).first.front() + : (it->second.second.empty() ? it->second.first.front() + : it->second.second); } void registerCustomExtensionMime(const std::string &ext, @@ -703,9 +674,9 @@ void registerCustomExtensionMime(const std::string &ext, const std::string_view fileNameToMime(const std::string &fileName) { - ContentType intenalContentType = getContentType(fileName); - if (intenalContentType != CT_APPLICATION_OCTET_STREAM) - return contentTypeToMime(intenalContentType); + ContentType internalContentType = getContentType(fileName); + if (internalContentType != CT_APPLICATION_OCTET_STREAM) + return contentTypeToMime(internalContentType); std::string extName; auto pos = fileName.rfind('.'); @@ -726,9 +697,9 @@ const std::string_view fileNameToMime(const std::string &fileName) std::pair fileNameToContentTypeAndMime( const std::string &fileName) { - ContentType intenalContentType = getContentType(fileName); - if (intenalContentType != CT_APPLICATION_OCTET_STREAM) - return {intenalContentType, contentTypeToMime(intenalContentType)}; + ContentType internalContentType = getContentType(fileName); + if (internalContentType != CT_APPLICATION_OCTET_STREAM) + return {internalContentType, contentTypeToMime(internalContentType)}; std::string extName; auto pos = fileName.rfind('.'); @@ -745,4 +716,28 @@ std::pair fileNameToContentTypeAndMime( return {CT_NONE, ""}; return {CT_CUSTOM, it->second}; } + +const std::vector &getFileExtensions(ContentType contentType) +{ + // Generate map from database for faster query + static std::unordered_map> + extensionMap_; + static std::vector notFound_; + // Thread safe initialization + static std::once_flag flag; + std::call_once(flag, []() { + for (const auto &e : fileTypeDatabase_) + if (!e.first.empty()) + extensionMap_[e.second.second].push_back(e.first); + // Add deprecated + extensionMap_[CT_APPLICATION_X_JAVASCRIPT] = + extensionMap_[CT_TEXT_JAVASCRIPT]; + extensionMap_[CT_TEXT_XML] = extensionMap_[CT_APPLICATION_XML]; + }); + auto it = extensionMap_.find(contentType); + if (it == extensionMap_.end()) + return notFound_; + return it->second; +} + } // namespace drogon diff --git a/lib/src/HttpUtils.h b/lib/src/HttpUtils.h index 882823d533..16a6c21732 100644 --- a/lib/src/HttpUtils.h +++ b/lib/src/HttpUtils.h @@ -26,6 +26,7 @@ const std::string_view &statusCodeToString(int code); ContentType getContentType(const std::string &fileName); ContentType parseContentType(const std::string_view &contentType); FileType parseFileType(const std::string_view &fileExtension); +FileType getFileType(ContentType contentType); void registerCustomExtensionMime(const std::string &ext, const std::string &mime); const std::string_view fileNameToMime(const std::string &fileName); @@ -40,6 +41,14 @@ inline std::string_view getFileExtension(const std::string &fileName) return std::string_view(&fileName[pos + 1], fileName.length() - pos - 1); } +const std::vector &getFileExtensions(ContentType contentType); + +inline const std::vector &getFileExtensions( + const std::string_view &contentType) +{ + return getFileExtensions(parseContentType(contentType)); +} + template inline constexpr const char *contentLengthFormatString() { diff --git a/lib/tests/unittests/FileTypeTest.cc b/lib/tests/unittests/FileTypeTest.cc index 259c115692..de044f7c50 100644 --- a/lib/tests/unittests/FileTypeTest.cc +++ b/lib/tests/unittests/FileTypeTest.cc @@ -24,6 +24,65 @@ DROGON_TEST(ExtensionTest) } } +DROGON_TEST(ContentTypeTest) +{ + SUBSECTION(normal) + { + for (int i = CT_NONE + 1; i < CT_CUSTOM; i++) + { + auto contentType = ContentType(i); + const auto mimeType = contentTypeToMime(contentType); + CHECK(mimeType.empty() == false); + CHECK(parseContentType(mimeType) == contentType); + auto exts = getFileExtensions(contentType); + bool shouldBeEmpty = (contentType == CT_APPLICATION_X_FORM) || + (contentType == CT_APPLICATION_OCTET_STREAM) || + (contentType == CT_MULTIPART_FORM_DATA); + CHECK(exts.empty() == shouldBeEmpty); + for (const auto &ext : exts) + { + auto dummyFile{std::string("dummy.").append(ext)}; + // Handle multiple mime types by setting the default ContentType + if (contentType == CT_APPLICATION_X_JAVASCRIPT) + contentType = CT_TEXT_JAVASCRIPT; + if (contentType == CT_TEXT_XML) + contentType = CT_APPLICATION_XML; + CHECK(getContentType(dummyFile) == contentType); + CHECK(parseFileType(dummyFile) != FT_UNKNOWN); + } + if (!shouldBeEmpty) + { + CHECK(getFileType(contentType) != FT_UNKNOWN); + CHECK(getFileType(contentType) != FT_CUSTOM); + } + } + } + + SUBSECTION(negative) + { + CHECK(getFileType(CT_NONE) == FT_UNKNOWN); + CHECK(getFileType(CT_CUSTOM) == FT_CUSTOM); + CHECK(getFileType(CT_APPLICATION_X_FORM) == FT_UNKNOWN); + CHECK(getFileType(CT_APPLICATION_OCTET_STREAM) == FT_UNKNOWN); + CHECK(getFileType(CT_MULTIPART_FORM_DATA) == FT_UNKNOWN); + CHECK(contentTypeToMime(CT_NONE).empty()); + CHECK(contentTypeToMime(CT_CUSTOM) == + contentTypeToMime(CT_APPLICATION_OCTET_STREAM)); + CHECK(parseContentType("") == CT_NONE); + CHECK(parseContentType("application/x-www-form-urlencoded") == + CT_APPLICATION_X_FORM); + CHECK(parseContentType("multipart/form-data") == + CT_MULTIPART_FORM_DATA); + CHECK(parseFileType("any.thing") == FT_CUSTOM); + CHECK(getContentType("any.thing") == CT_APPLICATION_OCTET_STREAM); + CHECK(getFileExtensions(CT_NONE).empty()); + CHECK(getFileExtensions(CT_APPLICATION_X_FORM).empty()); + CHECK(getFileExtensions(CT_APPLICATION_OCTET_STREAM).empty()); + CHECK(getFileExtensions(CT_MULTIPART_FORM_DATA).empty()); + CHECK(getFileExtensions(CT_CUSTOM).empty()); + } +} + DROGON_TEST(FileTypeTest) { SUBSECTION(normal) From da7f065a6f7d0793eec7737882248a4471714707 Mon Sep 17 00:00:00 2001 From: an-tao Date: Fri, 9 Feb 2024 16:06:33 +0800 Subject: [PATCH 16/19] Bump version to 1.9.3 --- CMakeLists.txt | 2 +- ChangeLog.md | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- trantor | 2 +- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8fbe8f974f..9c7d783455 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,7 @@ CMAKE_DEPENDENT_OPTION(USE_SPDLOG "Allow using the spdlog logging library" OFF " set(DROGON_MAJOR_VERSION 1) set(DROGON_MINOR_VERSION 9) -set(DROGON_PATCH_VERSION 2) +set(DROGON_PATCH_VERSION 3) set(DROGON_VERSION ${DROGON_MAJOR_VERSION}.${DROGON_MINOR_VERSION}.${DROGON_PATCH_VERSION}) set(DROGON_VERSION_STRING "${DROGON_VERSION}") diff --git a/ChangeLog.md b/ChangeLog.md index 232607520c..6b5a088472 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,52 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +## [1.9.3] - 2024-02-09 + +### API changes list + +- Added getParameter() and getOptionalParameter(). + +- Change drogon::MultiPartParser's parameters data type. + +- Use std::string_view for WebSockets. + +### Changed + +- Add support for gentoo linux, dev-db/mariadb contains mysql. + +- Introduce cpplint to the CI. + +- Enable readability/alt_tokens for cpplint. + +- Use clang-format-17. + +- Add newline at EOF. + +- Enable readability/inheritance for cpplint. + +- Enable build/explicit_make_pair for cpplint. + +- Enable build/include_order for cpplint. + +- Enable build/header_guard for cpplint. + +- Enable build/storage_class for cpplint. + +- Enable readability/multiline_string for cpplint. + +- Alias the safe hashmap template. + +- Simplify traits in utils. + +- Enhancement: extend drogon::ContentType for file handling. + +### Fixed + +- Fix a wrong place of return. + +- Fix drogon::util::fromString(). + ## [1.9.2] - 2024-01-18 ### API changes list @@ -1575,7 +1621,9 @@ All notable changes to this project will be documented in this file. ## [1.0.0-beta1] - 2019-06-11 -[Unreleased]: https://github.com/an-tao/drogon/compare/v1.9.2...HEAD +[Unreleased]: https://github.com/an-tao/drogon/compare/v1.9.3...HEAD + +[1.9.3]: https://github.com/an-tao/drogon/compare/v1.9.2...v1.9.3 [1.9.2]: https://github.com/an-tao/drogon/compare/v1.9.1...v1.9.2 diff --git a/trantor b/trantor index b21daa768b..b4e9c8b863 160000 --- a/trantor +++ b/trantor @@ -1 +1 @@ -Subproject commit b21daa768b22d527a551e6fc5558b8f9845f8edd +Subproject commit b4e9c8b86300419a1792b73cf60747c9c350686d From 88d06684f26ba2b2ac95d9c5f97af3d2aae8b7f5 Mon Sep 17 00:00:00 2001 From: itrofimow Date: Thu, 15 Feb 2024 10:52:10 +0400 Subject: [PATCH 17/19] Minor enhancement: move some smart pointers around instead of copying them (#1954) --- examples/benchmark/JsonCtrl.cc | 2 +- lib/src/HttpRequestParser.cc | 41 +++++++++++++++++----------------- lib/src/HttpServer.cc | 14 +++++++----- 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/examples/benchmark/JsonCtrl.cc b/examples/benchmark/JsonCtrl.cc index fcf5fc51df..89551545fb 100644 --- a/examples/benchmark/JsonCtrl.cc +++ b/examples/benchmark/JsonCtrl.cc @@ -6,6 +6,6 @@ void JsonCtrl::asyncHandleHttpRequest( { Json::Value ret; ret["message"] = "Hello, World!"; - auto resp = HttpResponse::newHttpJsonResponse(ret); + auto resp = HttpResponse::newHttpJsonResponse(std::move(ret)); callback(resp); } diff --git a/lib/src/HttpRequestParser.cc b/lib/src/HttpRequestParser.cc index b9c6375e0b..215bd78533 100644 --- a/lib/src/HttpRequestParser.cc +++ b/lib/src/HttpRequestParser.cc @@ -99,31 +99,32 @@ bool HttpRequestParser::processRequestLine(const char *begin, const char *end) HttpRequestImplPtr HttpRequestParser::makeRequestForPool(HttpRequestImpl *ptr) { - std::weak_ptr weakPtr = shared_from_this(); - return std::shared_ptr(ptr, [weakPtr](HttpRequestImpl *p) { - auto thisPtr = weakPtr.lock(); - if (thisPtr) - { - if (thisPtr->loop_->isInLoopThread()) - { - p->reset(); - thisPtr->requestsPool_.emplace_back( - thisPtr->makeRequestForPool(p)); - } - else + return std::shared_ptr( + ptr, [weakPtr = weak_from_this()](HttpRequestImpl *p) { + auto thisPtr = weakPtr.lock(); + if (thisPtr) { - thisPtr->loop_->queueInLoop([thisPtr, p]() { + if (thisPtr->loop_->isInLoopThread()) + { p->reset(); thisPtr->requestsPool_.emplace_back( thisPtr->makeRequestForPool(p)); - }); + } + else + { + auto &loop = thisPtr->loop_; + loop->queueInLoop([thisPtr = std::move(thisPtr), p]() { + p->reset(); + thisPtr->requestsPool_.emplace_back( + thisPtr->makeRequestForPool(p)); + }); + } } - } - else - { - delete p; - } - }); + else + { + delete p; + } + }); } void HttpRequestParser::reset() diff --git a/lib/src/HttpServer.cc b/lib/src/HttpServer.cc index 2326f1a05b..0661d33ebb 100644 --- a/lib/src/HttpServer.cc +++ b/lib/src/HttpServer.cc @@ -546,11 +546,12 @@ void HttpServer::httpRequestHandling( } } - binderPtr->handleRequest( + auto &binderRef = *binderPtr; + binderRef.handleRequest( req, // This is the actual callback being passed to controller - [req, binderPtr, callback = std::move(callback)]( - const HttpResponsePtr &resp) { + [req, binderPtr = std::move(binderPtr), callback = std::move(callback)]( + const HttpResponsePtr &resp) mutable { // Check if we need to cache the response if (resp->expiredTime() >= 0 && resp->statusCode() != k404NotFound) { @@ -562,9 +563,10 @@ void HttpServer::httpRequestHandling( } else { - loop->queueInLoop([binderPtr, resp]() { - binderPtr->responseCache_.setThreadData(resp); - }); + loop->queueInLoop( + [binderPtr = std::move(binderPtr), resp]() { + binderPtr->responseCache_.setThreadData(resp); + }); } } // post-handling aop From 4cbac301fbebb369dba8935f4f727a1ba5b9c513 Mon Sep 17 00:00:00 2001 From: I-LOVE-C2H5OH <41304540+I-LOVE-C2H5OH@users.noreply.github.com> Date: Mon, 4 Mar 2024 14:50:33 +0600 Subject: [PATCH 18/19] add client cert support for websocket (#1967) --- lib/inc/drogon/WebSocketClient.h | 25 +++++++++++++++++++++++++ lib/src/WebSocketClientImpl.cc | 21 ++++++++++++++++++++- lib/src/WebSocketClientImpl.h | 8 ++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/lib/inc/drogon/WebSocketClient.h b/lib/inc/drogon/WebSocketClient.h index 5afd205873..fa7a6b0533 100644 --- a/lib/inc/drogon/WebSocketClient.h +++ b/lib/inc/drogon/WebSocketClient.h @@ -90,6 +90,31 @@ class DROGON_EXPORT WebSocketClient virtual void connectToServer(const HttpRequestPtr &request, const WebSocketRequestCallback &callback) = 0; + /** + * @brief Set the client certificate used by the HTTP connection + * + * @param cert Path to the certificate + * @param key Path to the certificate's private key + * @note this method has no effect if the HTTP client is communicating via + * unencrypted HTTP + */ + virtual void setCertPath(const std::string &cert, + const std::string &key) = 0; + + /** + * @brief Supplies command style options for `SSL_CONF_cmd` + * + * @param sslConfCmds options for SSL_CONF_cmd + * @note this method has no effect if the HTTP client is communicating via + * unencrypted HTTP + * @code + addSSLConfigs({{"-dhparam", "/path/to/dhparam"}, {"-strict", ""}}); + * @endcode + */ + virtual void addSSLConfigs( + const std::vector> + &sslConfCmds) = 0; + #ifdef __cpp_impl_coroutine /** * @brief Set messages handler. When a message is received from the server, diff --git a/lib/src/WebSocketClientImpl.cc b/lib/src/WebSocketClientImpl.cc index 79d23aaddc..77e39d9ff5 100644 --- a/lib/src/WebSocketClientImpl.cc +++ b/lib/src/WebSocketClientImpl.cc @@ -57,7 +57,10 @@ void WebSocketClientImpl::createTcpClient() auto policy = trantor::TLSPolicy::defaultClientPolicy(); policy->setUseOldTLS(useOldTLS_) .setValidate(validateCert_) - .setHostname(domain_); + .setHostname(domain_) + .setConfCmds(sslConfCmds_) + .setCertPath(clientCertPath_) + .setKeyPath(clientKeyPath_); tcpClientPtr_->enableSSL(std::move(policy)); } auto thisPtr = shared_from_this(); @@ -452,6 +455,22 @@ void WebSocketClientImpl::connectToServer( } } +void WebSocketClientImpl::setCertPath(const std::string &cert, + const std::string &key) +{ + clientCertPath_ = cert; + clientKeyPath_ = key; +} + +void WebSocketClientImpl::addSSLConfigs( + const std::vector> &sslConfCmds) +{ + for (const auto &cmd : sslConfCmds) + { + sslConfCmds_.push_back(cmd); + } +} + WebSocketClientPtr WebSocketClient::newWebSocketClient(const std::string &ip, uint16_t port, bool useSSL, diff --git a/lib/src/WebSocketClientImpl.h b/lib/src/WebSocketClientImpl.h index 8081791633..da964e76ed 100644 --- a/lib/src/WebSocketClientImpl.h +++ b/lib/src/WebSocketClientImpl.h @@ -51,6 +51,11 @@ class WebSocketClientImpl void connectToServer(const HttpRequestPtr &request, const WebSocketRequestCallback &callback) override; + void setCertPath(const std::string &cert, const std::string &key) override; + + void addSSLConfigs(const std::vector> + &sslConfCmds) override; + trantor::EventLoop *getLoop() override { return loop_; @@ -83,6 +88,9 @@ class WebSocketClientImpl bool stop_{false}; std::string wsKey_; std::string wsAccept_; + std::string clientCertPath_; + std::string clientKeyPath_; + std::vector> sslConfCmds_; HttpRequestPtr upgradeRequest_; std::function Date: Wed, 27 Mar 2024 16:02:37 +0800 Subject: [PATCH 19/19] Remove the request shared_ptr from the multipart parser (#1984) --- lib/inc/drogon/MultiPart.h | 5 +++-- lib/src/MultiPart.cc | 9 +++++---- trantor | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/inc/drogon/MultiPart.h b/lib/inc/drogon/MultiPart.h index eb6531ed45..021bdd5e48 100644 --- a/lib/inc/drogon/MultiPart.h +++ b/lib/inc/drogon/MultiPart.h @@ -178,8 +178,9 @@ class DROGON_EXPORT MultiPartParser int parse(const HttpRequestPtr &req, const char *boundaryData, size_t boundaryLen); - int parseEntity(const char *begin, const char *end); - HttpRequestPtr requestPtr_; + int parseEntity(const HttpRequestPtr &req, + const char *begin, + const char *end); }; /// In order to be compatible with old interfaces diff --git a/lib/src/MultiPart.cc b/lib/src/MultiPart.cc index 43c9fbbcf1..fc6848cfd7 100644 --- a/lib/src/MultiPart.cc +++ b/lib/src/MultiPart.cc @@ -104,7 +104,9 @@ static std::pair parseLine( return std::make_pair(std::string_view(), std::string_view()); } -int MultiPartParser::parseEntity(const char *begin, const char *end) +int MultiPartParser::parseEntity(const HttpRequestPtr &req, + const char *begin, + const char *end) { static const char entityName[] = "name="; static const char fileName[] = "filename="; @@ -174,7 +176,7 @@ int MultiPartParser::parseEntity(const char *begin, const char *end) fileNameEnd = std::find(fileNamePos, valueEnd, ';'); } std::string fName{fileNamePos, fileNameEnd}; - filePtr->setRequest(requestPtr_); + filePtr->setRequest(req); filePtr->setItemName(std::move(name)); filePtr->setFileName(std::move(fName)); filePtr->setFile(headEnd + 2, @@ -218,7 +220,6 @@ int MultiPartParser::parse(const HttpRequestPtr &req, std::string_view boundary{boundaryData, boundaryLen}; if (boundary.size() > 2 && boundary[0] == '\"') boundary = boundary.substr(1, boundary.size() - 2); - requestPtr_ = req; std::string_view::size_type pos1, pos2; pos1 = 0; auto content = static_cast(req.get())->bodyView(); @@ -241,7 +242,7 @@ int MultiPartParser::parse(const HttpRequestPtr &req, pos2 -= 4; flag = true; } - if (parseEntity(content.data() + pos1, content.data() + pos2) != 0) + if (parseEntity(req, content.data() + pos1, content.data() + pos2) != 0) return -1; if (flag) pos2 += 4; diff --git a/trantor b/trantor index b4e9c8b863..c92280119a 160000 --- a/trantor +++ b/trantor @@ -1 +1 @@ -Subproject commit b4e9c8b86300419a1792b73cf60747c9c350686d +Subproject commit c92280119a6ebaf71fe6aca0d128222edd028b22