static IOCB clientWriteBodyComplete;
static bool clientParseRequest(ConnStateData * conn, bool &do_next_read);
static PF clientLifetimeTimeout;
-static ClientSocketContext *parseHttpRequestAbort(ConnStateData * conn,
- const char *uri);
+static ClientSocketContext *parseHttpRequestAbort(ConnStateData * conn, const char *uri);
static ClientSocketContext *parseHttpRequest(ConnStateData *, HttpParser *, HttpRequestMethod *, HttpVersion *);
#if USE_IDENT
static IDCB clientIdentDone;
#if SHOULD_REJECT_UNKNOWN_URLS
- if (!url)
+ if (!url) {
+ hp->request_parse_status = HTTP_BAD_REQUEST;
return parseHttpRequestAbort(conn, "error:invalid-request");
-
+ }
#endif
if (url)
return NULL;
} else if ( (size_t)hp->bufsiz >= Config.maxRequestHeaderSize && headersEnd(hp->buf, Config.maxRequestHeaderSize) == 0) {
debugs(33, 5, "parseHttpRequest: Too large request");
+ hp->request_parse_status = HTTP_HEADER_TOO_LARGE;
return parseHttpRequestAbort(conn, "error:request-too-large");
}
/* Enforce max_request_size */
if (req_sz >= Config.maxRequestHeaderSize) {
debugs(33, 5, "parseHttpRequest: Too large request");
+ hp->request_parse_status = HTTP_HEADER_TOO_LARGE;
return parseHttpRequestAbort(conn, "error:request-too-large");
}
debugs(33, DBG_IMPORTANT, "WARNING: CONNECT method received on " << conn->port->protocol << " Accelerator port " << conn->port->s.GetPort() );
/* XXX need a way to say "this many character length string" */
debugs(33, DBG_IMPORTANT, "WARNING: for request: " << hp->buf);
- /* XXX need some way to set 405 status on the error reply */
+ hp->request_parse_status = HTTP_METHOD_NOT_ALLOWED;
return parseHttpRequestAbort(conn, "error:method-not-allowed");
}
if (*method_p == METHOD_NONE) {
/* XXX need a way to say "this many character length string" */
debugs(33, 1, "clientParseRequestMethod: Unsupported method in request '" << hp->buf << "'");
-
- /* XXX where's the method set for this error? */
+ hp->request_parse_status = HTTP_METHOD_NOT_ALLOWED;
return parseHttpRequestAbort(conn, "error:unsupported-request-method");
}
*/
if ( squid_strnstr(req_hdr, "\r\r\n", req_sz) ) {
debugs(33, 1, "WARNING: suspicious HTTP request contains double CR");
+ hp->request_parse_status = HTTP_BAD_REQUEST;
return parseHttpRequestAbort(conn, "error:double-CR");
}
debugs(33, 1, "clientProcessRequest: Invalid Request");
clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
assert (repContext);
- repContext->setReplyToError(ERR_INVALID_REQ, HTTP_BAD_REQUEST, method, NULL, conn->peer, NULL, conn->in.buf, NULL);
+ switch(hp->request_parse_status)
+ {
+ case HTTP_HEADER_TOO_LARGE:
+ repContext->setReplyToError(ERR_TOO_BIG, HTTP_HEADER_TOO_LARGE, method, http->uri, conn->peer, NULL, conn->in.buf, NULL);
+ break;
+ case HTTP_METHOD_NOT_ALLOWED:
+ repContext->setReplyToError(ERR_UNSUP_REQ, HTTP_METHOD_NOT_ALLOWED, method, http->uri, conn->peer, NULL, conn->in.buf, NULL);
+ break;
+ default:
+ repContext->setReplyToError(ERR_INVALID_REQ, HTTP_BAD_REQUEST, method, http->uri, conn->peer, NULL, conn->in.buf, NULL);
+ }
assert(context->http->out.offset == 0);
context->pullData();
conn->flags.readMoreRequests = false;
*/
ClientHttpRequest **H;
clientStreamNode *node;
- ClientHttpRequest *http =
- parseHttpRequestAbort(this, "error:Connection%20lifetime%20expired");
+ ClientHttpRequest *http = parseHttpRequestAbort(this, "error:Connection%20lifetime%20expired");
node = http->client_stream.tail->prev->data;
clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
assert (repContext);