Lines Matching refs:client
41 static int send_http1_error_common(struct http_client_ctx *client, in send_http1_error_common() argument
46 ret = http_server_sendall(client, response, len); in send_http1_error_common()
52 client->http1_headers_sent = true; in send_http1_error_common()
57 static int send_http1_404(struct http_client_ctx *client) in send_http1_404() argument
59 return send_http1_error_common(client, not_found_response, in send_http1_404()
63 static int send_http1_405(struct http_client_ctx *client) in send_http1_405() argument
65 return send_http1_error_common(client, not_allowed_response, in send_http1_405()
69 static int send_http1_409(struct http_client_ctx *client) in send_http1_409() argument
71 return send_http1_error_common(client, conflict_response, in send_http1_409()
75 static void send_http1_500(struct http_client_ctx *client, int error_code) in send_http1_500() argument
117 (void)http_server_sendall(client, http_response, strlen(http_response)); in send_http1_500()
122 struct http_client_ctx *client) in handle_http1_static_resource() argument
139 if (client->method != HTTP_GET) { in handle_http1_static_resource()
140 return send_http1_405(client); in handle_http1_static_resource()
163 ret = http_server_sendall(client, http_response, strlen(http_response)); in handle_http1_static_resource()
168 client->http1_headers_sent = true; in handle_http1_static_resource()
170 ret = http_server_sendall(client, data, len); in handle_http1_static_resource()
193 ret = http_server_sendall(client, http_response, \
202 static int http1_send_headers(struct http_client_ctx *client, enum http_status status, in http1_send_headers() argument
224 ret = http_server_sendall(client, http_response, in http1_send_headers()
246 ret = http_server_sendall(client, http_response, in http1_send_headers()
253 ret = http_server_sendall(client, hdr->value, strlen(hdr->value)); in http1_send_headers()
259 ret = http_server_sendall(client, crlf, 2); in http1_send_headers()
277 ret = http_server_sendall(client, http_response, in http1_send_headers()
286 ret = http_server_sendall(client, crlf, 2); in http1_send_headers()
295 static int http1_dynamic_response(struct http_client_ctx *client, struct http_response_ctx *rsp, in http1_dynamic_response() argument
301 if (client->http1_headers_sent && (rsp->header_count > 0 || rsp->status != 0)) { in http1_dynamic_response()
306 if (!client->http1_headers_sent) { in http1_dynamic_response()
312 ret = http1_send_headers(client, rsp->status, rsp->headers, rsp->header_count, in http1_dynamic_response()
318 client->http1_headers_sent = true; in http1_dynamic_response()
324 ret = http_server_sendall(client, tmp, ret); in http1_dynamic_response()
329 ret = http_server_sendall(client, rsp->body, rsp->body_len); in http1_dynamic_response()
334 (void)http_server_sendall(client, crlf, 2); in http1_dynamic_response()
341 struct http_client_ctx *client) in dynamic_get_del_req() argument
350 ptr = &client->url_buffer[dynamic_detail->common.path_len]; in dynamic_get_del_req()
356 populate_request_ctx(&request_ctx, ptr, len, &client->header_capture_ctx); in dynamic_get_del_req()
358 ret = dynamic_detail->cb(client, status, &request_ctx, &response_ctx, in dynamic_get_del_req()
364 ret = http1_dynamic_response(client, &response_ctx, dynamic_detail); in dynamic_get_del_req()
375 ret = http_server_sendall(client, final_chunk, in dynamic_get_del_req()
385 struct http_client_ctx *client) in dynamic_post_put_req() argument
388 char *ptr = client->cursor; in dynamic_post_put_req()
397 if (client->parser_state == HTTP1_MESSAGE_COMPLETE_STATE) { in dynamic_post_put_req()
404 populate_request_ctx(&request_ctx, ptr, client->data_len, &client->header_capture_ctx); in dynamic_post_put_req()
406 ret = dynamic_detail->cb(client, status, &request_ctx, &response_ctx, in dynamic_post_put_req()
415 client->header_capture_ctx.status = HTTP_HEADER_STATUS_NONE; in dynamic_post_put_req()
421 ret = http1_dynamic_response(client, &response_ctx, dynamic_detail); in dynamic_post_put_req()
430 populate_request_ctx(&request_ctx, ptr, 0, &client->header_capture_ctx); in dynamic_post_put_req()
432 ret = dynamic_detail->cb(client, status, &request_ctx, &response_ctx, in dynamic_post_put_req()
438 ret = http1_dynamic_response(client, &response_ctx, dynamic_detail); in dynamic_post_put_req()
445 if (client->parser_state == HTTP1_MESSAGE_COMPLETE_STATE) { in dynamic_post_put_req()
446 if (!client->http1_headers_sent) { in dynamic_post_put_req()
449 ret = http1_dynamic_response(client, &response_ctx, dynamic_detail); in dynamic_post_put_req()
455 ret = http_server_sendall(client, final_chunk, in dynamic_post_put_req()
470 struct http_client_ctx *client) in handle_http1_static_fs_resource() argument
509 if (client->method != HTTP_GET) { in handle_http1_static_fs_resource()
510 return send_http1_405(client); in handle_http1_static_fs_resource()
514 len = strlen(client->url_buffer); in handle_http1_static_fs_resource()
519 http_server_get_content_type_from_extension(client->url_buffer, content_type, in handle_http1_static_fs_resource()
522 client->url_buffer); in handle_http1_static_fs_resource()
527 ret = http_server_find_file(fname, sizeof(fname), &file_size, client->supported_compression, in handle_http1_static_fs_resource()
534 return send_http1_404(client); in handle_http1_static_fs_resource()
557 ret = http_server_sendall(client, http_response, len); in handle_http1_static_fs_resource()
562 client->http1_headers_sent = true; in handle_http1_static_fs_resource()
573 ret = http_server_sendall(client, http_response, len); in handle_http1_static_fs_resource()
579 ret = http_server_sendall(client, "\r\n\r\n", 4); in handle_http1_static_fs_resource()
591 struct http_client_ctx *client) in handle_http1_dynamic_resource() argument
602 if (!(BIT(client->method) & user_method)) { in handle_http1_dynamic_resource()
603 return send_http1_405(client); in handle_http1_dynamic_resource()
606 if (dynamic_detail->holder != NULL && dynamic_detail->holder != client) { in handle_http1_dynamic_resource()
607 ret = send_http1_409(client); in handle_http1_dynamic_resource()
612 return enter_http_done_state(client); in handle_http1_dynamic_resource()
615 dynamic_detail->holder = client; in handle_http1_dynamic_resource()
617 switch (client->method) { in handle_http1_dynamic_resource()
626 client->http1_headers_sent = true; in handle_http1_dynamic_resource()
637 if (user_method & BIT(client->method)) { in handle_http1_dynamic_resource()
638 return dynamic_get_del_req(dynamic_detail, client); in handle_http1_dynamic_resource()
646 if (user_method & BIT(client->method)) { in handle_http1_dynamic_resource()
647 return dynamic_post_put_req(dynamic_detail, client); in handle_http1_dynamic_resource()
655 http_method_str(client->method), in handle_http1_dynamic_resource()
656 client->method); in handle_http1_dynamic_resource()
891 int enter_http1_request(struct http_client_ctx *client) in enter_http1_request() argument
893 client->server_state = HTTP_SERVER_REQUEST_STATE; in enter_http1_request()
895 http_parser_init(&client->parser, HTTP_REQUEST); in enter_http1_request()
896 http_parser_settings_init(&client->parser_settings); in enter_http1_request()
898 client->parser_settings.on_header_field = on_header_field; in enter_http1_request()
899 client->parser_settings.on_header_value = on_header_value; in enter_http1_request()
900 client->parser_settings.on_headers_complete = on_headers_complete; in enter_http1_request()
901 client->parser_settings.on_url = on_url; in enter_http1_request()
902 client->parser_settings.on_body = on_body; in enter_http1_request()
903 client->parser_settings.on_message_complete = on_message_complete; in enter_http1_request()
904 client->parser_state = HTTP1_INIT_HEADER_STATE; in enter_http1_request()
905 client->http1_headers_sent = false; in enter_http1_request()
908 client->header_capture_ctx.store_next_value = false; in enter_http1_request()
911 memset(client->header_buffer, 0, sizeof(client->header_buffer)); in enter_http1_request()
912 memset(client->url_buffer, 0, sizeof(client->url_buffer)); in enter_http1_request()
917 int handle_http1_request(struct http_client_ctx *client) in handle_http1_request() argument
921 bool skip_headers = (client->parser_state < HTTP1_RECEIVING_DATA_STATE); in handle_http1_request()
926 client->http1_frag_data_len = 0; in handle_http1_request()
928 parsed = http_parser_execute(&client->parser, &client->parser_settings, in handle_http1_request()
929 client->cursor, client->data_len); in handle_http1_request()
931 if (parsed > client->data_len) { in handle_http1_request()
937 if (client->parser.http_errno != HPE_OK) { in handle_http1_request()
938 LOG_ERR("HTTP/1 parsing error, %d", client->parser.http_errno); in handle_http1_request()
943 if (client->parser_state < HTTP1_RECEIVED_HEADER_STATE) { in handle_http1_request()
944 client->cursor += parsed; in handle_http1_request()
945 client->data_len -= parsed; in handle_http1_request()
950 client->method = client->parser.method; in handle_http1_request()
951 client->has_upgrade_header = client->parser.upgrade; in handle_http1_request()
954 LOG_DBG("Requested URL: %s", client->url_buffer); in handle_http1_request()
958 if (parsed < client->http1_frag_data_len) { in handle_http1_request()
963 frag_headers_len = parsed - client->http1_frag_data_len; in handle_http1_request()
966 client->cursor += frag_headers_len; in handle_http1_request()
967 client->data_len -= frag_headers_len; in handle_http1_request()
970 if (client->has_upgrade_header) { in handle_http1_request()
979 if (client->websocket_upgrade) { in handle_http1_request()
981 detail = get_resource_detail(client->service, client->url_buffer, in handle_http1_request()
988 client->current_detail = detail; in handle_http1_request()
990 ret = handle_http1_to_websocket_upgrade(client); in handle_http1_request()
1001 if (client->http2_upgrade) { in handle_http1_request()
1002 ret = handle_http1_to_http2_upgrade(client); in handle_http1_request()
1011 ret = http_server_sendall(client, upgrade_required, in handle_http1_request()
1018 client->http1_headers_sent = true; in handle_http1_request()
1020 ret = http_server_sendall(client, needed_upgrade, in handle_http1_request()
1027 ret = http_server_sendall(client, upgrade_msg, in handle_http1_request()
1035 detail = get_resource_detail(client->service, client->url_buffer, &path_len, false); in handle_http1_request()
1042 client); in handle_http1_request()
1049 (struct http_resource_detail_static_fs *)detail, client); in handle_http1_request()
1057 client); in handle_http1_request()
1064 ret = send_http1_404(client); in handle_http1_request()
1069 client->http1_headers_sent = true; in handle_http1_request()
1072 client->cursor += parsed; in handle_http1_request()
1073 client->data_len -= parsed; in handle_http1_request()
1075 if (client->parser_state == HTTP1_MESSAGE_COMPLETE_STATE) { in handle_http1_request()
1076 if ((client->parser.flags & F_CONNECTION_CLOSE) == 0) { in handle_http1_request()
1077 LOG_DBG("Waiting for another request, client %p", client); in handle_http1_request()
1078 client->server_state = HTTP_SERVER_PREFACE_STATE; in handle_http1_request()
1080 LOG_DBG("Connection closed, client %p", client); in handle_http1_request()
1081 enter_http_done_state(client); in handle_http1_request()
1093 if (ret != -EAGAIN && !client->http1_headers_sent) { in handle_http1_request()
1094 send_http1_500(client, -ret); in handle_http1_request()