| 177 | } |
| 178 | |
| 179 | static SC::Result validateRequestHeaders(SC::Span<const SC::HttpClientHeader> headers) |
| 180 | { |
| 181 | for (size_t headerIdx = 0; headerIdx < headers.sizeInElements(); ++headerIdx) |
| 182 | { |
| 183 | const SC::Span<const char> name = headers[headerIdx].name.toCharSpan(); |
| 184 | SC_TRY_MSG(name.sizeInBytes() > 0, "HttpClientRequest: request header name is empty"); |
| 185 | for (size_t byteIdx = 0; byteIdx < name.sizeInBytes(); ++byteIdx) |
| 186 | { |
| 187 | SC_TRY_MSG(isHttpHeaderNameByte(name[byteIdx]), "HttpClientRequest: request header name is invalid"); |
| 188 | } |
| 189 | |
| 190 | const SC::Span<const char> value = headers[headerIdx].value.toCharSpan(); |
| 191 | for (size_t byteIdx = 0; byteIdx < value.sizeInBytes(); ++byteIdx) |
| 192 | { |
| 193 | SC_TRY_MSG(value[byteIdx] != '\r' and value[byteIdx] != '\n' and value[byteIdx] != '\0', |
| 194 | "HttpClientRequest: request header value is invalid"); |
| 195 | } |
| 196 | } |
| 197 | return SC::Result(true); |
| 198 | } |
| 199 | |
| 200 | static SC::Result validateRequestBodyFramingHeaders(const SC::HttpClientRequest& request) |
| 201 | { |
no test coverage detected