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:
parent
437c6fc277
commit
f754f45680
1 changed files with 26 additions and 1 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue