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