• 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     void DeleteReference(WebSchemeHandler* schemehandler);
110 
111     napi_ref delegate_ = nullptr;
112 private:
113     typedef struct RequestStopParam {
114         napi_env env_;
115         napi_ref callbackRef_;
116         WebSchemeHandlerRequest* request_;
117         const ArkWeb_ResourceRequest* arkWebRequest_;
118     } RequestStopParam;
119 
120     static void RequestStopAfterWorkCb(uv_work_t* work, int status);
121 
122     napi_env env_;
123     ArkWeb_OnRequestStart onRequestStart_ = nullptr;
124     ArkWeb_OnRequestStop onRequestStop_ = nullptr;
125     napi_ref request_start_callback_ = nullptr;
126     napi_ref request_stop_callback_ = nullptr;
127     pid_t thread_id_;
128 };
129 
130 class WebResourceHandler : public RefBase {
131 public:
132     explicit WebResourceHandler(napi_env env);
133     WebResourceHandler(napi_env env, const ArkWeb_ResourceHandler* handler);
134     ~WebResourceHandler();
135     int32_t DidReceiveResponse(const ArkWeb_Response* response);
136     int32_t DidReceiveResponseBody(const uint8_t* buffer, int64_t buflen);
137     int32_t DidFinish();
138     int32_t DidFailWithError(ArkWeb_NetError errorCode, bool completeIfNoResponse);
139     void DestroyArkWebResourceHandler();
SetFinishFlag()140     void SetFinishFlag()
141     {
142         isFinished_ = true;
143     }
144 private:
145     bool isFinished_ = false;
146     ArkWeb_ResourceHandler* handler_ = nullptr;
147     napi_env env_;
148 };
149 
150 class WebHttpBodyStream {
151 public:
152     explicit WebHttpBodyStream(napi_env env);
153     static void HttpBodyStreamReadCallback(
154         const ArkWeb_HttpBodyStream* httpBodyStream, uint8_t* buffer, int bytesRead);
155     static void HttpBodyStreamInitCallback(
156         const ArkWeb_HttpBodyStream* httpBodyStream, ArkWeb_NetError result);
157     WebHttpBodyStream(napi_env env, ArkWeb_HttpBodyStream* stream);
158     ~WebHttpBodyStream();
159     void Init(napi_ref jsCallback, napi_deferred deferred);
160     void Read(int bufLen, napi_ref jsCallback, napi_deferred deferred);
161     uint64_t GetPostion() const;
162     uint64_t GetSize() const;
163     bool IsChunked() const;
164     bool IsEof();
165     bool IsInMemory();
166 
167     void ExecuteInit(ArkWeb_NetError result);
168     void ExecuteRead(uint8_t* buffer, int bytesRead);
169 private:
170     void DeleteInitJsCallbackRef();
171     void DeleteReadJsCallbackRef();
172 
173     struct InitParam {
174         napi_env env;
175         napi_async_work asyncWork;
176         napi_deferred deferred;
177         napi_ref callbackRef;
178         ArkWeb_NetError result;
179     };
180 
181     struct ReadParam {
182         napi_env env;
183         napi_async_work asyncWork;
184         napi_deferred deferred;
185         napi_ref callbackRef;
186         uint8_t* buffer = nullptr;
187         int bytesRead = 0;
188     };
189 
190     static void ExecuteReadComplete(napi_env env, napi_status status, void* data);
191     static void ExecuteInitComplete(napi_env env, napi_status status, void* data);
192 
193     napi_ref initJsCallback_ = nullptr;
194     napi_deferred initDeferred_ = nullptr;
195     napi_ref readJsCallback_ = nullptr;
196     napi_deferred readDeferred_ = nullptr;
197     napi_env env_;
198     ArkWeb_HttpBodyStream* stream_ = nullptr;
199 };
200 }
201 }
202 #endif
203