Symbian platform (C++)
SDK native APIs, runtime and tooling
Loading...
Searching...
No Matches
http1.h
Go to the documentation of this file.
1/*
2 * Copyright 2026 The A11 Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
29#ifndef SYMBIAN_HTTP_HTTP1_H_
30#define SYMBIAN_HTTP_HTTP1_H_
31
32#include <cstddef>
33#include <cstdint>
34#include <optional>
35#include <string>
36#include <string_view>
37
38#include <absl/status/status.h>
39#include <absl/status/statusor.h>
40
41#include "symbian/http/types.h"
42
44
46struct Http1RequestHead {
47 std::string method;
48 std::string target;
49 std::string version;
50 Headers headers;
51};
52
54struct Http1ResponseHead {
55 int status = 0;
56 std::string reason;
57 std::string version;
58 Headers headers;
59};
60
62enum class BodyFraming {
63 kNone,
65 kChunked,
67};
68
70struct BodyPlan {
72 std::size_t content_length = 0;
73};
74
80std::optional<std::size_t> FindHeaderBlockEnd(std::string_view data);
81
85absl::StatusOr<Http1RequestHead> ParseRequestHead(std::string_view head_block);
87absl::StatusOr<Http1ResponseHead> ParseResponseHead(
88 std::string_view head_block);
89
91absl::StatusOr<BodyPlan> PlanRequestBody(const Headers& headers);
96absl::StatusOr<BodyPlan> PlanResponseBody(std::string_view request_method,
97 int status, const Headers& headers);
98
107class ChunkedDecoder {
108 public:
116 absl::Status Feed(std::string_view data, std::string* out, bool* complete);
117
118 [[nodiscard]] bool complete() const { return state_ == State::kComplete; }
119
125 [[nodiscard]] const Headers& trailers() const { return trailers_; }
126
127 private:
128 enum class State { kSize, kData, kDataCrlf, kTrailer, kComplete };
129
130 State state_ = State::kSize;
131 std::string pending_; // Partial line (size line or trailer line).
132 std::uint64_t remaining_ = 0; // Bytes left in the current chunk's data.
133 std::size_t metadata_bytes_ = 0;
134 Headers trailers_; // Trailer section, once the body completes.
135};
136
139std::string EncodeChunk(std::string_view data);
144std::string EncodeLastChunk(const Headers& trailers = {});
145
149void AppendHeaderBlock(const Headers& headers, std::string* out);
151std::string SerializeRequest(std::string_view method, std::string_view target,
152 const Headers& headers);
154std::string SerializeResponse(int status, const Headers& headers,
155 std::string_view reason = {});
156
158std::string_view DefaultReasonPhrase(int status);
159
160} // namespace symbian::http::internal
161
162#endif // SYMBIAN_HTTP_HTTP1_H_
Definition http1.cc:27
absl::StatusOr< BodyPlan > PlanResponseBody(std::string_view request_method, int status, const Headers &headers)
Definition http1.cc:335
std::optional< std::size_t > FindHeaderBlockEnd(std::string_view data)
Definition http1.cc:208
BodyFraming
How a message body is delimited on the wire.
Definition http1.h:62
@ kChunked
Transfer-Encoding: chunked.
@ kNone
No body (e.g. GET request, 204/304 response).
@ kContentLength
Exactly content_length bytes.
@ kUntilClose
Body runs until the connection closes (response only).
absl::StatusOr< Http1RequestHead > ParseRequestHead(std::string_view head_block)
Parses a request head (start line + headers, no trailing CRLFCRLF needed).
Definition http1.cc:227
std::string EncodeLastChunk(const Headers &trailers)
Definition http1.cc:459
std::string SerializeResponse(int status, const Headers &headers, std::string_view reason)
Serializes an HTTP/1.1 response head (status line + headers + CRLF).
Definition http1.cc:483
std::string_view DefaultReasonPhrase(int status)
Definition http1.cc:493
absl::StatusOr< Http1ResponseHead > ParseResponseHead(std::string_view head_block)
Parses a response head (status line + headers).
Definition http1.cc:254
std::string SerializeRequest(std::string_view method, std::string_view target, const Headers &headers)
Serializes an HTTP/1.1 request head (start line + headers + CRLF).
Definition http1.cc:475
absl::StatusOr< BodyPlan > PlanRequestBody(const Headers &headers)
Definition http1.cc:330
std::string EncodeChunk(std::string_view data)
Definition http1.cc:452
void AppendHeaderBlock(const Headers &headers, std::string *out)
Appends "name: value\r\n" for each header to out (names sent as given).
Definition http1.cc:469
std::vector< std::pair< std::string, std::string > > Headers
Definition types.h:15
std::string target
Definition sis.cc:301
uint8_t out
Definition usb.cc:194
std::vector< unsigned char > data
Definition usb.cc:292