Lines Matching full:client
42 static void print_http_frames(struct http_client_ctx *client) in print_http_frames() argument
56 struct http2_frame *frame = &client->current_frame; in print_http_frames()
68 struct http_client_ctx *client, uint32_t stream_id) in find_http_stream_context() argument
70 ARRAY_FOR_EACH(client->streams, i) { in find_http_stream_context()
71 if (client->streams[i].stream_id == stream_id) { in find_http_stream_context()
72 return &client->streams[i]; in find_http_stream_context()
80 struct http_client_ctx *client, uint32_t stream_id) in allocate_http_stream_context() argument
82 ARRAY_FOR_EACH(client->streams, i) { in allocate_http_stream_context()
83 if (client->streams[i].stream_state == HTTP2_STREAM_IDLE) { in allocate_http_stream_context()
84 client->streams[i].stream_id = stream_id; in allocate_http_stream_context()
85 client->streams[i].stream_state = HTTP2_STREAM_OPEN; in allocate_http_stream_context()
86 client->streams[i].window_size = in allocate_http_stream_context()
88 client->streams[i].headers_sent = false; in allocate_http_stream_context()
89 client->streams[i].end_stream_sent = false; in allocate_http_stream_context()
90 return &client->streams[i]; in allocate_http_stream_context()
97 static void release_http_stream_context(struct http_client_ctx *client, in release_http_stream_context() argument
100 ARRAY_FOR_EACH(client->streams, i) { in release_http_stream_context()
101 if (client->streams[i].stream_id == stream_id) { in release_http_stream_context()
102 client->streams[i].stream_id = 0; in release_http_stream_context()
103 client->streams[i].stream_state = HTTP2_STREAM_IDLE; in release_http_stream_context()
104 client->streams[i].current_detail = NULL; in release_http_stream_context()
110 static int add_header_field(struct http_client_ctx *client, uint8_t **buf, in add_header_field() argument
115 client->header_field.name = name; in add_header_field()
116 client->header_field.name_len = strlen(name); in add_header_field()
117 client->header_field.value = value; in add_header_field()
118 client->header_field.value_len = strlen(value); in add_header_field()
120 ret = http_hpack_encode_header(*buf, *buflen, &client->header_field); in add_header_field()
142 static int send_headers_frame(struct http_client_ctx *client, enum http_status status, in send_headers_frame() argument
161 ret = add_header_field(client, &buf, &buflen, ":status", status_str); in send_headers_frame()
177 ret = add_header_field(client, &buf, &buflen, hdr->name, hdr->value); in send_headers_frame()
184 ret = add_header_field(client, &buf, &buflen, "content-encoding", in send_headers_frame()
192 ret = add_header_field(client, &buf, &buflen, "content-type", in send_headers_frame()
205 ret = http_server_sendall(client, headers_frame, in send_headers_frame()
212 client->current_stream->headers_sent = true; in send_headers_frame()
217 static int send_data_frame(struct http_client_ctx *client, const char *payload, in send_data_frame() argument
228 ret = http_server_sendall(client, frame_header, sizeof(frame_header)); in send_data_frame()
233 ret = http_server_sendall(client, payload, length); in send_data_frame()
243 int send_settings_frame(struct http_client_ctx *client, bool ack) in send_settings_frame() argument
277 ret = http_server_sendall(client, settings_frame, len); in send_settings_frame()
286 int send_window_update_frame(struct http_client_ctx *client, in send_window_update_frame() argument
300 window_update = HTTP_SERVER_INITIAL_WINDOW_SIZE - client->window_size; in send_window_update_frame()
301 client->window_size = HTTP_SERVER_INITIAL_WINDOW_SIZE; in send_window_update_frame()
311 ret = http_server_sendall(client, window_update_frame, in send_window_update_frame()
321 static int send_http2_404(struct http_client_ctx *client, in send_http2_404() argument
326 ret = send_headers_frame(client, HTTP_404_NOT_FOUND, frame->stream_identifier, NULL, 0, in send_http2_404()
333 ret = send_data_frame(client, content_404, sizeof(content_404), in send_http2_404()
343 static int send_http2_405(struct http_client_ctx *client, in send_http2_405() argument
348 ret = send_headers_frame(client, HTTP_405_METHOD_NOT_ALLOWED, in send_http2_405()
359 static int send_http2_409(struct http_client_ctx *client, in send_http2_409() argument
364 ret = send_headers_frame(client, HTTP_409_CONFLICT, frame->stream_identifier, NULL, in send_http2_409()
373 static void send_http2_500(struct http_client_ctx *client, in send_http2_500() argument
402 if (send_headers_frame(client, HTTP_500_INTERNAL_SERVER_ERROR, in send_http2_500()
409 (void)send_data_frame(client, http_response, strlen(http_response), in send_http2_500()
415 struct http2_frame *frame, struct http_client_ctx *client) in handle_http2_static_resource() argument
421 if (client->method != HTTP_GET) { in handle_http2_static_resource()
422 return send_http2_405(client, frame); in handle_http2_static_resource()
425 if (client->current_stream == NULL) { in handle_http2_static_resource()
432 ret = send_headers_frame(client, HTTP_200_OK, frame->stream_identifier, in handle_http2_static_resource()
439 ret = send_data_frame(client, content_200, content_len, in handle_http2_static_resource()
447 client->current_stream->end_stream_sent = true; in handle_http2_static_resource()
456 struct http_client_ctx *client) in handle_http2_static_fs_resource() argument
474 if (client->method != HTTP_GET) { in handle_http2_static_fs_resource()
475 return send_http2_405(client, frame); in handle_http2_static_fs_resource()
478 if (client->current_stream == NULL) { in handle_http2_static_fs_resource()
483 len = strlen(client->url_buffer); in handle_http2_static_fs_resource()
488 http_server_get_content_type_from_extension(client->url_buffer, content_type, in handle_http2_static_fs_resource()
491 client->url_buffer); in handle_http2_static_fs_resource()
496 ret = http_server_find_file(fname, sizeof(fname), &client->data_len, in handle_http2_static_fs_resource()
497 client->supported_compression, &chosen_compression); in handle_http2_static_fs_resource()
499 ret = http_server_find_file(fname, sizeof(fname), &client->data_len, 0, NULL); in handle_http2_static_fs_resource()
504 ret = send_headers_frame(client, HTTP_404_NOT_FOUND, frame->stream_identifier, NULL, in handle_http2_static_fs_resource()
524 ret = send_headers_frame(client, HTTP_200_OK, frame->stream_identifier, &res_detail, 0, in handle_http2_static_fs_resource()
532 remaining = client->data_len; in handle_http2_static_fs_resource()
541 ret = send_data_frame(client, tmp, len, frame->stream_identifier, in handle_http2_static_fs_resource()
549 client->current_stream->end_stream_sent = true; in handle_http2_static_fs_resource()
559 static int http2_dynamic_response(struct http_client_ctx *client, struct http2_frame *frame, in http2_dynamic_response() argument
567 if (client->current_stream->headers_sent && (rsp->header_count > 0 || rsp->status != 0)) { in http2_dynamic_response()
572 if (!client->current_stream->headers_sent) { in http2_dynamic_response()
591 client->current_stream->end_stream_sent = true; in http2_dynamic_response()
594 ret = send_headers_frame(client, rsp->status, frame->stream_identifier, in http2_dynamic_response()
606 client->current_stream->end_stream_sent = true; in http2_dynamic_response()
609 ret = send_data_frame(client, rsp->body, rsp->body_len, frame->stream_identifier, in http2_dynamic_response()
620 struct http_client_ctx *client) in dynamic_get_del_req_v2() argument
624 struct http2_frame *frame = &client->current_frame; in dynamic_get_del_req_v2()
629 if (client->current_stream == NULL) { in dynamic_get_del_req_v2()
634 ptr = &client->url_buffer[dynamic_detail->common.path_len]; in dynamic_get_del_req_v2()
640 populate_request_ctx(&request_ctx, ptr, len, &client->header_capture_ctx); in dynamic_get_del_req_v2()
642 ret = dynamic_detail->cb(client, status, &request_ctx, &response_ctx, in dynamic_get_del_req_v2()
648 ret = http2_dynamic_response(client, frame, &response_ctx, status, dynamic_detail); in dynamic_get_del_req_v2()
657 if (!client->current_stream->end_stream_sent) { in dynamic_get_del_req_v2()
658 client->current_stream->end_stream_sent = true; in dynamic_get_del_req_v2()
659 ret = send_data_frame(client, NULL, 0, frame->stream_identifier, in dynamic_get_del_req_v2()
672 struct http_client_ctx *client, bool headers_only) in dynamic_post_put_req_v2() argument
675 char *ptr = client->cursor; in dynamic_post_put_req_v2()
678 struct http2_frame *frame = &client->current_frame; in dynamic_post_put_req_v2()
682 headers_only ? &client->header_capture_ctx : NULL; in dynamic_post_put_req_v2()
688 if (client->current_stream == NULL) { in dynamic_post_put_req_v2()
695 data_len = MIN(frame->length, client->data_len); in dynamic_post_put_req_v2()
697 client->cursor += data_len; in dynamic_post_put_req_v2()
698 client->data_len -= data_len; in dynamic_post_put_req_v2()
711 ret = dynamic_detail->cb(client, status, &request_ctx, &response_ctx, in dynamic_post_put_req_v2()
721 ret = http2_dynamic_response(client, frame, &response_ctx, status, dynamic_detail); in dynamic_post_put_req_v2()
732 ret = dynamic_detail->cb(client, status, &request_ctx, &response_ctx, in dynamic_post_put_req_v2()
738 ret = http2_dynamic_response(client, frame, &response_ctx, status, dynamic_detail); in dynamic_post_put_req_v2()
745 if (frame->length == 0 && !client->current_stream->end_stream_sent && in dynamic_post_put_req_v2()
747 if (client->current_stream->headers_sent) { in dynamic_post_put_req_v2()
748 ret = send_data_frame(client, NULL, 0, frame->stream_identifier, in dynamic_post_put_req_v2()
753 ret = http2_dynamic_response(client, frame, &response_ctx, in dynamic_post_put_req_v2()
761 client->current_stream->end_stream_sent = true; in dynamic_post_put_req_v2()
770 struct http2_frame *frame, struct http_client_ctx *client) in handle_http2_dynamic_resource() argument
781 if (!(BIT(client->method) & user_method)) { in handle_http2_dynamic_resource()
782 return send_http2_405(client, frame); in handle_http2_dynamic_resource()
785 if (dynamic_detail->holder != NULL && dynamic_detail->holder != client) { in handle_http2_dynamic_resource()
786 ret = send_http2_409(client, frame); in handle_http2_dynamic_resource()
791 return enter_http_done_state(client); in handle_http2_dynamic_resource()
794 dynamic_detail->holder = client; in handle_http2_dynamic_resource()
796 switch (client->method) { in handle_http2_dynamic_resource()
799 if (user_method & BIT(client->method)) { in handle_http2_dynamic_resource()
800 return dynamic_get_del_req_v2(dynamic_detail, client); in handle_http2_dynamic_resource()
811 if (user_method & BIT(client->method)) { in handle_http2_dynamic_resource()
812 client->current_stream->current_detail = in handle_http2_dynamic_resource()
820 ret = dynamic_post_put_req_v2(dynamic_detail, client, true); in handle_http2_dynamic_resource()
833 http_method_str(client->method), in handle_http2_dynamic_resource()
834 client->method); in handle_http2_dynamic_resource()
842 int enter_http2_request(struct http_client_ctx *client) in enter_http2_request() argument
846 client->server_state = HTTP_SERVER_FRAME_HEADER_STATE; in enter_http2_request()
847 client->data_len -= sizeof(HTTP2_PREFACE) - 1; in enter_http2_request()
848 client->cursor += sizeof(HTTP2_PREFACE) - 1; in enter_http2_request()
850 /* HTTP/2 client preface received, send server preface in enter_http2_request()
853 if (!client->preface_sent) { in enter_http2_request()
854 ret = send_settings_frame(client, false); in enter_http2_request()
859 client->preface_sent = true; in enter_http2_request()
865 static int enter_http_frame_settings_state(struct http_client_ctx *client) in enter_http_frame_settings_state() argument
867 client->server_state = HTTP_SERVER_FRAME_SETTINGS_STATE; in enter_http_frame_settings_state()
872 static int enter_http_frame_data_state(struct http_client_ctx *client) in enter_http_frame_data_state() argument
874 struct http2_frame *frame = &client->current_frame; in enter_http_frame_data_state()
882 stream = find_http_stream_context(client, frame->stream_identifier); in enter_http_frame_data_state()
897 client->window_size -= frame->length; in enter_http_frame_data_state()
898 client->server_state = HTTP_SERVER_FRAME_DATA_STATE; in enter_http_frame_data_state()
899 client->current_stream = stream; in enter_http_frame_data_state()
904 static int enter_http_frame_headers_state(struct http_client_ctx *client) in enter_http_frame_headers_state() argument
906 struct http2_frame *frame = &client->current_frame; in enter_http_frame_headers_state()
909 stream = find_http_stream_context(client, frame->stream_identifier); in enter_http_frame_headers_state()
913 stream = allocate_http_stream_context(client, frame->stream_identifier); in enter_http_frame_headers_state()
921 client->current_stream = stream; in enter_http_frame_headers_state()
924 client->expect_continuation = true; in enter_http_frame_headers_state()
926 client->expect_continuation = false; in enter_http_frame_headers_state()
931 client->header_capture_ctx.count = 0; in enter_http_frame_headers_state()
932 client->header_capture_ctx.cursor = 0; in enter_http_frame_headers_state()
933 client->header_capture_ctx.status = HTTP_HEADER_STATUS_OK; in enter_http_frame_headers_state()
934 client->header_capture_ctx.current_stream = stream; in enter_http_frame_headers_state()
937 client->server_state = HTTP_SERVER_FRAME_HEADERS_STATE; in enter_http_frame_headers_state()
942 static int enter_http_frame_continuation_state(struct http_client_ctx *client) in enter_http_frame_continuation_state() argument
944 struct http2_frame *frame = &client->current_frame; in enter_http_frame_continuation_state()
947 client->expect_continuation = true; in enter_http_frame_continuation_state()
949 client->expect_continuation = false; in enter_http_frame_continuation_state()
952 client->server_state = HTTP_SERVER_FRAME_CONTINUATION_STATE; in enter_http_frame_continuation_state()
957 static int enter_http_frame_window_update_state(struct http_client_ctx *client) in enter_http_frame_window_update_state() argument
959 client->server_state = HTTP_SERVER_FRAME_WINDOW_UPDATE_STATE; in enter_http_frame_window_update_state()
964 static int enter_http_frame_priority_state(struct http_client_ctx *client) in enter_http_frame_priority_state() argument
966 client->server_state = HTTP_SERVER_FRAME_PRIORITY_STATE; in enter_http_frame_priority_state()
971 static int enter_http_frame_rst_stream_state(struct http_client_ctx *client) in enter_http_frame_rst_stream_state() argument
973 client->server_state = HTTP_SERVER_FRAME_RST_STREAM_STATE; in enter_http_frame_rst_stream_state()
978 static int enter_http_frame_goaway_state(struct http_client_ctx *client) in enter_http_frame_goaway_state() argument
980 client->server_state = HTTP_SERVER_FRAME_GOAWAY_STATE; in enter_http_frame_goaway_state()
985 int handle_http_frame_header(struct http_client_ctx *client) in handle_http_frame_header() argument
991 ret = parse_http_frame_header(client, client->cursor, client->data_len); in handle_http_frame_header()
996 client->cursor += HTTP2_FRAME_HEADER_SIZE; in handle_http_frame_header()
997 client->data_len -= HTTP2_FRAME_HEADER_SIZE; in handle_http_frame_header()
999 print_http_frames(client); in handle_http_frame_header()
1001 if (client->expect_continuation && in handle_http_frame_header()
1002 client->current_frame.type != HTTP2_CONTINUATION_FRAME) { in handle_http_frame_header()
1007 client->current_stream = NULL; in handle_http_frame_header()
1009 switch (client->current_frame.type) { in handle_http_frame_header()
1011 return enter_http_frame_data_state(client); in handle_http_frame_header()
1013 return enter_http_frame_headers_state(client); in handle_http_frame_header()
1015 return enter_http_frame_continuation_state(client); in handle_http_frame_header()
1017 return enter_http_frame_settings_state(client); in handle_http_frame_header()
1019 return enter_http_frame_window_update_state(client); in handle_http_frame_header()
1021 return enter_http_frame_rst_stream_state(client); in handle_http_frame_header()
1023 return enter_http_frame_goaway_state(client); in handle_http_frame_header()
1025 return enter_http_frame_priority_state(client); in handle_http_frame_header()
1027 return enter_http_done_state(client); in handle_http_frame_header()
1036 int handle_http1_to_http2_upgrade(struct http_client_ctx *client) in handle_http1_to_http2_upgrade() argument
1043 struct http2_frame *frame = &client->current_frame; in handle_http1_to_http2_upgrade()
1055 frame->length = client->http1_frag_data_len; in handle_http1_to_http2_upgrade()
1056 if (client->parser_state == HTTP1_MESSAGE_COMPLETE_STATE) { in handle_http1_to_http2_upgrade()
1063 stream = find_http_stream_context(client, frame->stream_identifier); in handle_http1_to_http2_upgrade()
1065 stream = allocate_http_stream_context(client, frame->stream_identifier); in handle_http1_to_http2_upgrade()
1072 client->current_stream = stream; in handle_http1_to_http2_upgrade()
1074 if (!client->preface_sent) { in handle_http1_to_http2_upgrade()
1075 ret = http_server_sendall(client, switching_protocols, in handle_http1_to_http2_upgrade()
1081 client->http1_headers_sent = true; in handle_http1_to_http2_upgrade()
1086 ret = send_settings_frame(client, false); in handle_http1_to_http2_upgrade()
1091 client->preface_sent = true; in handle_http1_to_http2_upgrade()
1094 detail = get_resource_detail(client->service, client->url_buffer, &path_len, false); in handle_http1_to_http2_upgrade()
1101 frame, client); in handle_http1_to_http2_upgrade()
1108 (struct http_resource_detail_static_fs *)detail, frame, client); in handle_http1_to_http2_upgrade()
1116 frame, client); in handle_http1_to_http2_upgrade()
1121 if (client->method == HTTP_POST || in handle_http1_to_http2_upgrade()
1122 client->method == HTTP_PUT || in handle_http1_to_http2_upgrade()
1123 client->method == HTTP_PATCH) { in handle_http1_to_http2_upgrade()
1125 (struct http_resource_detail_dynamic *)detail, client, in handle_http1_to_http2_upgrade()
1134 ret = send_http2_404(client, frame); in handle_http1_to_http2_upgrade()
1143 if (client->parser_state == HTTP1_MESSAGE_COMPLETE_STATE) { in handle_http1_to_http2_upgrade()
1144 release_http_stream_context(client, frame->stream_identifier); in handle_http1_to_http2_upgrade()
1145 client->current_detail = NULL; in handle_http1_to_http2_upgrade()
1146 client->server_state = HTTP_SERVER_PREFACE_STATE; in handle_http1_to_http2_upgrade()
1147 client->cursor += client->data_len; in handle_http1_to_http2_upgrade()
1148 client->data_len = 0; in handle_http1_to_http2_upgrade()
1154 if (ret != -EAGAIN && client->current_stream && in handle_http1_to_http2_upgrade()
1155 !client->current_stream->headers_sent) { in handle_http1_to_http2_upgrade()
1156 send_http2_500(client, frame, -ret); in handle_http1_to_http2_upgrade()
1162 static int parse_http_frame_padded_field(struct http_client_ctx *client) in parse_http_frame_padded_field() argument
1164 struct http2_frame *frame = &client->current_frame; in parse_http_frame_padded_field()
1166 if (client->data_len == 0) { in parse_http_frame_padded_field()
1170 frame->padding_len = *client->cursor; in parse_http_frame_padded_field()
1171 client->cursor++; in parse_http_frame_padded_field()
1172 client->data_len--; in parse_http_frame_padded_field()
1193 static int parse_http_frame_priority_field(struct http_client_ctx *client) in parse_http_frame_priority_field() argument
1195 struct http2_frame *frame = &client->current_frame; in parse_http_frame_priority_field()
1197 if (client->data_len < HTTP2_HEADERS_FRAME_PRIORITY_LEN) { in parse_http_frame_priority_field()
1204 client->cursor += HTTP2_HEADERS_FRAME_PRIORITY_LEN; in parse_http_frame_priority_field()
1205 client->data_len -= HTTP2_HEADERS_FRAME_PRIORITY_LEN; in parse_http_frame_priority_field()
1216 int handle_http_frame_data(struct http_client_ctx *client) in handle_http_frame_data() argument
1218 struct http2_frame *frame = &client->current_frame; in handle_http_frame_data()
1223 if (client->current_stream->current_detail == NULL) { in handle_http_frame_data()
1226 (void)send_http2_404(client, frame); in handle_http_frame_data()
1232 ret = parse_http_frame_padded_field(client); in handle_http_frame_data()
1239 (struct http_resource_detail_dynamic *)client->current_stream->current_detail, in handle_http_frame_data()
1240 client, false); in handle_http_frame_data()
1242 ret = send_http2_404(client, frame); in handle_http_frame_data()
1251 find_http_stream_context(client, frame->stream_identifier); in handle_http_frame_data()
1260 ret = send_window_update_frame(client, stream); in handle_http_frame_data()
1265 ret = send_window_update_frame(client, NULL); in handle_http_frame_data()
1271 client->current_stream->current_detail = NULL; in handle_http_frame_data()
1272 release_http_stream_context(client, frame->stream_identifier); in handle_http_frame_data()
1277 client->server_state = HTTP_SERVER_FRAME_PADDING_STATE; in handle_http_frame_data()
1279 client->server_state = HTTP_SERVER_FRAME_HEADER_STATE; in handle_http_frame_data()
1286 if (ret != -EAGAIN && client->current_stream && in handle_http_frame_data()
1287 !client->current_stream->headers_sent) { in handle_http_frame_data()
1288 send_http2_500(client, frame, -ret); in handle_http_frame_data()
1341 static int process_header(struct http_client_ctx *client, in process_header() argument
1345 check_user_request_headers_http2(&client->header_capture_ctx, header); in process_header()
1360 client->method = supported_methods[i]; in process_header()
1369 if (header->value_len > sizeof(client->url_buffer) - 1) { in process_header()
1374 memcpy(client->url_buffer, header->value, header->value_len); in process_header()
1375 client->url_buffer[header->value_len] = '\0'; in process_header()
1378 if (header->value_len > sizeof(client->content_type) - 1) { in process_header()
1383 memcpy(client->content_type, header->value, header->value_len); in process_header()
1384 client->content_type[header->value_len] = '\0'; in process_header()
1399 client->content_len = (size_t)len; in process_header()
1405 &client->supported_compression); in process_header()
1417 static int handle_incomplete_http_header(struct http_client_ctx *client) in handle_incomplete_http_header() argument
1419 struct http2_frame *frame = &client->current_frame; in handle_incomplete_http_header()
1423 if (client->data_len < frame->length) { in handle_incomplete_http_header()
1428 if (!client->expect_continuation) { in handle_incomplete_http_header()
1445 extra_len = client->data_len - frame->length; in handle_incomplete_http_header()
1446 ret = parse_http_frame_header(client, client->cursor + prev_frame_len, in handle_incomplete_http_header()
1458 print_http_frames(client); in handle_incomplete_http_header()
1463 client->data_len -= HTTP2_FRAME_HEADER_SIZE; in handle_incomplete_http_header()
1465 memmove(client->cursor + prev_frame_len, in handle_incomplete_http_header()
1466 client->cursor + prev_frame_len + HTTP2_FRAME_HEADER_SIZE, in handle_incomplete_http_header()
1469 return enter_http_frame_continuation_state(client); in handle_incomplete_http_header()
1472 static int handle_http_frame_headers_end_stream(struct http_client_ctx *client) in handle_http_frame_headers_end_stream() argument
1474 struct http2_frame *frame = &client->current_frame; in handle_http_frame_headers_end_stream()
1479 if (client->current_stream == NULL) { in handle_http_frame_headers_end_stream()
1483 if (client->current_stream->current_detail == NULL) { in handle_http_frame_headers_end_stream()
1487 if (client->current_stream->current_detail->type == HTTP_RESOURCE_TYPE_DYNAMIC) { in handle_http_frame_headers_end_stream()
1490 client->current_stream->current_detail; in handle_http_frame_headers_end_stream()
1495 ret = dynamic_detail->cb(client, HTTP_SERVER_DATA_FINAL, &request_ctx, in handle_http_frame_headers_end_stream()
1505 ret = http2_dynamic_response(client, frame, &response_ctx, HTTP_SERVER_DATA_FINAL, in handle_http_frame_headers_end_stream()
1514 if (!client->current_stream->headers_sent) { in handle_http_frame_headers_end_stream()
1515 ret = send_headers_frame(client, HTTP_200_OK, frame->stream_identifier, in handle_http_frame_headers_end_stream()
1516 client->current_stream->current_detail, in handle_http_frame_headers_end_stream()
1522 } else if (!client->current_stream->end_stream_sent) { in handle_http_frame_headers_end_stream()
1523 ret = send_data_frame(client, NULL, 0, frame->stream_identifier, in handle_http_frame_headers_end_stream()
1530 client->current_stream->current_detail = NULL; in handle_http_frame_headers_end_stream()
1533 release_http_stream_context(client, frame->stream_identifier); in handle_http_frame_headers_end_stream()
1538 int handle_http_frame_headers(struct http_client_ctx *client) in handle_http_frame_headers() argument
1540 struct http2_frame *frame = &client->current_frame; in handle_http_frame_headers()
1547 ret = parse_http_frame_padded_field(client); in handle_http_frame_headers()
1554 ret = parse_http_frame_priority_field(client); in handle_http_frame_headers()
1561 struct http_hpack_header_buf *header = &client->header_field; in handle_http_frame_headers()
1562 size_t datalen = MIN(client->data_len, frame->length); in handle_http_frame_headers()
1564 ret = http_hpack_decode_header(client->cursor, datalen, header); in handle_http_frame_headers()
1567 ret = handle_incomplete_http_header(client); in handle_http_frame_headers()
1586 client->cursor += ret; in handle_http_frame_headers()
1587 client->data_len -= ret; in handle_http_frame_headers()
1592 ret = process_header(client, header); in handle_http_frame_headers()
1598 if (client->expect_continuation) { in handle_http_frame_headers()
1600 client->server_state = HTTP_SERVER_FRAME_HEADER_STATE; in handle_http_frame_headers()
1604 detail = get_resource_detail(client->service, client->url_buffer, &path_len, false); in handle_http_frame_headers()
1611 frame, client); in handle_http_frame_headers()
1618 (struct http_resource_detail_static_fs *)detail, frame, client); in handle_http_frame_headers()
1626 frame, client); in handle_http_frame_headers()
1633 ret = send_http2_404(client, frame); in handle_http_frame_headers()
1640 ret = handle_http_frame_headers_end_stream(client); in handle_http_frame_headers()
1647 client->server_state = HTTP_SERVER_FRAME_PADDING_STATE; in handle_http_frame_headers()
1649 client->server_state = HTTP_SERVER_FRAME_HEADER_STATE; in handle_http_frame_headers()
1655 if (ret != -EAGAIN && client->current_stream && in handle_http_frame_headers()
1656 !client->current_stream->headers_sent) { in handle_http_frame_headers()
1657 send_http2_500(client, frame, -ret); in handle_http_frame_headers()
1663 int handle_http_frame_priority(struct http_client_ctx *client) in handle_http_frame_priority() argument
1665 struct http2_frame *frame = &client->current_frame; in handle_http_frame_priority()
1673 if (client->data_len < frame->length) { in handle_http_frame_priority()
1680 client->data_len -= HTTP2_PRIORITY_FRAME_LEN; in handle_http_frame_priority()
1681 client->cursor += HTTP2_PRIORITY_FRAME_LEN; in handle_http_frame_priority()
1683 client->server_state = HTTP_SERVER_FRAME_HEADER_STATE; in handle_http_frame_priority()
1688 int handle_http_frame_rst_stream(struct http_client_ctx *client) in handle_http_frame_rst_stream() argument
1690 struct http2_frame *frame = &client->current_frame; in handle_http_frame_rst_stream()
1700 if (client->data_len < frame->length) { in handle_http_frame_rst_stream()
1708 stream_ctx = find_http_stream_context(client, frame->stream_identifier); in handle_http_frame_rst_stream()
1713 error_code = sys_get_be32(client->cursor); in handle_http_frame_rst_stream()
1718 release_http_stream_context(client, stream_ctx->stream_id); in handle_http_frame_rst_stream()
1720 client->data_len -= HTTP2_RST_STREAM_FRAME_LEN; in handle_http_frame_rst_stream()
1721 client->cursor += HTTP2_RST_STREAM_FRAME_LEN; in handle_http_frame_rst_stream()
1723 client->server_state = HTTP_SERVER_FRAME_HEADER_STATE; in handle_http_frame_rst_stream()
1728 int handle_http_frame_settings(struct http_client_ctx *client) in handle_http_frame_settings() argument
1730 struct http2_frame *frame = &client->current_frame; in handle_http_frame_settings()
1735 if (client->data_len < frame->length) { in handle_http_frame_settings()
1739 bytes_consumed = client->current_frame.length; in handle_http_frame_settings()
1740 client->data_len -= bytes_consumed; in handle_http_frame_settings()
1741 client->cursor += bytes_consumed; in handle_http_frame_settings()
1746 ret = send_settings_frame(client, true); in handle_http_frame_settings()
1753 client->server_state = HTTP_SERVER_FRAME_HEADER_STATE; in handle_http_frame_settings()
1758 int handle_http_frame_goaway(struct http_client_ctx *client) in handle_http_frame_goaway() argument
1760 struct http2_frame *frame = &client->current_frame; in handle_http_frame_goaway()
1765 if (client->data_len < frame->length) { in handle_http_frame_goaway()
1769 bytes_consumed = client->current_frame.length; in handle_http_frame_goaway()
1770 client->data_len -= bytes_consumed; in handle_http_frame_goaway()
1771 client->cursor += bytes_consumed; in handle_http_frame_goaway()
1773 enter_http_done_state(client); in handle_http_frame_goaway()
1778 int handle_http_frame_window_update(struct http_client_ctx *client) in handle_http_frame_window_update() argument
1780 struct http2_frame *frame = &client->current_frame; in handle_http_frame_window_update()
1787 if (client->data_len < frame->length) { in handle_http_frame_window_update()
1791 bytes_consumed = client->current_frame.length; in handle_http_frame_window_update()
1792 client->data_len -= bytes_consumed; in handle_http_frame_window_update()
1793 client->cursor += bytes_consumed; in handle_http_frame_window_update()
1795 client->server_state = HTTP_SERVER_FRAME_HEADER_STATE; in handle_http_frame_window_update()
1800 int handle_http_frame_continuation(struct http_client_ctx *client) in handle_http_frame_continuation() argument
1803 client->server_state = HTTP_SERVER_FRAME_HEADERS_STATE; in handle_http_frame_continuation()
1808 int handle_http_frame_padding(struct http_client_ctx *client) in handle_http_frame_padding() argument
1810 struct http2_frame *frame = &client->current_frame; in handle_http_frame_padding()
1813 if (client->data_len == 0) { in handle_http_frame_padding()
1817 bytes_consumed = MIN(client->data_len, frame->padding_len); in handle_http_frame_padding()
1818 client->data_len -= bytes_consumed; in handle_http_frame_padding()
1819 client->cursor += bytes_consumed; in handle_http_frame_padding()
1823 client->server_state = HTTP_SERVER_FRAME_HEADER_STATE; in handle_http_frame_padding()
1857 int parse_http_frame_header(struct http_client_ctx *client, const uint8_t *buffer, in parse_http_frame_header() argument
1860 struct http2_frame *frame = &client->current_frame; in parse_http_frame_header()