]> granicus.if.org Git - icinga2/commitdiff
Merge pull request #7485 from Icinga/bugfix/api-disconnect-defer
authorMichael Friedrich <michael.friedrich@icinga.com>
Mon, 9 Sep 2019 09:41:34 +0000 (11:41 +0200)
committerGitHub <noreply@github.com>
Mon, 9 Sep 2019 09:41:34 +0000 (11:41 +0200)
Avoid the Defer-Disconnect destructor pattern with Boost.Coroutines

lib/remote/httpserverconnection.cpp

index 6052f923a1b6f41eed39781af915e8f94ba76932..42adeda4c34007c4292a2c0df7d83668245ee92d 100644 (file)
@@ -146,43 +146,37 @@ bool EnsureValidHeaders(
 {
        namespace http = boost::beast::http;
 
-       bool httpError = true;
+       bool httpError = false;
+       String errorMsg;
 
-       try {
-               boost::system::error_code ec;
+       boost::system::error_code ec;
 
-               http::async_read_header(stream, buf, parser, yc[ec]);
+       http::async_read_header(stream, buf, parser, yc[ec]);
 
-               if (ec) {
-                       /**
-                        * Unfortunately there's no way to tell an HTTP protocol error
-                        * from an error on a lower layer:
-                        *
-                        * <https://github.com/boostorg/beast/issues/643>
-                        */
-                       throw std::invalid_argument(ec.message());
-               }
+       if (ec) {
+               errorMsg = ec.message();
+               httpError = true;
+       }
 
-               httpError = false;
+       switch (parser.get().version()) {
+       case 10:
+       case 11:
+               break;
+       default:
+               errorMsg = "Unsupported HTTP version";
+       }
 
-               switch (parser.get().version()) {
-               case 10:
-               case 11:
-                       break;
-               default:
-                       throw std::invalid_argument("Unsupported HTTP version");
-               }
-       } catch (const std::invalid_argument& ex) {
+       if (!errorMsg.IsEmpty() || httpError) {
                response.result(http::status::bad_request);
 
                if (!httpError && parser.get()[http::field::accept] == "application/json") {
                        HttpUtility::SendJsonBody(response, nullptr, new Dictionary({
                                { "error", 400 },
-                               { "status", String("Bad Request: ") + ex.what() }
+                               { "status", String("Bad Request: ") + errorMsg }
                        }));
                } else {
                        response.set(http::field::content_type, "text/html");
-                       response.body() = String("<h1>Bad Request</h1><p><pre>") + ex.what() + "</pre></p>";
+                       response.body() = String("<h1>Bad Request</h1><p><pre>") + errorMsg + "</pre></p>";
                        response.set(http::field::content_length, response.body().size());
                }