| // Copyright 2023 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "quiche/quic/tools/web_transport_only_backend.h" |
| |
| #include <memory> |
| #include <string> |
| #include <utility> |
| |
| #include "absl/status/status.h" |
| #include "absl/status/statusor.h" |
| #include "quiche/quic/tools/quic_backend_response.h" |
| #include "quiche/common/http/http_header_block.h" |
| #include "quiche/web_transport/web_transport.h" |
| |
| namespace quic { |
| |
| void WebTransportOnlyBackend::FetchResponseFromBackend( |
| const quiche::HttpHeaderBlock&, const std::string&, |
| RequestHandler* request_handler) { |
| static QuicBackendResponse* response = []() { |
| quiche::HttpHeaderBlock headers; |
| headers[":status"] = "405"; // 405 Method Not Allowed |
| headers["content-type"] = "text/plain"; |
| auto response = std::make_unique<QuicBackendResponse>(); |
| response->set_headers(std::move(headers)); |
| response->set_body("This endpoint only accepts WebTransport requests"); |
| return response.release(); |
| }(); |
| request_handler->OnResponseBackendComplete(response); |
| } |
| |
| WebTransportOnlyBackend::WebTransportResponse |
| WebTransportOnlyBackend::ProcessWebTransportRequest( |
| const quiche::HttpHeaderBlock& request_headers, |
| webtransport::Session* session) { |
| WebTransportResponse response; |
| |
| auto path = request_headers.find(":path"); |
| if (path == request_headers.end()) { |
| response.response_headers[":status"] = "400"; |
| return response; |
| } |
| |
| absl::StatusOr<std::unique_ptr<webtransport::SessionVisitor>> processed = |
| callback_(path->second, session); |
| switch (processed.status().code()) { |
| case absl::StatusCode::kOk: |
| response.response_headers[":status"] = "200"; |
| response.visitor = *std::move(processed); |
| return response; |
| case absl::StatusCode::kNotFound: |
| response.response_headers[":status"] = "404"; |
| return response; |
| case absl::StatusCode::kInvalidArgument: |
| response.response_headers[":status"] = "400"; |
| return response; |
| case absl::StatusCode::kResourceExhausted: |
| response.response_headers[":status"] = "429"; |
| return response; |
| default: |
| response.response_headers[":status"] = "500"; |
| return response; |
| } |
| } |
| |
| } // namespace quic |