1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "http_client_network_message.h"
17
18 namespace OHOS::NetStack {
19 namespace {
20 #if HAS_NETMANAGER_BASE
21 constexpr const size_t RESPONSE_BODY_MAX_SIZE = 64 * 1024;
22 #endif
23 }
24
25 #if HAS_NETMANAGER_BASE
HttpClientNetworkMessage(std::string requestId,HttpClient::HttpClientRequest & request,HttpClient::HttpClientResponse & response,CURL * handle)26 HttpClientNetworkMessage::HttpClientNetworkMessage(std::string requestId, HttpClient::HttpClientRequest &request,
27 HttpClient::HttpClientResponse &response, CURL *handle)
28 : INetworkMessage(std::move(requestId)),
29 handle_(handle),
30 request_(request),
31 response_(response) {}
32 #endif
33
34 HttpClientNetworkMessage::~HttpClientNetworkMessage() = default;
35
Parse()36 DfxMessage HttpClientNetworkMessage::Parse()
37 {
38 DfxMessage msg{};
39 #if HAS_NETMANAGER_BASE
40 GetTimeInfoFromCurlHandle(timeInfo_, handle_);
41 msg.requestBeginTime_ = requestBeginTime_;
42 msg.dnsEndTime_ = msg.requestBeginTime_ + static_cast<uint64_t>(timeInfo_.dnsTime);
43 msg.tcpConnectEndTime_ =
44 msg.dnsEndTime_ + static_cast<uint64_t>(std::max(0.0, timeInfo_.tcpConnectTime - timeInfo_.dnsTime));
45 msg.tlsHandshakeEndTime_ = msg.tcpConnectEndTime_ +
46 static_cast<uint64_t>(std::max(0.0, timeInfo_.tlsHandshakeTime -
47 timeInfo_.tcpConnectTime));
48 msg.firstSendTime_ = msg.tlsHandshakeEndTime_ +
49 static_cast<uint64_t>(std::max(0.0, timeInfo_.firstSendTime -
50 std::max({timeInfo_.dnsTime,
51 timeInfo_.tcpConnectTime,
52 timeInfo_.tlsHandshakeTime})));
53 msg.firstRecvTime_ = msg.firstSendTime_ +
54 static_cast<uint64_t>(std::max(0.0, timeInfo_.firstRecvTime - timeInfo_.firstSendTime));
55 msg.requestEndTime_ = msg.firstRecvTime_ + static_cast<uint64_t>(timeInfo_.totalTime - timeInfo_.firstRecvTime);
56 msg.requestId_ = requestId_;
57 msg.requestUrl_ = request_.GetURL();
58 msg.requestMethod_ = request_.GetMethod();
59 msg.requestHeader_ = GetRawHeader(request_.GetHeaders());
60 msg.responseStatusCode_ = response_.GetResponseCode();
61 msg.responseHeader_ = response_.GetHeader();
62 msg.responseReasonPhrase_ = GetReasonParse(response_.GetHeader());
63 if (response_.GetResult().size() > RESPONSE_BODY_MAX_SIZE) {
64 msg.responseBody_ = response_.GetResult().substr(0, RESPONSE_BODY_MAX_SIZE);
65 } else {
66 msg.responseBody_ = response_.GetResult();
67 }
68 GetIpAddressFromCurlHandle(msg.responseIpAddress_, handle_);
69 GetEffectiveUrlFromCurlHandle(msg.responseEffectiveUrl_, handle_);
70 GetHttpVersionFromCurlHandle(msg.responseHttpVersion_, handle_);
71 #endif
72 return msg;
73 }
74 }