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 }