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