• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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