2 * Copyright (c) Meta Platforms, Inc. and affiliates.
5 * This source code is licensed under the BSD-style license found in the
6 * LICENSE file in the root directory of this source tree.
9 #include <proxygen/lib/http/session/HTTPDirectResponseHandler.h>
11 #include <folly/Conv.h>
12 #include <proxygen/lib/http/session/HTTPErrorPage.h>
16 using std::unique_ptr
;
20 HTTPDirectResponseHandler::HTTPDirectResponseHandler(
22 const std::string
& statusMsg
,
23 const HTTPErrorPage
* errorPage
)
25 errorPage_(errorPage
),
26 statusMessage_(statusMsg
),
27 statusCode_(statusCode
),
30 forceConnectionClose_(true) {
33 HTTPDirectResponseHandler::~HTTPDirectResponseHandler() {
36 void HTTPDirectResponseHandler::setTransaction(HTTPTransaction
* txn
) noexcept
{
40 void HTTPDirectResponseHandler::detachTransaction() noexcept
{
44 void HTTPDirectResponseHandler::onHeadersComplete(
45 std::unique_ptr
<HTTPMessage
> /*msg*/) noexcept
{
46 VLOG(4) << "processing request";
49 std::unique_ptr
<folly::IOBuf
> responseBody
;
50 response
.setHTTPVersion(1, 1);
51 response
.setStatusCode(statusCode_
);
52 if (!statusMessage_
.empty()) {
53 response
.setStatusMessage(statusMessage_
);
55 response
.setStatusMessage(HTTPMessage::getDefaultReason(statusCode_
));
57 if (forceConnectionClose_
) {
58 response
.getHeaders().add(HTTP_HEADER_CONNECTION
, "close");
61 HTTPErrorPage::Page page
= errorPage_
->generate(
62 0, statusCode_
, statusMessage_
, nullptr, empty_string
);
63 VLOG(4) << "sending error page with type " << page
.contentType
;
64 response
.getHeaders().add(HTTP_HEADER_CONTENT_TYPE
, page
.contentType
);
65 responseBody
= std::move(page
.content
);
67 response
.getHeaders().add(
68 HTTP_HEADER_CONTENT_LENGTH
,
69 folly::to
<string
>(responseBody
? responseBody
->computeChainDataLength()
71 txn_
->sendHeaders(response
);
73 txn_
->sendBody(std::move(responseBody
));
77 void HTTPDirectResponseHandler::onBody(unique_ptr
<IOBuf
> /*chain*/) noexcept
{
78 VLOG(4) << "discarding request body";
81 void HTTPDirectResponseHandler::onTrailers(
82 unique_ptr
<HTTPHeaders
> /*trailers*/) noexcept
{
83 VLOG(4) << "discarding request trailers";
86 void HTTPDirectResponseHandler::onEOM() noexcept
{
91 void HTTPDirectResponseHandler::onUpgrade(
92 UpgradeProtocol
/*protocol*/) noexcept
{
95 void HTTPDirectResponseHandler::onError(const HTTPException
& error
) noexcept
{
96 if (error
.getDirection() == HTTPException::Direction::INGRESS
) {
97 if (error
.getProxygenError() == kErrorTimeout
) {
98 VLOG(4) << "processing ingress timeout";
100 onHeadersComplete(nullptr);
106 VLOG(4) << "processing ingress error";
108 onHeadersComplete(nullptr);
117 } // namespace proxygen