1 // Copyright 2023 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "quiche/quic/tools/web_transport_only_backend.h" 6 7 #include <memory> 8 #include <string> 9 #include <utility> 10 11 #include "absl/status/status.h" 12 #include "absl/status/statusor.h" 13 #include "quiche/quic/tools/quic_backend_response.h" 14 #include "quiche/common/http/http_header_block.h" 15 #include "quiche/web_transport/web_transport.h" 16 17 namespace quic { 18 FetchResponseFromBackend(const quiche::HttpHeaderBlock &,const std::string &,RequestHandler * request_handler)19void WebTransportOnlyBackend::FetchResponseFromBackend( 20 const quiche::HttpHeaderBlock&, const std::string&, 21 RequestHandler* request_handler) { 22 static QuicBackendResponse* response = []() { 23 quiche::HttpHeaderBlock headers; 24 headers[":status"] = "405"; // 405 Method Not Allowed 25 headers["content-type"] = "text/plain"; 26 auto response = std::make_unique<QuicBackendResponse>(); 27 response->set_headers(std::move(headers)); 28 response->set_body("This endpoint only accepts WebTransport requests"); 29 return response.release(); 30 }(); 31 request_handler->OnResponseBackendComplete(response); 32 } 33 34 WebTransportOnlyBackend::WebTransportResponse ProcessWebTransportRequest(const quiche::HttpHeaderBlock & request_headers,webtransport::Session * session)35WebTransportOnlyBackend::ProcessWebTransportRequest( 36 const quiche::HttpHeaderBlock& request_headers, 37 webtransport::Session* session) { 38 WebTransportResponse response; 39 40 auto path = request_headers.find(":path"); 41 if (path == request_headers.end()) { 42 response.response_headers[":status"] = "400"; 43 return response; 44 } 45 46 absl::StatusOr<std::unique_ptr<webtransport::SessionVisitor>> processed = 47 callback_(path->second, session); 48 switch (processed.status().code()) { 49 case absl::StatusCode::kOk: 50 response.response_headers[":status"] = "200"; 51 response.visitor = *std::move(processed); 52 return response; 53 case absl::StatusCode::kNotFound: 54 response.response_headers[":status"] = "404"; 55 return response; 56 case absl::StatusCode::kInvalidArgument: 57 response.response_headers[":status"] = "400"; 58 return response; 59 case absl::StatusCode::kResourceExhausted: 60 response.response_headers[":status"] = "429"; 61 return response; 62 default: 63 response.response_headers[":status"] = "500"; 64 return response; 65 } 66 } 67 68 } // namespace quic 69