/// initiate tunneling if possible or return false otherwise
bool
-ConnStateData::tunnelOnError(const HttpRequestMethod &, const err_type requestError)
+ConnStateData::tunnelOnError(const err_type requestError)
{
if (!Config.accessList.on_unsupported_protocol) {
debugs(33, 5, "disabled; send error: " << requestError);
if (context)
context->finished(); // Will remove from pipeline queue
Comm::SetSelect(clientConnection->fd, COMM_SELECT_READ, NULL, NULL, 0);
- return initiateTunneledRequest(request, Http::METHOD_NONE, "unknown-protocol", preservedClientData);
+ return initiateTunneledRequest(request, "unknown-protocol", preservedClientData);
}
debugs(33, 3, "denied; send error: " << requestError);
return false;
conn->quitAfterError(request.getRaw());
clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
assert (repContext);
- repContext->setReplyToError(ERR_UNSUP_REQ, Http::scNotImplemented, request->method, NULL,
+ repContext->setReplyToError(ERR_UNSUP_REQ, Http::scNotImplemented, nullptr,
conn, request.getRaw(), nullptr, nullptr);
assert(context->http->out.offset == 0);
context->pullData();
clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
assert (repContext);
conn->quitAfterError(request.getRaw());
- repContext->setReplyToError(ERR_INVALID_REQ, frameStatus, request->method, nullptr, conn, request.getRaw(), nullptr, nullptr);
+ repContext->setReplyToError(ERR_INVALID_REQ, frameStatus, nullptr, conn, request.getRaw(), nullptr, nullptr);
assert(context->http->out.offset == 0);
context->pullData();
clientProcessRequestFinished(conn, request);
assert (repContext);
conn->quitAfterError(request.getRaw());
repContext->setReplyToError(ERR_TOO_BIG,
- Http::scPayloadTooLarge, Http::METHOD_NONE, NULL,
+ Http::scPayloadTooLarge, nullptr,
conn, http->request, nullptr, nullptr);
assert(context->http->out.offset == 0);
context->pullData();
const Http::StatusCode scode = (error == ERR_TOO_BIG) ?
Http::scPayloadTooLarge : HTTP_BAD_REQUEST;
repContext->setReplyToError(error, scode,
- repContext->http->request->method,
repContext->http->uri,
CachePeer,
repContext->http->request,
const err_type error = receivedFirstByte_ ? ERR_REQUEST_PARSE_TIMEOUT : ERR_REQUEST_START_TIMEOUT;
updateError(error);
- if (tunnelOnError(HttpRequestMethod(), error))
+ if (tunnelOnError(error))
return;
/*
HttpRequest::Pointer request = context->http->request;
debugs(83, 5, "Got something other than TLS Client Hello. Cannot SslBump.");
updateError(ERR_PROTOCOL_UNKNOWN, parseErrorDetails);
- if (!tunnelOnError(HttpRequestMethod(), ERR_PROTOCOL_UNKNOWN))
+ if (!tunnelOnError(ERR_PROTOCOL_UNKNOWN))
clientConnection->close();
return;
}
// respond with "Connection Established" to the client.
// This fake CONNECT request required to allow use of SNI in
// doCallout() checks and adaptations.
- return initiateTunneledRequest(request, Http::METHOD_CONNECT, "splice", preservedClientData);
+ return initiateTunneledRequest(request, "splice", preservedClientData);
}
}
}
- if (!tunnelOnError(HttpRequestMethod(), errCategory))
+ if (!tunnelOnError(errCategory))
clientConnection->close();
}
#endif /* USE_OPENSSL */
bool
-ConnStateData::initiateTunneledRequest(HttpRequest::Pointer const &cause, Http::MethodType const method, const char *reason, const SBuf &payload)
+ConnStateData::initiateTunneledRequest(HttpRequest::Pointer const &cause, const char *reason, const SBuf &payload)
{
// fake a CONNECT request to force connState to tunnel
SBuf connectHost;
}
debugs(33, 2, "Request tunneling for " << reason);
- ClientHttpRequest *http = buildFakeRequest(method, connectHost, connectPort, payload);
+ ClientHttpRequest *http = buildFakeRequest(connectHost, connectPort, payload);
HttpRequest::Pointer request = http->request;
request->flags.forceTunnel = true;
http->calloutContext = new ClientRequestContext(http);
connectHost.assign(ip);
}
- ClientHttpRequest *http = buildFakeRequest(Http::METHOD_CONNECT, connectHost, connectPort, payload);
+ ClientHttpRequest *http = buildFakeRequest(connectHost, connectPort, payload);
http->calloutContext = new ClientRequestContext(http);
HttpRequest::Pointer request = http->request;
}
ClientHttpRequest *
-ConnStateData::buildFakeRequest(Http::MethodType const method, SBuf &useHost, unsigned short usePort, const SBuf &payload)
+ConnStateData::buildFakeRequest(SBuf &useHost, unsigned short usePort, const SBuf &payload)
{
ClientHttpRequest *http = new ClientHttpRequest(this);
Http::Stream *stream = new Http::Stream(clientConnection, http);
// Setup Http::Request object. Maybe should be replaced by a call to (modified)
// clientProcessRequest
HttpRequest::Pointer request = new HttpRequest(mx);
- AnyP::ProtocolType proto = (method == Http::METHOD_NONE) ? AnyP::PROTO_AUTHORITY_FORM : AnyP::PROTO_HTTP;
- request->url.setScheme(proto, nullptr);
- request->method = method;
+ request->url.setScheme(AnyP::PROTO_AUTHORITY_FORM, nullptr);
+ request->method = Http::METHOD_CONNECT;
request->url.host(useHost.c_str());
request->url.port(usePort);
request->manager(this, http->al);
- if (proto == AnyP::PROTO_HTTP)
- request->header.putStr(Http::HOST, useHost.c_str());
+ request->header.putStr(Http::HOST, useHost.c_str());
request->sources |= ((switchedToHttps() || port->transport.protocol == AnyP::PROTO_HTTPS) ? Http::Message::srcHttps : Http::Message::srcHttp);
#if USE_AUTH
bool fakeAConnectRequest(const char *reason, const SBuf &payload);
/// generates and sends to tunnel.cc a fake request with a given payload
- bool initiateTunneledRequest(HttpRequest::Pointer const &cause, Http::MethodType const method, const char *reason, const SBuf &payload);
+ bool initiateTunneledRequest(HttpRequest::Pointer const &cause, const char *reason, const SBuf &payload);
/// whether we should start saving inBuf client bytes in anticipation of
/// tunneling them to the server later (on_unsupported_protocol)
bool shouldPreserveClientData() const;
/// build a fake http request
- ClientHttpRequest *buildFakeRequest(Http::MethodType const method, SBuf &useHost, unsigned short usePort, const SBuf &payload);
+ ClientHttpRequest *buildFakeRequest(SBuf &useHost, unsigned short usePort, const SBuf &payload);
/// From-client handshake bytes (including bytes at the beginning of a
/// CONNECT tunnel) which we may need to forward as-is if their syntax does
/// whether preservedClientData is valid and should be kept up to date
bool preservingClientData_ = false;
- bool tunnelOnError(const HttpRequestMethod &, const err_type);
+ bool tunnelOnError(const err_type);
private:
/* ::Server API */
*/
void
clientReplyContext::setReplyToError(
- err_type err, Http::StatusCode status, const HttpRequestMethod& method, char const *uri,
+ err_type err, Http::StatusCode status, char const *uri,
const ConnStateData *conn, HttpRequest *failedrequest, const char *unparsedrequest,
#if USE_AUTH
Auth::UserRequest::Pointer auth_user_request
#if USE_AUTH
errstate->auth_user_request = auth_user_request;
#endif
- setReplyToError(method, errstate);
+ setReplyToError(failedrequest ? failedrequest->method : HttpRequestMethod(Http::METHOD_NONE), errstate);
}
void clientReplyContext::setReplyToError(const HttpRequestMethod& method, ErrorState *errstate)
/// replaces current response store entry with the given one
void setReplyToStoreEntry(StoreEntry *e, const char *reason);
/// builds error using clientBuildError() and calls setReplyToError() below
- void setReplyToError(err_type, Http::StatusCode, const HttpRequestMethod&, char const *, const ConnStateData *, HttpRequest *, const char *,
+ void setReplyToError(err_type, Http::StatusCode, char const *, const ConnStateData *, HttpRequest *, const char *,
#if USE_AUTH
Auth::UserRequest::Pointer);
#else
clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
assert (repContext);
repContext->setReplyToError(ERR_CONFLICT_HOST, Http::scConflict,
- http->request->method, NULL,
+ nullptr,
http->getConn(),
http->request,
NULL,
clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
assert (repContext);
repContext->setReplyToError(ERR_GATEWAY_FAILURE, status,
- http->request->method, NULL,
+ nullptr,
http->getConn(),
http->request,
NULL,
assert(http->log_uri);
const char * requestErrorBytes = inBuf.c_str();
- if (!tunnelOnError(parser_->method(), errPage)) {
- setReplyError(context, request, parser_->method(), errPage, parser_->parseStatusCode, requestErrorBytes);
+ if (!tunnelOnError(errPage)) {
+ setReplyError(context, request, errPage, parser_->parseStatusCode, requestErrorBytes);
// HttpRequest object not build yet, there is no reason to call
// clientProcessRequestFinished method
}
http->setLogUriToRawUri(http->uri, parser_->method());
const char * requestErrorBytes = inBuf.c_str();
- if (!tunnelOnError(parser_->method(), ERR_INVALID_URL)) {
- setReplyError(context, request, parser_->method(), ERR_INVALID_URL, Http::scBadRequest, requestErrorBytes);
+ if (!tunnelOnError(ERR_INVALID_URL)) {
+ setReplyError(context, request, ERR_INVALID_URL, Http::scBadRequest, requestErrorBytes);
// HttpRequest object not build yet, there is no reason to call
// clientProcessRequestFinished method
}
http->setLogUriToRawUri(http->uri, parser_->method());
const char * requestErrorBytes = NULL; //HttpParserHdrBuf(parser_);
- if (!tunnelOnError(parser_->method(), ERR_UNSUP_HTTPVERSION)) {
- setReplyError(context, request, parser_->method(), ERR_UNSUP_HTTPVERSION, Http::scHttpVersionNotSupported, requestErrorBytes);
+ if (!tunnelOnError(ERR_UNSUP_HTTPVERSION)) {
+ setReplyError(context, request, ERR_UNSUP_HTTPVERSION, Http::scHttpVersionNotSupported, requestErrorBytes);
clientProcessRequestFinished(this, request);
}
return false;
// setReplyToError() requires log_uri
http->setLogUriToRawUri(http->uri, parser_->method());
const char * requestErrorBytes = NULL; //HttpParserHdrBuf(parser_);
- if (!tunnelOnError(parser_->method(), ERR_INVALID_REQ)) {
- setReplyError(context, request, parser_->method(), ERR_INVALID_REQ, Http::scBadRequest, requestErrorBytes);
+ if (!tunnelOnError(ERR_INVALID_REQ)) {
+ setReplyError(context, request, ERR_INVALID_REQ, Http::scBadRequest, requestErrorBytes);
clientProcessRequestFinished(this, request);
}
return false;
}
void
-Http::One::Server::setReplyError(Http::StreamPointer &context, HttpRequest::Pointer &request, const HttpRequestMethod& method, err_type requestError, Http::StatusCode errStatusCode, const char *requestErrorBytes)
+Http::One::Server::setReplyError(Http::StreamPointer &context, HttpRequest::Pointer &request, err_type requestError, Http::StatusCode errStatusCode, const char *requestErrorBytes)
{
quitAfterError(request.getRaw());
if (!context->connRegistered()) {
clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
assert (repContext);
- repContext->setReplyToError(requestError, errStatusCode, method, context->http->uri, this, nullptr, requestErrorBytes, nullptr);
+ repContext->setReplyToError(requestError, errStatusCode, context->http->uri, this, nullptr, requestErrorBytes, nullptr);
assert(context->http->out.offset == 0);
context->pullData();
assert(http->log_uri);
clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
assert (repContext);
- repContext->setReplyToError(ERR_INVALID_REQ, Http::scExpectationFailed, request->method, http->uri,
+ repContext->setReplyToError(ERR_INVALID_REQ, Http::scExpectationFailed, http->uri,
this, request.getRaw(), nullptr, nullptr);
assert(context->http->out.offset == 0);
context->pullData();
/// Return false if parsing is failed, true otherwise.
bool buildHttpRequest(Http::StreamPointer &context);
- void setReplyError(Http::StreamPointer &context, HttpRequest::Pointer &request, const HttpRequestMethod& method, err_type requestError, Http::StatusCode errStatusCode, const char *requestErrorBytes);
+ void setReplyError(Http::StreamPointer &context, HttpRequest::Pointer &request, err_type requestError, Http::StatusCode errStatusCode, const char *requestErrorBytes);
Http1::RequestParserPointer parser_;
HttpRequestMethod method_; ///< parsed HTTP method