LibHTTP: Include request body in HttpRequest::from_raw_request()

This commit is contained in:
Sam Atkins 2022-10-11 15:01:47 +01:00 committed by Andreas Kling
parent 437c6fc277
commit f754f45680
Notes: sideshowbarker 2024-07-17 06:02:10 +09:00

View file

@ -83,6 +83,7 @@ Optional<HttpRequest> HttpRequest::from_raw_request(ReadonlyBytes raw_request)
InProtocol,
InHeaderName,
InHeaderValue,
InBody,
};
State state { State::InMethod };
@ -106,6 +107,7 @@ Optional<HttpRequest> HttpRequest::from_raw_request(ReadonlyBytes raw_request)
String protocol;
Vector<Header> headers;
Header current_header;
ByteBuffer body;
auto commit_and_advance_to = [&](auto& output, State new_state) {
output = String::copy(buffer);
@ -156,12 +158,33 @@ Optional<HttpRequest> HttpRequest::from_raw_request(ReadonlyBytes raw_request)
if (peek(0) == '\r' && peek(1) == '\n') {
consume();
consume();
commit_and_advance_to(current_header.value, State::InHeaderName);
// Detect end of headers
auto next_state = State::InHeaderName;
if (peek(0) == '\r' && peek(1) == '\n') {
consume();
consume();
next_state = State::InBody;
}
commit_and_advance_to(current_header.value, next_state);
headers.append(move(current_header));
break;
}
buffer.append(consume());
break;
case State::InBody:
buffer.append(consume());
if (index + 1 == raw_request.size()) {
// End of data, so store the body
auto maybe_body = ByteBuffer::copy(buffer);
// FIXME: Propagate this error somehow.
if (maybe_body.is_error())
return {};
body = maybe_body.release_value();
buffer.clear();
}
break;
}
}
@ -200,6 +223,8 @@ Optional<HttpRequest> HttpRequest::from_raw_request(ReadonlyBytes raw_request)
request.m_url.set_paths({ resource });
}
request.set_body(move(body));
return request;
}