diff --git a/README.md b/README.md index 448b978e..f68b5f30 100644 --- a/README.md +++ b/README.md @@ -72,10 +72,9 @@ using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; HttpResponse HelloWorld(HttpRequest) { // NOLINT - HttpResponse response; - response.set_header("Content-Type", "text/plain"); - response.set_payload("Hello World\n"); - return response; + return HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload("Hello World\n"); } ``` diff --git a/examples/hello_from_namespace/hello_from_namespace.cc b/examples/hello_from_namespace/hello_from_namespace.cc index 1805996a..91e4fa5e 100644 --- a/examples/hello_from_namespace/hello_from_namespace.cc +++ b/examples/hello_from_namespace/hello_from_namespace.cc @@ -21,10 +21,9 @@ using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; HttpResponse HelloWorld(HttpRequest) { // NOLINT - HttpResponse response; - response.set_header("Content-Type", "text/plain"); - response.set_payload("Hello from a C++ namespace!\n"); - return response; + return HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload("Hello from a C++ namespace!\n"); } } // namespace hello_from_namespace diff --git a/examples/hello_from_nested_namespace/hello_from_nested_namespace.cc b/examples/hello_from_nested_namespace/hello_from_nested_namespace.cc index 3f2dadf3..aa7de8ef 100644 --- a/examples/hello_from_nested_namespace/hello_from_nested_namespace.cc +++ b/examples/hello_from_nested_namespace/hello_from_nested_namespace.cc @@ -21,10 +21,9 @@ using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; HttpResponse HelloWorld(HttpRequest) { // NOLINT - HttpResponse response; - response.set_header("Content-Type", "text/plain"); - response.set_payload("Hello from a nested C++ namespace!\n"); - return response; + return HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload("Hello from a nested C++ namespace!\n"); } } // namespace hello_from_nested_namespace::ns0::ns1 diff --git a/examples/hello_gcs/hello_gcs.cc b/examples/hello_gcs/hello_gcs.cc index 0d337315..0a3540a9 100644 --- a/examples/hello_gcs/hello_gcs.cc +++ b/examples/hello_gcs/hello_gcs.cc @@ -23,9 +23,7 @@ namespace gcs = ::google::cloud::storage; HttpResponse HelloGcs(HttpRequest request) { // NOLINT auto error = [] { - HttpResponse response; - response.set_result(HttpResponse::kBadRequest); - return response; + return HttpResponse{}.set_result(HttpResponse::kBadRequest); }; std::vector components; @@ -42,8 +40,7 @@ HttpResponse HelloGcs(HttpRequest request) { // NOLINT std::istreambuf_iterator{}); if (!reader.status().ok()) return error(); - HttpResponse response; - response.set_header("Content-Type", "application/octet-stream"); - response.set_payload(std::move(contents)); - return response; + return HttpResponse{} + .set_header("Content-Type", "application/octet-stream") + .set_payload(std::move(contents)); } diff --git a/examples/hello_multiple_sources/hello_multiple_sources.cc b/examples/hello_multiple_sources/hello_multiple_sources.cc index d6ea6532..03330730 100644 --- a/examples/hello_multiple_sources/hello_multiple_sources.cc +++ b/examples/hello_multiple_sources/hello_multiple_sources.cc @@ -20,8 +20,7 @@ using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; HttpResponse HelloMultipleSources(HttpRequest) { // NOLINT - HttpResponse response; - response.set_header("Content-Type", "text/plain"); - response.set_payload(Greeting()); - return response; + return HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload(Greeting()); } diff --git a/examples/hello_with_third_party/hello_with_third_party.cc b/examples/hello_with_third_party/hello_with_third_party.cc index 2d9f466a..bcd5428e 100644 --- a/examples/hello_with_third_party/hello_with_third_party.cc +++ b/examples/hello_with_third_party/hello_with_third_party.cc @@ -20,8 +20,7 @@ using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; HttpResponse HelloWithThirdParty(HttpRequest request) { // NOLINT - HttpResponse response; - response.set_header("Content-Type", "text/plain"); - response.set_payload(fmt::format("Hello at {}\n", request.target())); - return response; + return HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload(fmt::format("Hello at {}\n", request.target())); } diff --git a/examples/hello_world/hello_world.cc b/examples/hello_world/hello_world.cc index 01598165..b93ab818 100644 --- a/examples/hello_world/hello_world.cc +++ b/examples/hello_world/hello_world.cc @@ -19,8 +19,7 @@ using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; HttpResponse HelloWorld(HttpRequest) { // NOLINT - HttpResponse response; - response.set_header("Content-Type", "text/plain"); - response.set_payload("Hello World\n"); - return response; + return HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload("Hello World\n"); } diff --git a/examples/site/concepts_after_response/concepts_after_response.cc b/examples/site/concepts_after_response/concepts_after_response.cc index 8cf3181a..cba26f87 100644 --- a/examples/site/concepts_after_response/concepts_after_response.cc +++ b/examples/site/concepts_after_response/concepts_after_response.cc @@ -28,8 +28,6 @@ gcf::HttpResponse concepts_after_response( for (int i = 0; i != kIterations; ++i) sum += i; return sum; }); - gcf::HttpResponse response; - response.set_payload("Hello World!"); - return response; + return gcf::HttpResponse{}.set_payload("Hello World!"); } // [END functions_concepts_after_response] diff --git a/examples/site/concepts_after_timeout/concepts_after_timeout.cc b/examples/site/concepts_after_timeout/concepts_after_timeout.cc index 8ec1e1a6..67206a2a 100644 --- a/examples/site/concepts_after_timeout/concepts_after_timeout.cc +++ b/examples/site/concepts_after_timeout/concepts_after_timeout.cc @@ -25,9 +25,7 @@ gcf::HttpResponse concepts_after_timeout(gcf::HttpRequest request) { // NOLINT using std::chrono::minutes; std::cout << "Function running..." << std::endl; if (request.verb() == "GET") std::this_thread::sleep_for(minutes(2)); - gcf::HttpResponse response; - response.set_payload("Function completed!"); std::cout << "Function completed!" << std::endl; - return response; + return gcf::HttpResponse{}.set_payload("Function completed!"); } // [END functions_concepts_after_timeout] diff --git a/examples/site/concepts_filesystem/concepts_filesystem.cc b/examples/site/concepts_filesystem/concepts_filesystem.cc index fc1af76f..89110090 100644 --- a/examples/site/concepts_filesystem/concepts_filesystem.cc +++ b/examples/site/concepts_filesystem/concepts_filesystem.cc @@ -25,9 +25,8 @@ gcf::HttpResponse concepts_filesystem(gcf::HttpRequest /*request*/) { // NOLINT payload += p.path().generic_string(); payload += "\n"; } - gcf::HttpResponse response; - response.set_header("content-type", "text/plain"); - response.set_payload(payload); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload(payload); } // [END functions_concepts_after_timeout] diff --git a/examples/site/concepts_request/concepts_request.cc b/examples/site/concepts_request/concepts_request.cc index 50f5ef4f..9c021689 100644 --- a/examples/site/concepts_request/concepts_request.cc +++ b/examples/site/concepts_request/concepts_request.cc @@ -27,10 +27,8 @@ unsigned int make_http_request(std::string const& host); gcf::HttpResponse concepts_request(gcf::HttpRequest /*request*/) { // NOLINT std::string const host = "example.com"; auto const code = make_http_request(host); - gcf::HttpResponse response; - response.set_payload("Received code " + std::to_string(code) + " from " + - host); - return response; + return gcf::HttpResponse{}.set_payload( + "Received code " + std::to_string(code) + " from " + host); } // [END functions_concepts_requests] diff --git a/examples/site/concepts_stateless/concepts_stateless.cc b/examples/site/concepts_stateless/concepts_stateless.cc index fe79362e..ad65e81d 100644 --- a/examples/site/concepts_stateless/concepts_stateless.cc +++ b/examples/site/concepts_stateless/concepts_stateless.cc @@ -25,8 +25,7 @@ std::atomic count{0}; } // namespace gcf::HttpResponse concepts_stateless(gcf::HttpRequest /*request*/) { // NOLINT - gcf::HttpResponse response; - response.set_payload("Instance execution count: " + std::to_string(++count)); - return response; + return gcf::HttpResponse{}.set_payload("Instance execution count: " + + std::to_string(++count)); } // [END functions_concepts_stateless] diff --git a/examples/site/env_vars/env_vars.cc b/examples/site/env_vars/env_vars.cc index 7fa62e28..6f40bce7 100644 --- a/examples/site/env_vars/env_vars.cc +++ b/examples/site/env_vars/env_vars.cc @@ -22,8 +22,6 @@ namespace gcf = ::google::cloud::functions; gcf::HttpResponse env_vars(gcf::HttpRequest /*request*/) { // NOLINT char const* value = std::getenv("FOO"); if (value == nullptr) value = "FOO environment variable is not set"; - gcf::HttpResponse response; - response.set_payload(value); - return response; + return gcf::HttpResponse{}.set_payload(value); } // [END functions_env_vars] diff --git a/examples/site/hello_world_error/hello_world_error.cc b/examples/site/hello_world_error/hello_world_error.cc index 13d969ea..f3cbda42 100644 --- a/examples/site/hello_world_error/hello_world_error.cc +++ b/examples/site/hello_world_error/hello_world_error.cc @@ -23,9 +23,8 @@ namespace gcf = ::google::cloud::functions; gcf::HttpResponse hello_world_error(gcf::HttpRequest request) { // NOLINT if (request.target() == "/return500") { // An error response code does NOT create entries in Error Reporting - gcf::HttpResponse response; - response.set_result(gcf::HttpResponse::kInternalServerError); - return response; + return gcf::HttpResponse{}.set_result( + gcf::HttpResponse::kInternalServerError); } // Unstructured logs to stdout and/or stderr do NOT create entries in Error // Reporting @@ -50,9 +49,8 @@ gcf::HttpResponse hello_world_error(gcf::HttpRequest request) { // NOLINT .dump() << std::endl; - gcf::HttpResponse response; - response.set_payload("Hello World!"); - response.set_header("content-type", "text/plain"); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello World!"); } // [END functions_helloworld_error] diff --git a/examples/site/hello_world_get/hello_world_get.cc b/examples/site/hello_world_get/hello_world_get.cc index 937645ad..022631c8 100644 --- a/examples/site/hello_world_get/hello_world_get.cc +++ b/examples/site/hello_world_get/hello_world_get.cc @@ -19,9 +19,8 @@ namespace gcf = ::google::cloud::functions; gcf::HttpResponse hello_world_get(gcf::HttpRequest) { // NOLINT - gcf::HttpResponse response; - response.set_payload("Hello World!"); - response.set_header("content-type", "text/plain"); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello World!"); } // [END functions_helloworld_get] diff --git a/examples/site/hello_world_http/hello_world_http.cc b/examples/site/hello_world_http/hello_world_http.cc index 723296d1..26ce9ca3 100644 --- a/examples/site/hello_world_http/hello_world_http.cc +++ b/examples/site/hello_world_http/hello_world_http.cc @@ -29,9 +29,8 @@ gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { return std::string("Hello World!"); }; - gcf::HttpResponse response; - response.set_payload(greeting()); - response.set_header("content-type", "text/plain"); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload(greeting()); } // [END functions_helloworld_http] diff --git a/examples/site/howto_create_container/README.md b/examples/site/howto_create_container/README.md index d593b638..8d356568 100644 --- a/examples/site/howto_create_container/README.md +++ b/examples/site/howto_create_container/README.md @@ -52,10 +52,9 @@ gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { return std::string("Hello World!"); }; - gcf::HttpResponse response; - response.set_payload(greeting()); - response.set_header("content-type", "text/plain"); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload(greeting()); } ``` diff --git a/examples/site/howto_deploy_to_cloud_run/README.md b/examples/site/howto_deploy_to_cloud_run/README.md index 56506d26..4f1191fd 100644 --- a/examples/site/howto_deploy_to_cloud_run/README.md +++ b/examples/site/howto_deploy_to_cloud_run/README.md @@ -58,10 +58,9 @@ gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { return std::string("Hello World!"); }; - gcf::HttpResponse response; - response.set_payload(greeting()); - response.set_header("content-type", "text/plain"); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload(greeting()); } ``` diff --git a/examples/site/howto_local_development/local_server.cc b/examples/site/howto_local_development/local_server.cc index 6cd7b8e7..9a511e17 100644 --- a/examples/site/howto_local_development/local_server.cc +++ b/examples/site/howto_local_development/local_server.cc @@ -20,10 +20,9 @@ namespace gcf = ::google::cloud::functions; namespace { gcf::HttpResponse HelloWithShutdown(gcf::HttpRequest const& /*request*/) { - gcf::HttpResponse response; - response.set_header("Content-Type", "text/plain"); - response.set_payload("Hello World\n"); - return response; + return gcf::HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload("Hello World\n"); } } // namespace diff --git a/examples/site/howto_offload_builder_creation/README.md b/examples/site/howto_offload_builder_creation/README.md index d36f0aa5..0c8b82d1 100644 --- a/examples/site/howto_offload_builder_creation/README.md +++ b/examples/site/howto_offload_builder_creation/README.md @@ -96,10 +96,9 @@ gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { return std::string("Hello World!"); }; - gcf::HttpResponse response; - response.set_payload(greeting()); - response.set_header("content-type", "text/plain"); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload(greeting()); } ``` diff --git a/examples/site/http_content/http_content.cc b/examples/site/http_content/http_content.cc index 51326802..2e59fe00 100644 --- a/examples/site/http_content/http_content.cc +++ b/examples/site/http_content/http_content.cc @@ -45,10 +45,9 @@ gcf::HttpResponse http_content(gcf::HttpRequest request) { // NOLINT } } - gcf::HttpResponse response; - response.set_payload("Hello " + name); - response.set_header("content-type", "text/plain"); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello " + name); } // [END functions_http_content] diff --git a/examples/site/http_cors/http_cors.cc b/examples/site/http_cors/http_cors.cc index 55a6b6fd..ac998ced 100644 --- a/examples/site/http_cors/http_cors.cc +++ b/examples/site/http_cors/http_cors.cc @@ -23,19 +23,17 @@ gcf::HttpResponse http_cors(gcf::HttpRequest request) { // NOLINT if (request.verb() == "OPTIONS") { // Allows GET requests from any origin with the Content-Type header and // caches preflight response for an 3600s - gcf::HttpResponse response; - response.set_result(gcf::HttpResponse::kNoContent); - response.set_header("Access-Control-Allow-Origin", "*"); - response.set_header("Access-Control-Allow-Methods", "GET"); - response.set_header("Access-Control-Allow-Headers", "Content-Type"); - response.set_header("Access-Control-Max-Age", "3600"); - return response; + return gcf::HttpResponse{} + .set_result(gcf::HttpResponse::kNoContent) + .set_header("Access-Control-Allow-Origin", "*") + .set_header("Access-Control-Allow-Methods", "GET") + .set_header("Access-Control-Allow-Headers", "Content-Type") + .set_header("Access-Control-Max-Age", "3600"); } - gcf::HttpResponse response; - response.set_header("content-type", "text/plain"); - response.set_payload("Hello World!"); - response.set_header("Access-Control-Allow-Origin", "*"); - return response; + return gcf::HttpResponse{} + .set_header("Access-Control-Allow-Origin", "*") + .set_header("content-type", "text/plain") + .set_payload("Hello World!"); } // [END functions_http_cors] diff --git a/examples/site/http_cors_auth/http_cors_auth.cc b/examples/site/http_cors_auth/http_cors_auth.cc index ed57318f..6ace8302 100644 --- a/examples/site/http_cors_auth/http_cors_auth.cc +++ b/examples/site/http_cors_auth/http_cors_auth.cc @@ -23,21 +23,19 @@ gcf::HttpResponse http_cors_auth(gcf::HttpRequest request) { // NOLINT if (request.verb() == "OPTIONS") { // Allows GET requests from any origin with the Content-Type header and // caches preflight response for an 3600s - gcf::HttpResponse response; - response.set_result(gcf::HttpResponse::kNoContent); - response.set_header("Access-Control-Allow-Origin", "https://mydomain.com"); - response.set_header("Access-Control-Allow-Methods", "GET"); - response.set_header("Access-Control-Allow-Headers", "Authorization"); - response.set_header("Access-Control-Max-Age", "3600"); - response.set_header("Access-Control-Allow-Credentials", "true"); - return response; + return gcf::HttpResponse{} + .set_result(gcf::HttpResponse::kNoContent) + .set_header("Access-Control-Allow-Origin", "https://mydomain.com") + .set_header("Access-Control-Allow-Methods", "GET") + .set_header("Access-Control-Allow-Headers", "Authorization") + .set_header("Access-Control-Max-Age", "3600") + .set_header("Access-Control-Allow-Credentials", "true"); } - gcf::HttpResponse response; - response.set_header("content-type", "text/plain"); - response.set_payload("Hello World!"); - response.set_header("Access-Control-Allow-Origin", "https://mydomain.com"); - response.set_header("Access-Control-Allow-Credentials", "true"); - return response; + return gcf::HttpResponse{} + .set_header("Access-Control-Allow-Origin", "https://mydomain.com") + .set_header("Access-Control-Allow-Credentials", "true") + .set_header("content-type", "text/plain") + .set_payload("Hello World!"); } // [END functions_http_cors_auth] diff --git a/examples/site/http_method/http_method.cc b/examples/site/http_method/http_method.cc index 0eaba254..13e17f91 100644 --- a/examples/site/http_method/http_method.cc +++ b/examples/site/http_method/http_method.cc @@ -20,16 +20,13 @@ namespace gcf = ::google::cloud::functions; gcf::HttpResponse http_method(gcf::HttpRequest request) { // NOLINT if (request.verb() == "GET") { - gcf::HttpResponse response; - response.set_header("content-type", "text/plain"); - response.set_payload("Hello World!"); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello World!"); } - gcf::HttpResponse response; - response.set_result(request.verb() == "POST" - ? gcf::HttpResponse::kForbidden - : gcf::HttpResponse::kMethodNotAllowed); - return response; + return gcf::HttpResponse{}.set_result( + request.verb() == "POST" ? gcf::HttpResponse::kForbidden + : gcf::HttpResponse::kMethodNotAllowed); } // [END functions_http_method] diff --git a/examples/site/http_xml/http_xml.cc b/examples/site/http_xml/http_xml.cc index 0e5e750f..bf15227f 100644 --- a/examples/site/http_xml/http_xml.cc +++ b/examples/site/http_xml/http_xml.cc @@ -30,9 +30,8 @@ gcf::HttpResponse http_xml(gcf::HttpRequest request) { // NOLINT boost::property_tree::read_xml(is, data); auto name = data.get("name", "World"); - gcf::HttpResponse response; - response.set_header("content-type", "text/plain"); - response.set_payload("Hello " + name); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello " + name); } // [END functions_http_xml] diff --git a/examples/site/log_helloworld/log_helloworld.cc b/examples/site/log_helloworld/log_helloworld.cc index fbcb97dd..71309f15 100644 --- a/examples/site/log_helloworld/log_helloworld.cc +++ b/examples/site/log_helloworld/log_helloworld.cc @@ -28,9 +28,8 @@ gcf::HttpResponse log_helloworld(gcf::HttpRequest /*request*/) { // NOLINT {"severity", "error"}} .dump() << "\n"; - gcf::HttpResponse response; - response.set_payload("Hello Logging!"); - response.set_header("content-type", "text/plain"); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello Logging!"); } // [END functions_log_helloworld] diff --git a/examples/site/tips_lazy_globals/tips_lazy_globals.cc b/examples/site/tips_lazy_globals/tips_lazy_globals.cc index 9d4c4be1..e6f0898d 100644 --- a/examples/site/tips_lazy_globals/tips_lazy_globals.cc +++ b/examples/site/tips_lazy_globals/tips_lazy_globals.cc @@ -29,8 +29,6 @@ void h_init() { h = "heavy computation"; } gcf::HttpResponse tips_lazy_globals(gcf::HttpRequest /*request*/) { // NOLINT std::call_once(h_init_flag, h_init); - gcf::HttpResponse response; - response.set_payload("Global: " + h); - return response; + return gcf::HttpResponse{}.set_payload("Global: " + h); } // [END functions_tips_lazy_globals] diff --git a/examples/site/tips_scopes/tips_scopes.cc b/examples/site/tips_scopes/tips_scopes.cc index 7faa9fc6..4f5a1184 100644 --- a/examples/site/tips_scopes/tips_scopes.cc +++ b/examples/site/tips_scopes/tips_scopes.cc @@ -29,9 +29,7 @@ std::string h = heavy_computation(); gcf::HttpResponse tips_scopes(gcf::HttpRequest /*request*/) { // NOLINT auto l = light_computation(); - gcf::HttpResponse response; - response.set_payload("Global: " + h + ", Local: " + l); - return response; + return gcf::HttpResponse{}.set_payload("Global: " + h + ", Local: " + l); } // [END functions_tips_scopes] diff --git a/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc b/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc index c789b2bf..0bbdb6e6 100644 --- a/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc +++ b/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc @@ -73,9 +73,8 @@ gcf::HttpResponse tutorial_cloud_bigtable(gcf::HttpRequest request) { // NOLINT } } - gcf::HttpResponse response; - response.set_payload(std::move(os).str()); - response.set_header("content-type", "text/plain"); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload(std::move(os).str()); } // [END bigtable_functions_quickstart] diff --git a/examples/site/tutorial_cloud_spanner/tutorial_cloud_spanner.cc b/examples/site/tutorial_cloud_spanner/tutorial_cloud_spanner.cc index 1c9ea11b..88140d81 100644 --- a/examples/site/tutorial_cloud_spanner/tutorial_cloud_spanner.cc +++ b/examples/site/tutorial_cloud_spanner/tutorial_cloud_spanner.cc @@ -58,9 +58,8 @@ gcf::HttpResponse tutorial_cloud_spanner( << std::get<2>(*row) << "\n"; } - gcf::HttpResponse response; - response.set_payload(std::move(os).str()); - response.set_header("content-type", "text/plain"); - return response; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload(std::move(os).str()); } // [END spanner_functions_quickstart] diff --git a/examples/site_test.cc b/examples/site_test.cc index d88c67ee..60fde5a3 100644 --- a/examples/site_test.cc +++ b/examples/site_test.cc @@ -318,8 +318,8 @@ TEST(ExamplesSiteTest, HelloWorldStorage) { TEST(ExamplesSiteTest, HttpContent) { auto make_request = [](std::string content_type, std::string payload) { return gcf::HttpRequest{} - .set_payload(std::move(payload)) - .add_header("content-type", std::move(content_type)); + .add_header("content-type", std::move(content_type)) + .set_payload(std::move(payload)); }; auto actual = http_content( diff --git a/google/cloud/functions/http_request_test.cc b/google/cloud/functions/http_request_test.cc index d9f87bc0..443b714c 100644 --- a/google/cloud/functions/http_request_test.cc +++ b/google/cloud/functions/http_request_test.cc @@ -33,10 +33,10 @@ TEST(HttpRequestTest, Default) { TEST(HttpRequestTest, SimpleSetters) { auto const actual = HttpRequest{} + .set_version(1, 0) .set_verb("POST") .set_target("/index.html") - .set_payload("Hello") - .set_version(1, 0); + .set_payload("Hello"); EXPECT_EQ(actual.verb(), "POST"); EXPECT_EQ(actual.target(), "/index.html"); EXPECT_EQ(actual.payload(), "Hello"); diff --git a/google/cloud/functions/http_response.h b/google/cloud/functions/http_response.h index 6c9a9a56..3cd146ad 100644 --- a/google/cloud/functions/http_response.h +++ b/google/cloud/functions/http_response.h @@ -41,6 +41,45 @@ class HttpResponse { HttpResponse(); + /// The request payload + HttpResponse& set_payload(std::string v) & { + impl_->set_payload(std::move(v)); + return *this; + } + HttpResponse&& set_payload(std::string v) && { + return std::move(set_payload(std::move(v))); + } + [[nodiscard]] std::string const& payload() const { return impl_->payload(); } + + /// The status result + HttpResponse& set_result(int code) & { + impl_->set_result(code); + return *this; + } + HttpResponse&& set_result(int code) && { return std::move(set_result(code)); } + [[nodiscard]] int result() const { return impl_->result(); } + + /// The request HTTP headers + HttpResponse& set_header(std::string_view name, std::string_view value) & { + impl_->set_header(name, value); + return *this; + } + HttpResponse&& set_header(std::string_view name, std::string_view value) && { + return std::move(set_header(name, value)); + } + [[nodiscard]] HeadersType headers() const { return impl_->headers(); } + + /// The HTTP version for the request + HttpResponse& set_version(int major, int minor) & { + impl_->set_version(major, minor); + return *this; + } + HttpResponse&& set_version(int major, int minor) && { + return std::move(set_version(major, minor)); + } + [[nodiscard]] int version_major() const { return impl_->version_major(); } + [[nodiscard]] int version_minor() const { return impl_->version_minor(); } + /** * @name Common HTTP status codes. */ @@ -115,25 +154,6 @@ class HttpResponse { inline static auto constexpr kNetworkAuthenticationRequired = 511; //@} - /// The request payload - void set_payload(std::string v) { impl_->set_payload(std::move(v)); } - [[nodiscard]] std::string const& payload() const { return impl_->payload(); } - - /// Set the status result - void set_result(int code) { impl_->set_result(code); } - [[nodiscard]] int result() const { return impl_->result(); } - - /// The request HTTP headers - void set_header(std::string_view name, std::string_view value) { - impl_->set_header(name, value); - } - [[nodiscard]] HeadersType headers() const { return impl_->headers(); } - - /// The HTTP version for the request - void set_version(int major, int minor) { impl_->set_version(major, minor); } - [[nodiscard]] int version_major() const { return impl_->version_major(); } - [[nodiscard]] int version_minor() const { return impl_->version_minor(); } - class Impl { public: virtual ~Impl() = 0; diff --git a/google/cloud/functions/http_response_test.cc b/google/cloud/functions/http_response_test.cc index f585f2e8..bf66fdec 100644 --- a/google/cloud/functions/http_response_test.cc +++ b/google/cloud/functions/http_response_test.cc @@ -23,25 +23,29 @@ using ::testing::ElementsAre; using ::testing::IsEmpty; TEST(WrapResponseTest, Payload) { - functions::HttpResponse response; - EXPECT_THAT(response.payload(), IsEmpty()); + functions::HttpResponse r; + EXPECT_THAT(r.payload(), IsEmpty()); auto const hello = std::string("Hello"); - response.set_payload(std::string(hello)); + auto response = std::move(r).set_payload(std::string(hello)); EXPECT_EQ(response.payload(), hello); - auto const goodbye = std::string("Goodbye"); + auto const bye = std::string("Goodbye"); + response.set_payload(bye); + EXPECT_EQ(response.payload(), bye); } TEST(WrapResponseTest, Result) { - functions::HttpResponse response; - EXPECT_EQ(response.result(), functions::HttpResponse::kOkay); - response.set_result(functions::HttpResponse::kNotFound); + functions::HttpResponse r; + EXPECT_EQ(r.result(), functions::HttpResponse::kOkay); + auto response = std::move(r).set_result(functions::HttpResponse::kNotFound); EXPECT_EQ(response.result(), functions::HttpResponse::kNotFound); + response.set_result(functions::HttpResponse::kBadGateway); + EXPECT_EQ(response.result(), functions::HttpResponse::kBadGateway); } TEST(WrapResponseTest, Headers) { - functions::HttpResponse response; - EXPECT_THAT(response.headers(), IsEmpty()); - response.set_header("Content-Type", "application/json"); + auto r = functions::HttpResponse{}; + EXPECT_THAT(r.headers(), IsEmpty()); + auto response = std::move(r).set_header("Content-Type", "application/json"); EXPECT_THAT(response.headers(), ElementsAre(std::make_pair("Content-Type", "application/json"))); response.set_header("x-goog-test", "a"); @@ -52,12 +56,15 @@ TEST(WrapResponseTest, Headers) { } TEST(WrapResponseTest, Version) { - functions::HttpResponse response; - EXPECT_EQ(response.version_major(), 1); - EXPECT_EQ(response.version_minor(), 1); - response.set_version(1, 0); + auto r = functions::HttpResponse{}; + EXPECT_EQ(r.version_major(), 1); + EXPECT_EQ(r.version_minor(), 1); + auto response = std::move(r).set_version(1, 0); EXPECT_EQ(response.version_major(), 1); EXPECT_EQ(response.version_minor(), 0); + response.set_version(1, 1); + EXPECT_EQ(response.version_major(), 1); + EXPECT_EQ(response.version_minor(), 1); } } // namespace diff --git a/google/cloud/functions/integration_tests/echo_server.cc b/google/cloud/functions/integration_tests/echo_server.cc index fcdc07a0..f48fd727 100644 --- a/google/cloud/functions/integration_tests/echo_server.cc +++ b/google/cloud/functions/integration_tests/echo_server.cc @@ -29,17 +29,14 @@ HttpResponse EchoServer(HttpRequest const& request) { if (target.rfind("/unknown-exception/", 0) == 0) throw "uh-oh"; if (target == "/ok") { - HttpResponse response; - response.set_header("Content-Type", "text/plain"); - response.set_payload("OK"); - return response; + return HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload("OK"); } if (target.rfind("/error/", 0) == 0) { auto code = std::stoi(target.substr(std::strlen("/error/"))); - HttpResponse response; - response.set_result(code); - return response; + return HttpResponse{}.set_result(code); } if (target.rfind("/buffered-stdout/", 0) == 0) { @@ -60,10 +57,9 @@ HttpResponse EchoServer(HttpRequest const& request) { } payload << "}\n"; - HttpResponse response; - response.set_header("Content-Type", "application/json"); - response.set_payload(std::move(payload).str()); - return response; + return HttpResponse{} + .set_header("Content-Type", "application/json") + .set_payload(std::move(payload).str()); } int main(int argc, char* argv[]) { diff --git a/google/cloud/functions/internal/call_user_function_test.cc b/google/cloud/functions/internal/call_user_function_test.cc index d30c8d40..12cbe61d 100644 --- a/google/cloud/functions/internal/call_user_function_test.cc +++ b/google/cloud/functions/internal/call_user_function_test.cc @@ -29,10 +29,9 @@ TEST(CallUserFunctionHttpTest, Basic) { EXPECT_EQ(request.target(), "/foo/bar"); EXPECT_THAT(request.headers(), Contains(std::make_pair("x-goog-test", "test-value"))); - functions::HttpResponse response{}; - response.set_payload("just nod if you can hear me"); - response.set_header("x-goog-test", "response-header"); - return response; + return functions::HttpResponse{} + .set_header("x-goog-test", "response-header") + .set_payload("just nod if you can hear me"); }; BeastRequest request; request.target("/foo/bar"); @@ -47,9 +46,8 @@ TEST(CallUserFunctionHttpTest, Basic) { TEST(CallUserFunctionHttpTest, ReturnError) { auto func = [&](functions::HttpRequest const& /*request*/) { - functions::HttpResponse response{}; - response.set_result(functions::HttpResponse::kNotFound); - return response; + return functions::HttpResponse{}.set_result( + functions::HttpResponse::kNotFound); }; BeastRequest request; request.target("/foo/bar/not-there"); diff --git a/google/cloud/functions/internal/framework_impl_test.cc b/google/cloud/functions/internal/framework_impl_test.cc index c2c53baf..75157443 100644 --- a/google/cloud/functions/internal/framework_impl_test.cc +++ b/google/cloud/functions/internal/framework_impl_test.cc @@ -103,10 +103,9 @@ TEST(FrameworkTest, Http) { auto port_f = port_p.get_future(); std::atomic shutdown{false}; auto hello = [](functions::HttpRequest const& r) { - functions::HttpResponse response; - response.set_payload("Hello World from " + r.target()); - response.set_header("content-type", "text/plain"); - return response; + return functions::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello World from " + r.target()); }; auto run = [&](int argc, char const* const argv[], functions::UserHttpFunction f) {