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 <bits/alltypes.h>
17 #include <hilog/log.h>
18 #include "test_request.h"
19
20 #undef LOG_DOMAIN
21
22 #undef LOG_TAG
23
24 #define LOG_DOMAIN 0x0000
25
26 #define LOG_TAG "webtest"
27
28 namespace {
29 const int blockSize = 1024 * 8;
30 const int SUCCESS = 200;
31 const int NET_NOT_FOUND = 404;
32
ReadRawfileOnWorkerThread(void * userData)33 int ReadRawfileOnWorkerThread(void *userData) {
34 TestRequest* testRequest = (TestRequest *)userData;
35 if (testRequest) {
36 testRequest->ReadRawfileDataOnWorkerThread();
37 }
38 return 0;
39 }
40 }
41
TestRequest(const ArkWeb_ResourceRequest * resourceRequest,const ArkWeb_ResourceHandler * resourceHandler,const NativeResourceManager * resourceManager)42 TestRequest::TestRequest(const ArkWeb_ResourceRequest *resourceRequest, const ArkWeb_ResourceHandler *resourceHandler,
43 const NativeResourceManager *resourceManager)
44 : resourceRequest_(resourceRequest), resourceHandler_(resourceHandler), resourceManager_(resourceManager) {}
45
~TestRequest()46 TestRequest::~TestRequest() {}
47
ReadRawfileDataOnWorkerThread()48 void TestRequest::ReadRawfileDataOnWorkerThread()
49 {
50 RawFile *rawfile = OH_ResourceManager_OpenRawFile(resourceManager(), rawfilePath().c_str());
51 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetMethod rawfilePath_ %{public}s", rawfilePath().c_str());
52
53 setRspUrl_ = OH_ArkWebResponse_SetUrl(response(), "");
54 OH_LOG_INFO(LOG_APP, "OH_ArkWebResponse_SetUrl %{public}d", setRspUrl_);
55
56 setRspError_ = OH_ArkWebResponse_SetError(response(), ARKWEB_NET_OK);
57 OH_LOG_INFO(LOG_APP, "OH_ArkWebResponse_SetError %{public}d", setRspError_);
58
59 if (!rawfile) {
60 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetMethod rawfilePath_ 404");
61 setStatus_ = OH_ArkWebResponse_SetStatus(response(), NET_NOT_FOUND);
62 setStatusText_ = OH_ArkWebResponse_SetStatusText(response(), "not found");
63 }
64 else {
65 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetMethod rawfilePath_ 200");
66 setStatus_ = OH_ArkWebResponse_SetStatus(response(), SUCCESS);
67 setStatusText_ = OH_ArkWebResponse_SetStatusText(response(), "ok");
68 }
69 setMimeType_ = OH_ArkWebResponse_SetMimeType(response(), "text/javascript");
70 setCharset_ = OH_ArkWebResponse_SetCharset(response(), "UTF-8");
71 long len = OH_ResourceManager_GetRawFileSize(rawfile);
72
73 setHeaderByName_ = OH_ArkWebResponse_SetHeaderByName(response(), "content-length", std::to_string(len).c_str(), false);
74
75 OH_LOG_INFO(LOG_APP, "OH_ArkWebResponse_SetHeaderByName %{public}s", std::to_string(len).c_str());
76
77 // 返回响应头
78 int32_t ret = OH_ArkWebResourceHandler_DidReceiveResponse(resourceHandler(), response());
79 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceHandler_DidReceiveResponse %{public}d", ret);
80
81 // 下面要返回响应体
82 long consumed = 0;
83 uint8_t buffer[blockSize];
84 while (true) {
85 int ret = OH_ResourceManager_ReadRawFile(rawfile, buffer, blockSize);
86
87 OH_LOG_INFO(LOG_APP, "read rawfile %{public}d bytes.", ret);
88
89 if (ret == 0) {
90 break;
91 }
92 consumed += ret;
93 OH_ResourceManager_SeekRawFile(rawfile, consumed, 0);
94 int is_success = OH_ArkWebResourceHandler_DidReceiveData(resourceHandler(), buffer, ret);
95 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceHandler_DidReceiveData. %{public}d", is_success);
96
97 memset(buffer, 0, blockSize);
98 }
99 // 关闭资源。
100 OH_ResourceManager_CloseRawFile(rawfile);
101 OH_ArkWebResourceHandler_DidFinish(resourceHandler());
102
103 //
104 char *url;
105 OH_ArkWebResponse_GetUrl(response(), &url);
106 std::string rspUrl1(url);
107 rspUrl_ = rspUrl1;
108 OH_LOG_INFO(LOG_APP, "OH_ArkWebResponse_GetUrl %{public}d", *url);
109
110 int32_t netError1 = OH_ArkWebResponse_GetError(response());
111 rspNetError_ = netError1;
112 OH_LOG_INFO(LOG_APP, "OH_ArkWebResponse_GetError %{public}d", netError1);
113
114 int32_t Status = OH_ArkWebResponse_GetStatus(response());
115 rspStatus_ = Status;
116 OH_LOG_INFO(LOG_APP, "OH_ArkWebResponse_GetStatus %{public}d", Status);
117
118 char *statusText;
119 OH_ArkWebResponse_GetStatusText(response(), &statusText);
120 std::string rspStatusText1(statusText);
121 rspStatusText_ = rspStatusText1;
122 OH_LOG_INFO(LOG_APP, "OH_ArkWebResponse_GetStatusText %{public}d", *statusText);
123
124 char *mimeType;
125 OH_ArkWebResponse_GetMimeType(response(), &mimeType);
126 std::string rspMimeType1(mimeType);
127 rspMimeType_ = rspMimeType1;
128 OH_LOG_INFO(LOG_APP, "OH_ArkWebResponse_GetMimeType %{public}d", *mimeType);
129
130 char *charset;
131 OH_ArkWebResponse_GetCharset(response(), &charset);
132 std::string rspCharSet1(charset);
133 rspCharSet_ = rspCharSet1;
134 OH_LOG_INFO(LOG_APP, "OH_ArkWebResponse_GetCharset %{public}d", *charset);
135
136 char *host;
137 OH_ArkWebResponse_GetHeaderByName(response(), "Host", &host);
138 std::string rspHost1(host);
139 rspHost_ = rspHost1;
140 OH_LOG_INFO(LOG_APP, "OH_ArkWebResponse_GetHeaderByName %{public}d", *host);
141 }
142
Start()143 void TestRequest::Start()
144 {
145 char *url;
146 OH_ArkWebResourceRequest_GetUrl(resourceRequest_, &url);
147
148 std::string urlStr1(url);
149 url_ = urlStr1;
150
151 // 获取一个rawfile
152 std::string urlStr(url);
153 std::size_t position = urlStr.rfind('/');
154
155 if (position != std::string::npos) {
156 rawfilePath_ = urlStr.substr(position + 1);
157 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetMethod position != std::string::npos %{public}s", urlStr.c_str());
158 }
159
160 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetUrl %{public}x", *url);
161 OH_ArkWeb_ReleaseString(url);
162 OH_LOG_INFO(LOG_APP, "OH_ArkWeb_ReleaseString %{public}x", *url);
163
164 rspResourceType_ = OH_ArkWebResourceRequest_GetResourceType(resourceRequest_);
165 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetResourceType %{public}d", rspResourceType_);
166
167 char *frameUrl;
168 OH_ArkWebResourceRequest_GetFrameUrl(resourceRequest_, &frameUrl);
169 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetFrameUrl %{public}x", *frameUrl);
170 std::string frameUrl1(frameUrl);
171 rspFrameUrl_ = frameUrl1;
172
173
174 char *method;
175 OH_ArkWebResourceRequest_GetMethod(resourceRequest_, &method);
176 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetMethod %{public}x", *method);
177 std::string method1(method);
178 method_ = method1;
179
180 char *referrer;
181 OH_ArkWebResourceRequest_GetReferrer(resourceRequest_, &referrer);
182 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetReferrer %{public}x", *referrer);
183 std::string referrer1(referrer);
184 referrer_ = referrer1;
185
186 hasGesture_ = OH_ArkWebResourceRequest_HasGesture(resourceRequest_);
187 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_HasGesture %{public}d", hasGesture_);
188
189 isMainFrame_ = OH_ArkWebResourceRequest_IsMainFrame(resourceRequest_);
190 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_IsMainFrame %{public}d", isMainFrame_);
191
192 isRedirect_ = OH_ArkWebResourceRequest_IsRedirect(resourceRequest_);
193 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_IsRedirect %{public}d", isRedirect_);
194
195 ArkWeb_RequestHeaderList* headerList;
196
197 OH_ArkWebResourceRequest_GetRequestHeaders(resourceRequest_, &headerList);
198 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetRequestHeaders ");
199
200 int32_t headerListSize = OH_ArkWebRequestHeaderList_GetSize(headerList);
201 OH_LOG_INFO(LOG_APP, "OH_ArkWebRequestHeaderList_GetSize %{public}d", headerListSize);
202 header_size_ = headerListSize;
203
204 for (int i = 0; i < headerListSize; i++) {
205 char *key;
206 char *value;
207 OH_ArkWebRequestHeaderList_GetHeader(headerList, i, &key, &value);
208 OH_LOG_INFO(LOG_APP, "OH_ArkWebRequestHeaderList_GetHeader key: %{public}s value: %{public}s.", key, value);
209 hasHeader_ = true;
210 }
211
212 OH_ArkWebRequestHeaderList_Destroy(headerList);
213 OH_LOG_INFO(LOG_APP, "OH_ArkWebRequestHeaderList_Destroy Start");
214
215 headerList = nullptr;
216 int32_t headerListSize1 = OH_ArkWebRequestHeaderList_GetSize(headerList);
217 if (headerListSize1 <= 0) {
218 isHeaderDestroy_ = true;
219 }
220 OH_LOG_INFO(LOG_APP, "OH_ArkWebRequestHeaderList_Destroy %{public}d", isHeaderDestroy_);
221 OH_LOG_INFO(LOG_APP, "OH_ArkWebRequestHeaderList_Destroy %{public}d", headerListSize1);
222
223 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetMethod rawfilePath_ %{public}s", urlStr.c_str());
224
225 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetMethod rawfilePath_ %{public}s", rawfilePath_.c_str());
226
227 OH_LOG_INFO(LOG_APP, "OH_ArkWeb_CreateResponse before %{public}p", response_);
228 OH_ArkWeb_CreateResponse(&response_);
229 OH_LOG_INFO(LOG_APP, "OH_ArkWeb_CreateResponse after %{public}p", response_);
230
231 OH_ArkWebResourceRequest_GetHttpBodyStream(resourceRequest(), &stream_);
232 isGetBodyStream_ = true;
233
234 if (stream_) {
235 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetHttpBodyStream true");
236 } else {
237 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_GetHttpBodyStream true");
238 }
239
240 ReadRawfileOnWorkerThread(reinterpret_cast<void*>(this));
241 }
242
Stop()243 void TestRequest::Stop()
244 {
245 // 销毁ArkWeb_ResourceRequest对象。
246 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_Destroy start");
247 resourceRequestDestroy_ = OH_ArkWebResourceRequest_Destroy(resourceRequest_);
248 OH_LOG_INFO(LOG_APP, "OH_ArkWebResourceRequest_Destroy end %{public}d", resourceRequestDestroy_);
249
250 OH_LOG_INFO(LOG_APP, "OH_ArkWeb_DestroyResponse Before %{public}p", response_);
251 OH_ArkWeb_DestroyResponse(response_);
252 response_ = nullptr;
253 int afterStatus = OH_ArkWebResponse_GetStatus(response_);
254 OH_LOG_INFO(LOG_APP, "OH_ArkWeb_DestroyResponse afterStatus %{public}d", afterStatus);
255 OH_LOG_INFO(LOG_APP, "OH_ArkWeb_DestroyResponse After %{public}p", response_);
256 }
257