/** * Callback, invoked on each successfully parsed response header key/value pair. */ bool HealthMonitor::onMessageHeader(const BufferRef& name, const BufferRef& value) { TRACE("onResponseHeader(name:%s, value:%s)", name.str().c_str(), value.str().c_str()); if (x0::iequals(name, "Status")) { int status = value.ref(0, value.find(' ')).toInt(); responseCode_ = static_cast<x0::HttpStatus>(status); } return true; }
bool HttpConnection::onMessageHeader(const BufferRef& name, const BufferRef& value) { if (request_->isFinished()) { // this can happen when the request has failed some checks and thus, // a client error message has been sent already. // we need to "parse" the remaining content anyways. TRACE("onMessageHeader() skip \"%s\": \"%s\"", name.str().c_str(), value.str().c_str()); return true; } TRACE("onMessageHeader() \"%s\": \"%s\"", name.str().c_str(), value.str().c_str()); if (iequals(name, "Host")) { auto i = value.find(':'); if (i != BufferRef::npos) request_->hostname = value.ref(0, i); else request_->hostname = value; TRACE(" -- hostname set to \"%s\"", request_->hostname.str().c_str()); } else if (iequals(name, "Connection")) { if (iequals(value, "close")) setShouldKeepAlive(false); else if (iequals(value, "keep-alive")) setShouldKeepAlive(true); } // limit the size of a single request header if (name.size() + value.size() > worker().server().maxRequestHeaderSize()) { TRACE("header too long. got %ld / %ld", name.size() + value.size(), worker().server().maxRequestHeaderSize()); request_->status = HttpError::RequestEntityTooLarge; request_->finish(); return false; } // limit the number of request headers if (request_->requestHeaders.size() > worker().server().maxRequestHeaderCount()) { TRACE("header count exceeded. got %ld / %ld", request_->requestHeaders.size(), worker().server().maxRequestHeaderCount()); request_->status = HttpError::RequestEntityTooLarge; request_->finish(); return false; } request_->requestHeaders.push_back(HttpRequestHeader(name, value)); return true; }