2
3
6
7
11 return reinterpret_cast< restinio::impl::http_parser_ctx_t * >(
16
17
24 auto * ctx = get_http_parser_ctx( parser );
26 ctx->m_header.append_request_target( at, length );
28 if( ctx->m_header.request_target().length() >
29 ctx->m_limits.max_url_size() )
34 catch(
const std::exception & )
47 auto * ctx = get_http_parser_ctx( parser );
50 if( ctx->m_total_field_count == ctx->m_limits.max_field_count() )
55 if( ctx->m_current_field_name.size() + length >
56 ctx->m_limits.max_field_name_size() )
61 ctx->m_current_field_name.append( at, length );
63 catch(
const std::exception & )
76 auto * ctx = get_http_parser_ctx( parser );
78 auto & fields = ctx->m_leading_headers_completed
79 ? ctx->m_chunked_info_block.m_trailing_fields
86 std::move( ctx->m_current_field_name ),
90 ctx->m_total_field_count += 1u;
92 catch(
const std::exception & )
104 fields.append_last_field( value );
112 auto * ctx = get_http_parser_ctx( parser );
114 http_header_fields_t & fields = ctx->m_leading_headers_completed
115 ? ctx->m_chunked_info_block.m_trailing_fields
118 if( ctx->m_last_value_total_size + length >=
119 ctx->m_limits.max_field_value_size() )
124 ctx->m_last_value_total_size += length;
126 append_last_field_accessor( fields, std::string{ at, length } );
128 catch(
const std::exception & )
140 get_http_parser_ctx( parser )->m_last_value_total_size = 0;
147 auto * ctx = get_http_parser_ctx( parser );
150 ctx->m_leading_headers_completed =
true;
152 if( ULLONG_MAX != parser->content_length &&
153 0 < parser->content_length )
156 if( parser->content_length > ctx->m_limits.max_body_size() )
164 ::restinio::utils::impl::uint64_to_size_t(
165 parser->content_length) );
167 catch(
const std::exception & )
182 auto * ctx = get_http_parser_ctx( parser );
185 const auto total_length =
static_cast<std::uint64_t>(
186 ctx->m_body.size() ) + length;
187 if( total_length > ctx->m_limits.max_body_size() )
192 ctx->m_body.append( at, length );
194 catch(
const std::exception & )
211 if( 0u != parser->content_length )
213 auto * ctx = get_http_parser_ctx( parser );
219 ctx->m_chunked_info_block.m_chunks.emplace_back(
221 ::restinio::utils::impl::uint64_to_size_t(parser->content_length),
222 std::move( ctx->m_chunk_ext_params ) );
225 catch(
const std::exception & )
240template<
typename Http_Methods >
244 auto * ctx = get_http_parser_ctx( parser );
246 ctx->m_message_complete =
true;
247 ctx->m_header.method( Http_Methods::from_nodejs( parser->method ) );
249 if( 0 == llhttp_get_upgrade( parser ) )
251 ctx->m_header.should_keep_alive( 0 != llhttp_should_keep_alive( parser ) );
255 ctx->m_header.connection( http_connection_header_t::upgrade );
262
263
264
265
272 auto * ctx = get_http_parser_ctx( parser );
274 if( !ctx->m_chunk_ext_params )
276 ctx->m_chunk_ext_params = std::make_unique<chunk_ext_params_t>();
279 auto * ext_params = ctx->m_chunk_ext_params.get();
282 if( ext_params->size() == ctx->m_limits.max_field_count() )
287 if( ctx->m_current_field_name.size() + length >
288 ctx->m_limits.max_field_name_size() )
293 ctx->m_current_field_name.append( at, length );
295 catch(
const std::exception & )
308 auto * ctx = get_http_parser_ctx( parser );
309 auto * ext_params = ctx->m_chunk_ext_params.get();
311 ext_params->emplace_back(
312 chunk_ext_param_t{ std::move( ctx->m_current_field_name ), {} } );
314 catch(
const std::exception & )
327 auto * ctx = get_http_parser_ctx( parser );
328 auto & value_receiver_str =
329 ctx->m_chunk_ext_params->back().m_value;
331 if( value_receiver_str.size() + length >
332 ctx->m_limits.max_field_value_size() )
337 value_receiver_str.append( at, length );
339 catch(
const std::exception & )
restinio::impl::http_parser_ctx_t * get_http_parser_ctx(llhttp_t *parser)
A helper function to get the pointer to a context object.
int restinio_header_field_complete_cb(llhttp_t *parser)
int restinio_body_cb(llhttp_t *parser, const char *at, size_t length)
int restinio_url_cb(llhttp_t *parser, const char *at, size_t length)
int restinio_message_complete_cb(llhttp_t *parser)
int restinio_header_value_cb(llhttp_t *parser, const char *at, size_t length)
int restinio_chunk_extension_name_complete_cb(llhttp_t *parser)
int restinio_chunk_extension_name_cb(llhttp_t *parser, const char *at, size_t length)
int restinio_chunk_extension_value_cb(llhttp_t *parser, const char *at, size_t length)
int restinio_chunk_complete_cb(llhttp_t *)
void append_last_field_accessor(http_header_fields_t &fields, string_view_t value)
int restinio_chunk_header_cb(llhttp_t *parser)
int restinio_header_value_complete_cb(llhttp_t *parser)
int restinio_chunk_extension_value_complete_cb(llhttp_t *)
int restinio_headers_complete_cb(llhttp_t *parser)
int restinio_header_field_cb(llhttp_t *parser, const char *at, size_t length)