1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:47:34 +00:00

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

View file

@ -83,6 +83,7 @@ Optional<HttpRequest> HttpRequest::from_raw_request(ReadonlyBytes raw_request)
InProtocol, InProtocol,
InHeaderName, InHeaderName,
InHeaderValue, InHeaderValue,
InBody,
}; };
State state { State::InMethod }; State state { State::InMethod };
@ -106,6 +107,7 @@ Optional<HttpRequest> HttpRequest::from_raw_request(ReadonlyBytes raw_request)
String protocol; String protocol;
Vector<Header> headers; Vector<Header> headers;
Header current_header; Header current_header;
ByteBuffer body;
auto commit_and_advance_to = [&](auto& output, State new_state) { auto commit_and_advance_to = [&](auto& output, State new_state) {
output = String::copy(buffer); output = String::copy(buffer);
@ -156,12 +158,33 @@ Optional<HttpRequest> HttpRequest::from_raw_request(ReadonlyBytes raw_request)
if (peek(0) == '\r' && peek(1) == '\n') { if (peek(0) == '\r' && peek(1) == '\n') {
consume(); consume();
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)); headers.append(move(current_header));
break; break;
} }
buffer.append(consume()); buffer.append(consume());
break; 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.m_url.set_paths({ resource });
} }
request.set_body(move(body));
return request; return request;
} }