• 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 #ifndef NWEB_WEB_SCHEME_HANDLER_REQUEST_H
17 #define NWEB_WEB_SCHEME_HANDLER_REQUEST_H
18 
19 #include <string>
20 #include <unistd.h>
21 #include <uv.h>
22 
23 #include "napi/native_api.h"
24 #include "napi/native_common.h"
25 #include "napi/native_node_api.h"
26 
27 #include "arkweb_scheme_handler.h"
28 #include "refbase.h"
29 
30 namespace OHOS {
31 namespace NWeb {
32 using WebHeaderList = std::vector<std::pair<std::string, std::string>>;
33 class WebSchemeHandlerRequest {
34 public:
35     explicit WebSchemeHandlerRequest(napi_env env);
36     WebSchemeHandlerRequest(napi_env env, const ArkWeb_ResourceRequest* request);
37     ~WebSchemeHandlerRequest();
38 
39     char* GetRequestUrl();
40     char* GetMethod();
41     char* GetReferrer();
42     bool IsRedirect();
43     bool IsMainFrame();
44     bool HasGesture();
45     const WebHeaderList& GetHeader();
46     ArkWeb_HttpBodyStream* GetHttpBodyStream();
47     int32_t GetRequestResourceType();
48     char* GetFrameUrl();
49 private:
50     napi_env env_;
51     char* url_ = nullptr;
52     char* method_ = nullptr;
53     char* referrer_ = nullptr;
54     bool isRedirect_ = false;
55     bool isMainFrame_ = false;
56     bool hasGesture_ = false;
57     WebHeaderList headerList_;
58     ArkWeb_HttpBodyStream* stream_ = nullptr;
59     int32_t requestResourceType_ = -1;
60     char* frameUrl_ = nullptr;
61 };
62 
63 class WebSchemeHandlerResponse {
64 public:
65     explicit WebSchemeHandlerResponse(napi_env env);
66     WebSchemeHandlerResponse(napi_env env, ArkWeb_Response* response);
67     ~WebSchemeHandlerResponse();
68 
69     char* GetUrl();
70     int32_t SetUrl(const char* url);
71     int32_t GetStatus() const;
72     int32_t SetStatus(int32_t status);
73     char* GetStatusText();
74     int32_t SetStatusText(const char* statusText);
75     char* GetMimeType();
76     int32_t SetMimeType(const char* mimeType);
77     char* GetEncoding() const;
78     int32_t SetEncoding(const char* encoding);
79     char* GetHeaderByName(const char* name);
80     int32_t SetHeaderByName(const char* name, const char* value, bool overwrite);
81     int32_t GetErrorCode();
82     int32_t SetErrorCode(int32_t code);
GetArkWebResponse()83     ArkWeb_Response* GetArkWebResponse()
84     {
85         return response_;
86     }
87 private:
88     napi_env env_;
89     ArkWeb_Response* response_ = nullptr;
90 };
91 
92 class WebSchemeHandler {
93 public:
94     explicit WebSchemeHandler(napi_env env);
95     ~WebSchemeHandler();
96 
97     static const ArkWeb_SchemeHandler* GetArkWebSchemeHandler(
98         WebSchemeHandler* handler);
99     static WebSchemeHandler* GetWebSchemeHandler(
100         const ArkWeb_SchemeHandler* handler);
101 
102     void RequestStart(ArkWeb_ResourceRequest* request,
103                       const ArkWeb_ResourceHandler* ArkWeb_ResourceHandler,
104                       bool* intercept);
105     void RequestStop(const ArkWeb_ResourceRequest* resourceRequest);
106 
107     void PutRequestStart(napi_env, napi_value callback);
108     void PutRequestStop(napi_env, napi_value callback);
109 
110     napi_ref delegate_ = nullptr;
111 private:
112     typedef struct RequestStopParam {
113         napi_env env_;
114         napi_ref callbackRef_;
115         WebSchemeHandlerRequest* request_;
116         const ArkWeb_ResourceRequest* arkWebRequest_;
117     } RequestStopParam;
118 
119     static void RequestStopAfterWorkCb(uv_work_t* work, int status);
120 
121     napi_env env_;
122     ArkWeb_OnRequestStart onRequestStart_ = nullptr;
123     ArkWeb_OnRequestStop onRequestStop_ = nullptr;
124     napi_ref request_start_callback_ = nullptr;
125     napi_ref request_stop_callback_ = nullptr;
126     pid_t thread_id_;
127 };
128 
129 class WebResourceHandler : public RefBase {
130 public:
131     explicit WebResourceHandler(napi_env env);
132     WebResourceHandler(napi_env env, const ArkWeb_ResourceHandler* handler);
133     ~WebResourceHandler();
134     int32_t DidReceiveResponse(const ArkWeb_Response* response);
135     int32_t DidReceiveResponseBody(const uint8_t* buffer, int64_t buflen);
136     int32_t DidFinish();
137     int32_t DidFailWithError(ArkWeb_NetError errorCode);
138     void DestoryArkWebResourceHandler();
SetFinishFlag()139     void SetFinishFlag()
140     {
141         isFinished_ = true;
142     }
143 private:
144     bool isFinished_ = false;
145     ArkWeb_ResourceHandler* handler_ = nullptr;
146     napi_env env_;
147 };
148 
149 class WebHttpBodyStream {
150 public:
151     explicit WebHttpBodyStream(napi_env env);
152     static void HttpBodyStreamReadCallback(
153         const ArkWeb_HttpBodyStream* httpBodyStream, uint8_t* buffer, int bytesRead);
154     static void HttpBodyStreamInitCallback(
155         const ArkWeb_HttpBodyStream* httpBodyStream, ArkWeb_NetError result);
156     WebHttpBodyStream(napi_env env, ArkWeb_HttpBodyStream* stream);
157     ~WebHttpBodyStream();
158     void Init(napi_ref jsCallback, napi_deferred deferred);
159     void Read(int bufLen, napi_ref jsCallback, napi_deferred deferred);
160     uint64_t GetPostion() const;
161     uint64_t GetSize() const;
162     bool IsChunked() const;
163     bool IsEof();
164     bool IsInMemory();
165 
166     void ExecuteInit(ArkWeb_NetError result);
167     void ExecuteRead(uint8_t* buffer, int bytesRead);
168 private:
169     struct InitParam {
170         napi_env env;
171         napi_async_work asyncWork;
172         napi_deferred deferred;
173         napi_ref callbackRef;
174         ArkWeb_NetError result;
175     };
176 
177     struct ReadParam {
178         napi_env env;
179         napi_async_work asyncWork;
180         napi_deferred deferred;
181         napi_ref callbackRef;
182         uint8_t* buffer = nullptr;
183         int bytesRead = 0;
184     };
185 
186     static void ExecuteReadComplete(napi_env env, napi_status status, void* data);
187     static void ExecuteInitComplete(napi_env env, napi_status status, void* data);
188 
189     napi_ref initJsCallback_ = nullptr;
190     napi_deferred initDeferred_ = nullptr;
191     napi_ref readJsCallback_ = nullptr;
192     napi_deferred readDeferred_ = nullptr;
193     napi_env env_;
194     ArkWeb_HttpBodyStream* stream_ = nullptr;
195 };
196 }
197 }
198 #endif
199