1 /*
2  * Copyright (c) 2023 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 /**
17  * @addtogroup Web
18  * @{
19  *
20  * @brief Provides APIs to intercept the request from ArkWeb.
21  * @since 12
22  */
23 /**
24  * @file arkweb_scheme_handler.h
25  *
26  * @brief Declares the APIs to intercept the request from ArkWeb.
27  * @kit ArkWeb
28  * @library libohweb.so
29  * @syscap SystemCapability.Web.Webview.Core
30  * @since 12
31  */
32 #ifndef ARKWEB_SCHEME_HANDLER_H
33 #define ARKWEB_SCHEME_HANDLER_H
34 
35 #include <stdbool.h>
36 #include "stdint.h"
37 
38 #include "arkweb_error_code.h"
39 #include "arkweb_net_error_list.h"
40 
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44 
45 /**
46  * @brief Configuration information for custom schemes.
47  *
48  * @syscap SystemCapability.Web.Webview.Core
49  * @since 12
50  */
51 typedef enum ArkWeb_CustomSchemeOption {
52     OH_ARKWEB_SCHEME_OPTION_NONE = 0,
53 
54     /** If ARKWEB_SCHEME_OPTION_STANDARD is set, the scheme will be handled as a standard scheme. The standard
55      *  schemes need to comply with the URL normalization and parsing rules defined in Section 3.1 of RFC 1738,
56      *  which can be found in the http://www.ietf.org/rfc/rfc1738.txt.
57      */
58     ARKWEB_SCHEME_OPTION_STANDARD = 1 << 0,
59 
60     /** If ARKWEB_SCHEME_OPTION_LOCAL is set, the same security rules as those applied to the "file" URL will be
61      *  used to handle the scheme.
62      */
63     ARKWEB_SCHEME_OPTION_LOCAL = 1 << 1,
64 
65     /** If ARKWEB_SCHEME_OPTION_DISPLAY_ISOLATED is set, then the scheme can only be displayed from other content
66      *  hosted using the same scheme.
67      */
68     ARKWEB_SCHEME_OPTION_DISPLAY_ISOLATED = 1 << 2,
69 
70     /** If ARKWEB_SCHEME_OPTION_SECURE is set, the same security rules as those applied to the "https" URL will be
71      *  used to handle the scheme.
72      */
73     ARKWEB_SCHEME_OPTION_SECURE = 1 << 3,
74 
75     /** If ARKWEB_SCHEME_OPTION_CORS_ENABLED is set, then the scheme can be sent CORS requests. In most cases this
76      *  value should be set when ARKWEB_SCHEME_OPTION_STANDARD is set.
77      */
78     ARKWEB_SCHEME_OPTION_CORS_ENABLED = 1 << 4,
79 
80     /** If ARKWEB_SCHEME_OPTION_CSP_BYPASSING is set, then this scheme can bypass Content Security Policy (CSP)
81      *  checks. In most cases, this value should not be set when ARKWEB_SCHEME_OPTION_STANDARD is set.
82      */
83     ARKWEB_SCHEME_OPTION_CSP_BYPASSING = 1 << 5,
84 
85     /** If ARKWEB_SCHEME_OPTION_FETCH_ENABLED is set, then this scheme can perform FETCH API requests. */
86     ARKWEB_SCHEME_OPTION_FETCH_ENABLED = 1 << 6,
87 
88     /** If ARKWEB_SCHEME_OPTION_CODE_CACHE_ENABLED is set, then the js of this scheme can generate code cache. */
89     ARKWEB_SCHEME_OPTION_CODE_CACHE_ENABLED = 1 << 7,
90 } ArkWeb_CustomSchemeOption;
91 
92 /**
93  * @brief Resource type for a request.
94  *
95  * These constants match their equivalents in Chromium's ResourceType and should not be renumbered.\n
96  *
97  * @syscap SystemCapability.Web.Webview.Core
98  * @since 12
99  */
100 typedef enum ArkWeb_ResourceType {
101     /** Top level page. */
102     MAIN_FRAME = 0,
103 
104     /** Frame or Iframe. */
105     SUB_FRAME = 1,
106 
107     /** CSS stylesheet. */
108     STYLE_SHEET = 2,
109 
110     /** External script. */
111     SCRIPT = 3,
112 
113     /** Image(jpg/gif/png/etc). */
114     IMAGE = 4,
115 
116     /** Font. */
117     FONT_RESOURCE = 5,
118 
119     /** Some other subresource. This is the default type if the actual type is unknown. */
120     SUB_RESOURCE = 6,
121 
122     /** Object (or embed) tag for a plugin, or a resource that a plugin requested. */
123     OBJECT = 7,
124 
125     /** Media resource. */
126     MEDIA = 8,
127 
128     /** Main resource of a dedicated worker. */
129     WORKER = 9,
130 
131     /** Main resource of a shared worker. */
132     SHARED_WORKER = 10,
133 
134     /** Explicitly requested prefetch. */
135     PREFETCH = 11,
136 
137     /** Favicon. */
138     FAVICON = 12,
139 
140     /** XMLHttpRequest. */
141     XHR = 13,
142 
143     /** Ping request for <a ping>/sendBeacon. */
144     PING = 14,
145 
146     /** The main resource of a service worker. */
147     SERVICE_WORKER = 15,
148 
149     /** Report of Content Security Policy violations. */
150     CSP_REPORT = 16,
151 
152     /** Resource that a plugin requested. */
153     PLUGIN_RESOURCE = 17,
154 
155     /** A main-frame service worker navigation preload request. */
156     NAVIGATION_PRELOAD_MAIN_FRAME = 19,
157 
158     /** A sub-frame service worker navigation preload request. */
159     NAVIGATION_PRELOAD_SUB_FRAME = 20,
160 } ArkWeb_ResourceType;
161 
162 /**
163  * @brief This class is used to intercept requests for a specified scheme.
164  *
165  * @syscap SystemCapability.Web.Webview.Core
166  * @since 12
167  */
168 typedef struct ArkWeb_SchemeHandler_ ArkWeb_SchemeHandler;
169 
170 /**
171  * @brief Used to intercept url requests.
172  *
173  * Response headers and body can be sent through ArkWeb_ResourceHandler.\n
174  *
175  * @syscap SystemCapability.Web.Webview.Core
176  * @since 12
177  */
178 typedef struct ArkWeb_ResourceHandler_ ArkWeb_ResourceHandler;
179 
180 /**
181  * @brief The response of the intercepted request.
182  *
183  * @syscap SystemCapability.Web.Webview.Core
184  * @since 12
185  */
186 typedef struct ArkWeb_Response_ ArkWeb_Response;
187 
188 /**
189  * @brief The info of the request.
190  *
191  * You can obtain the requested URL, method, post data, and other information through OH_ArkWeb_ResourceRequest.\n
192  *
193  * @syscap SystemCapability.Web.Webview.Core
194  * @since 12
195  */
196 typedef struct ArkWeb_ResourceRequest_ ArkWeb_ResourceRequest;
197 
198 /**
199  * @brief The request headers of the request.
200  *
201  * @syscap SystemCapability.Web.Webview.Core
202  * @since 12
203  */
204 typedef struct ArkWeb_RequestHeaderList_ ArkWeb_RequestHeaderList;
205 
206 /**
207  * @brief The http body of the request.
208  *
209  * Use OH_ArkWebHttpBodyStream_* interface to read the body.\n
210  *
211  * @syscap SystemCapability.Web.Webview.Core
212  * @since 12
213  */
214 typedef struct ArkWeb_HttpBodyStream_ ArkWeb_HttpBodyStream;
215 
216 
217 /**
218  * @brief Callback for handling the request.
219  *
220  * This will be called on the IO thread.\n
221  *
222  * @param schemeHandler The ArkWeb_SchemeHandler.
223  * @param resourceRequest Obtain request's information through this.
224  * @param resourceHandler The ArkWeb_ResourceHandler for the request. It should not be used if intercept is set to
225  *                        false.
226  * @param intercept If true will intercept the request, if false otherwise.
227  *
228  * @syscap SystemCapability.Web.Webview.Core
229  * @since 12
230  */
231 typedef void (*ArkWeb_OnRequestStart)(const ArkWeb_SchemeHandler* schemeHandler,
232                                       ArkWeb_ResourceRequest* resourceRequest,
233                                       const ArkWeb_ResourceHandler* resourceHandler,
234                                       bool* intercept);
235 
236 /**
237  * @brief Callback when the request is completed.
238  *
239  * This will be called on the IO thread.\n
240  * Should destory the resourceRequest by ArkWeb_ResourceRequest_Destroy and use ArkWeb_ResourceHandler_Destroy\n
241  * destroy the ArkWeb_ResourceHandler received in ArkWeb_OnRequestStart.\n
242  *
243  * @param schemeHandler The ArkWeb_SchemeHandler.
244  * @param resourceRequest The ArkWeb_ResourceRequest.
245  *
246  * @syscap SystemCapability.Web.Webview.Core
247  * @since 12
248  */
249 typedef void (*ArkWeb_OnRequestStop)(const ArkWeb_SchemeHandler* schemeHandler,
250                                      const ArkWeb_ResourceRequest* resourceRequest);
251 
252 /**
253  * @brief Callback when the read operation done.
254  * @param httpBodyStream The ArkWeb_HttpBodyStream.
255  * @param buffer The buffer to receive data.
256  * @param bytesRead Callback after OH_ArkWebHttpBodyStream_Read. bytesRead greater than 0 means that the buffer is
257  *                  filled with data of bytesRead size. Caller can read from the buffer, and if
258  *                  OH_ArkWebHttpBodyStream_IsEOF is false, caller can continue to read the remaining data.
259  *
260  * @syscap SystemCapability.Web.Webview.Core
261  * @since 12
262  */
263 typedef void (*ArkWeb_HttpBodyStreamReadCallback)(const ArkWeb_HttpBodyStream* httpBodyStream,
264                                                   uint8_t* buffer,
265                                                   int bytesRead);
266 
267 /**
268  * @brief  Callback when the init operation done.
269  * @param httpBodyStream The ArkWeb_HttpBodyStream.
270  * @param result {@link ARKWEB_NET_OK} on success otherwise refer to arkweb_net_error_list.h.
271  *
272  * @syscap SystemCapability.Web.Webview.Core
273  * @since 12
274  */
275 typedef void (*ArkWeb_HttpBodyStreamInitCallback)(const ArkWeb_HttpBodyStream* httpBodyStream, ArkWeb_NetError result);
276 
277 /**
278  * @brief Destroy the ArkWeb_RequestHeaderList.
279  * @param requestHeaderList The ArkWeb_RequestHeaderList to be destroyed.
280  *
281  * @syscap SystemCapability.Web.Webview.Core
282  * @since 12
283  */
284 void OH_ArkWebRequestHeaderList_Destroy(ArkWeb_RequestHeaderList* requestHeaderList);
285 
286 /**
287  * @brief Get the request headers size.
288  * @param requestHeaderList The list of request header.
289  * @return The size of request headers. -1 if requestHeaderList is invalid.
290  *
291  * @syscap SystemCapability.Web.Webview.Core
292  * @since 12
293  */
294 int32_t OH_ArkWebRequestHeaderList_GetSize(const ArkWeb_RequestHeaderList* requestHeaderList);
295 
296 /**
297  * @brief Get the specified request header.
298  * @param requestHeaderList The list of request header.
299  * @param index The index of request header.
300  * @param key The header key. Caller must release the string by OH_ArkWeb_ReleaseString.
301  * @param value The header value. Caller must release the string by OH_ArkWeb_ReleaseString.
302  *
303  * @syscap SystemCapability.Web.Webview.Core
304  * @since 12
305  */
306 void OH_ArkWebRequestHeaderList_GetHeader(const ArkWeb_RequestHeaderList* requestHeaderList,
307                                           int32_t index,
308                                           char** key,
309                                           char** value);
310 
311 /**
312  * @brief Set a user data to ArkWeb_ResourceRequest.
313  * @param resourceRequest The ArkWeb_ResourceRequest.
314  * @param userData The user data to set.
315  * @return {@link ARKWEB_NET_OK} 0 - Success.
316  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
317  *
318  * @syscap SystemCapability.Web.Webview.Core
319  * @since 12
320  */
321 int32_t OH_ArkWebResourceRequest_SetUserData(ArkWeb_ResourceRequest* resourceRequest, void* userData);
322 
323 /**
324  * @brief Get the user data from ArkWeb_ResourceRequest.
325  * @param resourceRequest The ArkWeb_ResourceRequest.
326  * @return The set user data.
327  *
328  * @syscap SystemCapability.Web.Webview.Core
329  * @since 12
330  */
331 void* OH_ArkWebResourceRequest_GetUserData(const ArkWeb_ResourceRequest* resourceRequest);
332 
333 /**
334  * @brief Get the method of request.
335  * @param resourceRequest The ArkWeb_ResourceRequest.
336  * @param method The request's http method. This function will allocate memory for the method string and caller must
337  *               release the string by OH_ArkWeb_ReleaseString.
338  *
339  * @syscap SystemCapability.Web.Webview.Core
340  * @since 12
341  */
342 void OH_ArkWebResourceRequest_GetMethod(const ArkWeb_ResourceRequest* resourceRequest, char** method);
343 
344 /**
345  * @brief Get the url of request.
346  * @param resourceRequest The ArkWeb_ResourceRequest.
347  * @param url The request's url. This function will allocate memory for the url string and caller must release the
348  *            string by OH_ArkWeb_ReleaseString.
349  *
350  * @syscap SystemCapability.Web.Webview.Core
351  * @since 12
352  */
353 void OH_ArkWebResourceRequest_GetUrl(const ArkWeb_ResourceRequest* resourceRequest, char** url);
354 
355 /**
356  * @brief Create a ArkWeb_HttpBodyStream which used to read the http body.
357  * @param resourceRequest The ArkWeb_ResourceRequest.
358  * @param httpBodyStream The request's http body. This function will allocate memory for the http body stream and
359  *                       caller must release the httpBodyStream by OH_ArkWebResourceRequest_DestroyHttpBodyStream.
360  *
361  * @syscap SystemCapability.Web.Webview.Core
362  * @since 12
363  */
364 void OH_ArkWebResourceRequest_GetHttpBodyStream(const ArkWeb_ResourceRequest* resourceRequest,
365                                                 ArkWeb_HttpBodyStream** httpBodyStream);
366 
367 /**
368  * @brief Destroy the http body stream.
369  * @param httpBodyStream The httpBodyStream to be destroyed.
370  *
371  * @syscap SystemCapability.Web.Webview.Core
372  * @since 12
373  */
374 void OH_ArkWebResourceRequest_DestroyHttpBodyStream(ArkWeb_HttpBodyStream* httpBodyStream);
375 
376 /**
377  * @brief Get the resource type of request.
378  * @param resourceRequest The ArkWeb_ResourceRequest.
379  * @return The resource type of request. -1 if resourceRequest is invalid.
380  *
381  * @syscap SystemCapability.Web.Webview.Core
382  * @since 12
383  */
384 int32_t OH_ArkWebResourceRequest_GetResourceType(const ArkWeb_ResourceRequest* resourceRequest);
385 
386 /**
387  * @brief Get the url of frame which trigger this request.
388  * @param resourceRequest The ArkWeb_ResourceRequest.
389  * @param frameUrl The url of frame which trigger this request. This function will allocate memory for the url string
390  *            and caller must release the string by OH_ArkWeb_ReleaseString.
391  *
392  * @syscap SystemCapability.Web.Webview.Core
393  * @since 12
394  */
395 void OH_ArkWebResourceRequest_GetFrameUrl(const ArkWeb_ResourceRequest* resourceRequest, char** frameUrl);
396 
397 /**
398  * @brief Set a user data to ArkWeb_HttpBodyStream.
399  * @param httpBodyStream The ArkWeb_HttpBodyStream.
400  * @param userData The user data to set.
401  * @return {@link ARKWEB_NET_OK} 0 - Success.
402  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
403  *
404  * @syscap SystemCapability.Web.Webview.Core
405  * @since 12
406  */
407 int32_t OH_ArkWebHttpBodyStream_SetUserData(ArkWeb_HttpBodyStream* httpBodyStream, void* userData);
408 
409 /**
410  * @brief Get the user data from ArkWeb_HttpBodyStream.
411  * @param httpBodyStream The ArkWeb_HttpBodyStream.
412  * @return The set user data.
413  *
414  * @syscap SystemCapability.Web.Webview.Core
415  * @since 12
416  */
417 void* OH_ArkWebHttpBodyStream_GetUserData(const ArkWeb_HttpBodyStream* httpBodyStream);
418 
419 /**
420  * @brief Set the callback for OH_ArkWebHttpBodyStream_Read.
421  *
422  * The result of OH_ArkWebHttpBodyStream_Read will be notified to caller through the readCallback.\n
423  * The callback will run in the same thread as OH_ArkWebHttpBodyStream_Read.\n
424  *
425  * @param httpBodyStream The ArkWeb_HttpBodyStream.
426  * @param readCallback The callback of read function.
427  * @return {@link ARKWEB_NET_OK} 0 - Success.
428  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
429  *
430  * @syscap SystemCapability.Web.Webview.Core
431  * @since 12
432  */
433 int32_t OH_ArkWebHttpBodyStream_SetReadCallback(ArkWeb_HttpBodyStream* httpBodyStream,
434                                                 ArkWeb_HttpBodyStreamReadCallback readCallback);
435 
436 /**
437  * @brief Init the http body stream.
438  *
439  * This function must be called before calling any other functions.\n
440  *
441  * @param httpBodyStream The ArkWeb_HttpBodyStream.
442  * @param initCallback The callback of init.
443  * @return {@link ARKWEB_NET_OK} 0 - Success.
444  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
445  *
446  * @syscap SystemCapability.Web.Webview.Core
447  * @since 12
448  */
449 int32_t OH_ArkWebHttpBodyStream_Init(ArkWeb_HttpBodyStream* httpBodyStream,
450                                      ArkWeb_HttpBodyStreamInitCallback initCallback);
451 
452 /**
453  * @brief Read the http body to the buffer.
454  *
455  * The buffer must be larger than the bufLen. We will be reading data from a worker thread to the buffer,\n
456  * so should not use the buffer in other threads before the callback to avoid concurrency issues.\n
457  *
458  * @param httpBodyStream The ArkWeb_HttpBodyStream.
459  * @param buffer The buffer to receive data.
460  * @param bufLen The size of bytes to read.
461  *
462  * @syscap SystemCapability.Web.Webview.Core
463  * @since 12
464  */
465 void OH_ArkWebHttpBodyStream_Read(const ArkWeb_HttpBodyStream* httpBodyStream, uint8_t* buffer, int bufLen);
466 
467 /**
468  * @brief Get the total size of the data stream.
469  *
470  * When data is chunked or httpBodyStream is invalid, always return zero.\n
471  *
472  * @param httpBodyStream The ArkWeb_HttpBodyStream.
473  * @return The size of data stream.
474  *
475  * @syscap SystemCapability.Web.Webview.Core
476  * @since 12
477  */
478 uint64_t OH_ArkWebHttpBodyStream_GetSize(const ArkWeb_HttpBodyStream* httpBodyStream);
479 
480 /**
481  * @brief Get the current position of the data stream.
482  * @param httpBodyStream The ArkWeb_HttpBodyStream.
483  * @return The current position of data stream. 0 if httpBodyStream is invalid.
484  *
485  * @syscap SystemCapability.Web.Webview.Core
486  * @since 12
487  */
488 uint64_t OH_ArkWebHttpBodyStream_GetPosition(const ArkWeb_HttpBodyStream* httpBodyStream);
489 
490 /**
491  * @brief Get if the data stream is chunked.
492  * @param httpBodyStream The ArkWeb_HttpBodyStream.
493  * @return True if is chunked; false otherwise.
494  *
495  * @syscap SystemCapability.Web.Webview.Core
496  * @since 12
497  */
498 bool OH_ArkWebHttpBodyStream_IsChunked(const ArkWeb_HttpBodyStream* httpBodyStream);
499 
500 
501 /**
502  * @brief Returns true if all data has been consumed from this upload data stream.
503  *
504  * For chunked uploads, returns false until the first read attempt.\n
505  *
506  * @param httpBodyStream The ArkWeb_HttpBodyStream.
507  * @return True if all data has been consumed; false otherwise.
508  *
509  * @syscap SystemCapability.Web.Webview.Core
510  * @since 12
511  */
512 bool OH_ArkWebHttpBodyStream_IsEof(const ArkWeb_HttpBodyStream* httpBodyStream);
513 
514 /**
515  * @brief Returns true if the upload data in the stream is entirely in memory,
516  *        and all read requests will succeed synchronously.
517  *
518  * Expected to return false for chunked requests.\n
519  *
520  * @param httpBodyStream The ArkWeb_HttpBodyStream.
521  * @return True if the upload data is in memory; false otherwise.
522  *
523  * @syscap SystemCapability.Web.Webview.Core
524  * @since 12
525  */
526 bool OH_ArkWebHttpBodyStream_IsInMemory(const ArkWeb_HttpBodyStream* httpBodyStream);
527 
528 /**
529  * @brief Destroy the ArkWeb_ResourceRequest.
530  * @param resourceRequest The ArkWeb_ResourceRequest.
531  * @return {@link ARKWEB_NET_OK} 0 - Success.
532  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
533  *
534  * @syscap SystemCapability.Web.Webview.Core
535  * @since 12
536  */
537 int32_t OH_ArkWebResourceRequest_Destroy(const ArkWeb_ResourceRequest* resourceRequest);
538 
539 /**
540  * @brief Get the referrer of request.
541  * @param resourceRequest The ArkWeb_ResourceRequest.
542  * @param referrer The request's referrer. This function will allocate memory for the post data string and caller
543  *                 must release the string by OH_ArkWeb_ReleaseString.
544  *
545  * @syscap SystemCapability.Web.Webview.Core
546  * @since 12
547  */
548 void OH_ArkWebResourceRequest_GetReferrer(const ArkWeb_ResourceRequest* resourceRequest, char** referrer);
549 
550 /**
551  * @brief Get the OH_ArkWeb_RequestHeaderList of the request.
552  * @param resourceRequest The ArkWeb_ResourceRequest.
553  * @param requestHeaderList The RequestHeaderList of request.
554  *
555  * @syscap SystemCapability.Web.Webview.Core
556  * @since 12
557  */
558 void OH_ArkWebResourceRequest_GetRequestHeaders(const ArkWeb_ResourceRequest* resourceRequest,
559                                                 ArkWeb_RequestHeaderList** requestHeaderList);
560 
561 /**
562  * @brief Get if this is a redirect request.
563  * @param resourceRequest The ArkWeb_ResourceRequest.
564  * @return True if this is a redirect; false otherwise.
565  *
566  * @syscap SystemCapability.Web.Webview.Core
567  * @since 12
568  */
569 bool OH_ArkWebResourceRequest_IsRedirect(const ArkWeb_ResourceRequest* resourceRequest);
570 
571 /**
572  * @brief Get if this is a request from main frame.
573  * @param resourceRequest The ArkWeb_ResourceRequest.
574  * @return True if this is from main frame; false otherwise.
575  *
576  * @syscap SystemCapability.Web.Webview.Core
577  * @since 12
578  */
579 bool OH_ArkWebResourceRequest_IsMainFrame(const ArkWeb_ResourceRequest* resourceRequest);
580 
581 /**
582  * @brief Get if this is a request is triggered by user gesutre.
583  * @param resourceRequest The ArkWeb_ResourceRequest.
584  * @return True if this is triggered by user gesture; false otherwise.
585  *
586  * @syscap SystemCapability.Web.Webview.Core
587  * @since 12
588  */
589 bool OH_ArkWebResourceRequest_HasGesture(const ArkWeb_ResourceRequest* resourceRequest);
590 
591 /**
592  * @brief Register custom scheme to the ArkWeb.
593  *
594  * Should not be called for built-in HTTP, HTTPS, FILE, FTP, ABOUT and DATA schemes.\n
595  * This function should be called on main thread.\n
596  *
597  * @param scheme The scheme to regist.
598  * @param option The configuration of the scheme.
599  * @return {@link ARKWEB_NET_OK} 0 - Success.
600  *         {@link ARKWEB_ERROR_UNKNOWN} 17100100 - Unknown error.
601  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
602  *         {@link ARKWEB_SCHEME_REGISTER_FAILED} 17100102 - Register custom schemes should be called
603  *                                                          before create any ArkWeb.
604  *
605  * @syscap SystemCapability.Web.Webview.Core
606  * @since 12
607  */
608 int32_t OH_ArkWeb_RegisterCustomSchemes(const char* scheme, int32_t option);
609 
610 /**
611  * @brief Set a ArkWeb_SchemeHandler for a specific scheme to intercept requests of that scheme type.
612  *
613  * SchemeHandler should be set after the BrowserContext created.\n
614  * Use WebviewController.initializeWebEngine to initialize the BrowserContext without create a ArkWeb.\n
615  *
616  * @param scheme Scheme that need to be intercepted.
617  * @param schemeHandler The SchemeHandler for the scheme. Only requests triggered by ServiceWorker will be notified
618  *                      through this handler.
619  * @return Return true if set SchemeHandler for specific scheme successful, return false otherwise.
620  *
621  * @syscap SystemCapability.Web.Webview.Core
622  * @since 12
623  */
624 bool OH_ArkWebServiceWorker_SetSchemeHandler(const char* scheme, ArkWeb_SchemeHandler* schemeHandler);
625 
626 /**
627  * @brief Set a ArkWeb_SchemeHandler for a specific scheme to intercept requests of that scheme type.
628  *
629  * SchemeHandler should be set after the BrowserContext created.\n
630  * Use WebviewController.initializeWebEngine to initialize the BrowserContext without create a ArkWeb.\n
631  *
632  * @param scheme Scheme that need to be intercepted.
633  * @param webTag The name of the web component.
634  * @param schemeHandler The SchemeHandler for the scheme. Only requests triggered from the specified web will be
635  *                      notified through this handler.
636  * @return Return true if set SchemeHandler for specific scheme successful, return false otherwise.
637  *
638  * @syscap SystemCapability.Web.Webview.Core
639  * @since 12
640  */
641 bool OH_ArkWeb_SetSchemeHandler(const char* scheme, const char* webTag, ArkWeb_SchemeHandler* schemeHandler);
642 
643 /**
644  * @brief Clear the handler registered on the specified web for service worker.
645  * @return {@link ARKWEB_NET_OK} 0 - Success.
646  *
647  * @syscap SystemCapability.Web.Webview.Core
648  * @since 12
649  */
650 int32_t OH_ArkWebServiceWorker_ClearSchemeHandlers();
651 
652 /**
653  * @brief Clear the handler registered on the specified web.
654  * @param webTag The name of the web component.
655  * @return {@link ARKWEB_NET_OK} 0 - Success.
656  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
657  *
658  * @syscap SystemCapability.Web.Webview.Core
659  * @since 12
660  */
661 int32_t OH_ArkWeb_ClearSchemeHandlers(const char* webTag);
662 
663 /**
664  * @brief Create a SchemeHandler.
665  * @param schemeHandler Return the created SchemeHandler. Use OH_ArkWeb_DestroySchemeHandler destroy it when donn't
666  *                      need it.
667  *
668  * @syscap SystemCapability.Web.Webview.Core
669  * @since 12
670  */
671 void OH_ArkWeb_CreateSchemeHandler(ArkWeb_SchemeHandler** schemeHandler);
672 
673 /**
674  * @brief Destroy a SchemeHandler.
675  * @param The ArkWeb_SchemeHandler to be destroy.
676  *
677  * @syscap SystemCapability.Web.Webview.Core
678  * @since 12
679  */
680 void OH_ArkWeb_DestroySchemeHandler(ArkWeb_SchemeHandler* schemeHandler);
681 
682 /**
683  * @brief Set a user data to ArkWeb_SchemeHandler.
684  * @param schemeHandler The ArkWeb_SchemeHandler.
685  * @param userData The user data to set.
686  * @return {@link ARKWEB_NET_OK} 0 - Success.
687  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
688  *
689  * @syscap SystemCapability.Web.Webview.Core
690  * @since 12
691  */
692 int32_t OH_ArkWebSchemeHandler_SetUserData(ArkWeb_SchemeHandler* schemeHandler, void* userData);
693 
694 /**
695  * @brief Get the user data from ArkWeb_SchemeHandler.
696  * @param schemeHandler The ArkWeb_SchemeHandler.
697  * @return The set user data.
698  *
699  * @syscap SystemCapability.Web.Webview.Core
700  * @since 12
701  */
702 void* OH_ArkWebSchemeHandler_GetUserData(const ArkWeb_SchemeHandler* schemeHandler);
703 
704 /**
705  * @brief Set the OnRequestStart callback for SchemeHandler.
706  * @param schemeHandler The SchemeHandler for the scheme.
707  * @param onRequestStart The OnRequestStart callback.
708  * @return {@link ARKWEB_NET_OK} 0 - Success.
709  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
710  *
711  * @syscap SystemCapability.Web.Webview.Core
712  * @since 12
713  */
714 int32_t OH_ArkWebSchemeHandler_SetOnRequestStart(ArkWeb_SchemeHandler* schemeHandler,
715                                                  ArkWeb_OnRequestStart onRequestStart);
716 
717 /**
718  * @brief Set the OnRequestStop callback for SchemeHandler.
719  * @param schemeHandler The SchemeHandler for the scheme.
720  * @param onRequestStop The OnRequestStop callback.
721  * @return {@link ARKWEB_NET_OK} 0 - Success.
722  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
723  *
724  * @syscap SystemCapability.Web.Webview.Core
725  * @since 12
726  */
727 int32_t OH_ArkWebSchemeHandler_SetOnRequestStop(ArkWeb_SchemeHandler* schemeHandler,
728                                                 ArkWeb_OnRequestStop onRequestStop);
729 
730 /**
731  * @brief Create a Response for a request.
732  * @param response The created Response. Use OH_ArkWeb_DestroyResponse to destroy when donn't need it.
733  *
734  * @syscap SystemCapability.Web.Webview.Core
735  * @since 12
736  */
737 void OH_ArkWeb_CreateResponse(ArkWeb_Response** response);
738 
739 /**
740  * @brief Destroy the Reponse.
741  * @param response The Response needs destroy.
742  *
743  * @syscap SystemCapability.Web.Webview.Core
744  * @since 12
745  */
746 void OH_ArkWeb_DestroyResponse(ArkWeb_Response* response);
747 
748 /**
749  * @brief Set the resolved URL after redirects or changed as a result of HSTS.
750  * @param response The ArkWeb_Response.
751  * @param url The resolved URL.
752  * @return {@link ARKWEB_NET_OK} 0 - Success.
753  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
754  *
755  * @syscap SystemCapability.Web.Webview.Core
756  * @since 12
757  */
758 int32_t OH_ArkWebResponse_SetUrl(ArkWeb_Response* response, const char* url);
759 
760 /**
761  * @brief Get the resolved URL after redirects or changed as a result of HSTS.
762  * @param response The ArkWeb_Response.
763  * @param url The resolved URL.
764  *
765  * @syscap SystemCapability.Web.Webview.Core
766  * @since 12
767  */
768 void OH_ArkWebResponse_GetUrl(const ArkWeb_Response* response, char** url);
769 
770 /**
771  * @brief Set a error code to ArkWeb_Response.
772  * @param response The ArkWeb_Response.
773  * @param errorCode The error code for the failed request.
774  * @return {@link ARKWEB_NET_OK} 0 - Success.
775  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
776  *
777  * @syscap SystemCapability.Web.Webview.Core
778  * @since 12
779  */
780 int32_t OH_ArkWebResponse_SetError(ArkWeb_Response* response, ArkWeb_NetError errorCode);
781 
782 /**
783  * @brief Get the response's error code.
784  * @param response The ArkWeb_Response.
785  * @return The response's error code.
786  *
787  * @syscap SystemCapability.Web.Webview.Core
788  * @since 12
789  */
790 ArkWeb_NetError OH_ArkWebResponse_GetError(const ArkWeb_Response* response);
791 
792 /**
793  * @brief Set a status code to ArkWebResponse.
794  * @param response The ArkWeb_Response.
795  * @param status The http status code for the request.
796  * @return {@link ARKWEB_NET_OK} 0 - Success.
797  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
798  *
799  * @syscap SystemCapability.Web.Webview.Core
800  * @since 12
801  */
802 int32_t OH_ArkWebResponse_SetStatus(ArkWeb_Response* response, int status);
803 
804 /**
805  * @brief Get the response's status code.
806  * @param response The ArkWeb_Response.
807  * @return The response's http status code. -1 if response is invalid.
808  *
809  * @syscap SystemCapability.Web.Webview.Core
810  * @since 12
811  */
812 int OH_ArkWebResponse_GetStatus(const ArkWeb_Response* response);
813 
814 /**
815  * @brief Set a status text to ArkWebResponse.
816  * @param response The ArkWeb_Response.
817  * @param statusText The status text for the request.
818  * @return {@link ARKWEB_NET_OK} 0 - Success.
819  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
820  *
821  * @syscap SystemCapability.Web.Webview.Core
822  * @since 12
823  */
824 int32_t OH_ArkWebResponse_SetStatusText(ArkWeb_Response* response, const char* statusText);
825 
826 /**
827  * @brief Get the response's status text.
828  * @param response The ArkWeb_Response.
829  * @param statusText Return the response's statusText. This function will allocate memory for the statusText string and
830  *                   caller must release the string by OH_ArkWeb_ReleaseString.
831  *
832  * @syscap SystemCapability.Web.Webview.Core
833  * @since 12
834  */
835 void OH_ArkWebResponse_GetStatusText(const ArkWeb_Response* response, char** statusText);
836 
837 /**
838  * @brief Set mime type to ArkWebResponse.
839  * @param response The ArkWeb_Response.
840  * @param mimeType The mime type for the request.
841  * @return {@link ARKWEB_NET_OK} 0 - Success.
842  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
843  *
844  * @syscap SystemCapability.Web.Webview.Core
845  * @since 12
846  */
847 int32_t OH_ArkWebResponse_SetMimeType(ArkWeb_Response* response, const char* mimeType);
848 
849 /**
850  * @brief Get the response's mime type.
851  * @param response The ArkWeb_Response.
852  * @param mimeType Return the response's mime type. This function will allocate memory for the mime type string and
853  *                 caller must release the string by OH_ArkWeb_ReleaseString.
854  *
855  * @syscap SystemCapability.Web.Webview.Core
856  * @since 12
857  */
858 void OH_ArkWebResponse_GetMimeType(const ArkWeb_Response* response, char** mimeType);
859 
860 /**
861  * @brief Set charset to ArkWeb_Response.
862  * @param response The ArkWeb_Response.
863  * @param charset The charset for the request.
864  * @return {@link ARKWEB_NET_OK} 0 - Success.
865  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
866  *
867  * @syscap SystemCapability.Web.Webview.Core
868  * @since 12
869  */
870 int32_t OH_ArkWebResponse_SetCharset(ArkWeb_Response* response, const char* charset);
871 
872 /**
873  * @brief Get the response's charset.
874  * @param response The ArkWeb_Response.
875  * @param charset Return the response's charset. This function will allocate memory for the charset string and caller
876  *                must release the string by OH_ArkWeb_ReleaseString.
877  *
878  * @syscap SystemCapability.Web.Webview.Core
879  * @since 12
880  */
881 void OH_ArkWebResponse_GetCharset(const ArkWeb_Response* response, char** charset);
882 
883 /**
884  * @brief Set a header to ArkWeb_Response.
885  * @param response The ArkWeb_Response.
886  * @param name The name of the header.
887  * @param value The value of the header.
888  * @param overwirte If true will overwrite the exsits header, if false otherwise.
889  * @return {@link ARKWEB_NET_OK} 0 - Success.
890  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
891  *
892  * @syscap SystemCapability.Web.Webview.Core
893  * @since 12
894  */
895 int32_t OH_ArkWebResponse_SetHeaderByName(ArkWeb_Response* response,
896                                           const char* name,
897                                           const char* value,
898                                           bool overwrite);
899 
900 /**
901  * @brief Get the header from the response.
902  * @param response The ArkWeb_Response.
903  * @param name The name of the header.
904  * @param value Return the header's value. This function will allocate memory for the value string and caller must
905  *              release the string by OH_ArkWeb_ReleaseString.
906  *
907  * @syscap SystemCapability.Web.Webview.Core
908  * @since 12
909  */
910 void OH_ArkWebResponse_GetHeaderByName(const ArkWeb_Response* response, const char* name, char** value);
911 
912 /**
913  * @brief Destroy the ArkWeb_ResourceHandler.
914  * @param resourceHandler The ArkWeb_ResourceHandler.
915  * @return {@link ARKWEB_NET_OK} 0 - Success.
916  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
917  *
918  * @syscap SystemCapability.Web.Webview.Core
919  * @since 12
920  */
921 int32_t OH_ArkWebResourceHandler_Destroy(const ArkWeb_ResourceHandler* resourceHandler);
922 
923 /**
924  * @brief Pass response headers to intercepted requests.
925  * @param resourceHandler The ArkWeb_ResourceHandler for the request.
926  * @param response The ArkWeb_Response for the intercepting requests.
927  * @return {@link ARKWEB_NET_OK} 0 - Success.
928  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
929  *
930  * @syscap SystemCapability.Web.Webview.Core
931  * @since 12
932  */
933 int32_t OH_ArkWebResourceHandler_DidReceiveResponse(const ArkWeb_ResourceHandler* resourceHandler,
934                                                     const ArkWeb_Response* response);
935 
936 /**
937  * @brief Pass response body data to intercepted requests.
938  * @param resourceHandler The ArkWeb_ResourceHandler for the request.
939  * @param buffer Buffer data to send.
940  * @param bufLen The size of buffer.
941  * @return {@link ARKWEB_NET_OK} 0 - Success.
942  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
943  *
944  * @syscap SystemCapability.Web.Webview.Core
945  * @since 12
946  */
947 int32_t OH_ArkWebResourceHandler_DidReceiveData(const ArkWeb_ResourceHandler* resourceHandler,
948                                                 const uint8_t* buffer,
949                                                 int64_t bufLen);
950 
951 /**
952  * @brief Notify the ArkWeb that this request should be finished and there is no more data available.
953  * @param resourceHandler The ArkWeb_ResourceHandler for the request.
954  * @return {@link ARKWEB_NET_OK} 0 - Success.
955  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
956  *
957  * @syscap SystemCapability.Web.Webview.Core
958  * @since 12
959  */
960 int32_t OH_ArkWebResourceHandler_DidFinish(const ArkWeb_ResourceHandler* resourceHandler);
961 
962 /**
963  * @brief Notify the ArkWeb that this request should be failed.
964  * @param resourceHandler The ArkWeb_ResourceHandler for the request.
965  * @param errorCode The error code for this request. Refer to arkweb_net_error_list.h.
966  * @return {@link ARKWEB_NET_OK} 0 - Success.
967  *         {@link ARKWEB_INVALID_PARAM} 17100101 - Invalid param.
968  *
969  * @syscap SystemCapability.Web.Webview.Core
970  * @since 12
971  */
972 int32_t OH_ArkWebResourceHandler_DidFailWithError(const ArkWeb_ResourceHandler* resourceHandler,
973                                                   ArkWeb_NetError errorCode);
974 
975 /**
976  * @brief Release the string acquired by native function.
977  * @param string The string to be released.
978  *
979  * @syscap SystemCapability.Web.Webview.Core
980  * @since 12
981  */
982 void OH_ArkWeb_ReleaseString(char* string);
983 
984 /**
985  * @brief Release the byte array acquired by native function.
986  * @param byteArray The byte array to be released.
987  *
988  * @syscap SystemCapability.Web.Webview.Core
989  * @since 12
990  */
991 void OH_ArkWeb_ReleaseByteArray(uint8_t* byteArray);
992 
993 
994 #ifdef __cplusplus
995 };
996 #endif
997 #endif // ARKWEB_SCHEME_HANDLER_H
998