diff --git a/lib/consts.dart b/lib/consts.dart index 595aa69e7..d6110f850 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -140,7 +140,8 @@ enum CodegenLanguage { enum ImportFormat { curl("cURL"), postman("Postman Collection v2.1"), - insomnia("Insomnia v4"); + insomnia("Insomnia v4"), + har("Har v1.2"); const ImportFormat(this.label); final String label; diff --git a/lib/importer/importer.dart b/lib/importer/importer.dart index 4d93d9bec..da9bdeaee 100644 --- a/lib/importer/importer.dart +++ b/lib/importer/importer.dart @@ -13,6 +13,7 @@ class Importer { .toList(), ImportFormat.postman => PostmanIO().getHttpRequestModelList(content), ImportFormat.insomnia => InsomniaIO().getHttpRequestModelList(content), + ImportFormat.har => HarParserIO().getHttpRequestModelList(content), }; } } diff --git a/packages/apidash_core/lib/import_export/har_io.dart b/packages/apidash_core/lib/import_export/har_io.dart new file mode 100644 index 000000000..93e048356 --- /dev/null +++ b/packages/apidash_core/lib/import_export/har_io.dart @@ -0,0 +1,135 @@ +import 'package:har_parser/har_parser.dart' as hp; +import 'package:seed/seed.dart'; +import '../consts.dart'; +import '../models/models.dart'; +import '../utils/utils.dart'; + +class HarParserIO { + List<(String?, HttpRequestModel)>? getHttpRequestModelList(String content) { + content = content.trim(); + try { + final hl = hp.harLogFromJsonStr(content); + final requests = hp.getRequestsFromHarLog(hl); + return requests + .map((req) => (req.$2.url, harRequestToHttpRequestModel(req.$2))) + .toList(); + } catch (e) { + return null; + } + } + + HttpRequestModel harRequestToHttpRequestModel(hp.Request request) { + HTTPVerb method; + + try { + method = HTTPVerb.values.byName((request.method ?? "").toLowerCase()); + } catch (e) { + method = kDefaultHttpMethod; + } + String url = stripUrlParams(request.url ?? ""); + List<NameValueModel> headers = []; + List<bool> isHeaderEnabledList = []; + + List<NameValueModel> params = []; + List<bool> isParamEnabledList = []; + + for (var header in request.headers ?? <hp.Header>[]) { + var name = header.name ?? ""; + var value = header.value; + var activeHeader = header.disabled ?? false; + headers.add(NameValueModel(name: name, value: value)); + isHeaderEnabledList.add(!activeHeader); + } + + for (var query in request.queryString ?? <hp.Query>[]) { + var name = query.name ?? ""; + var value = query.value; + var activeQuery = query.disabled ?? false; + params.add(NameValueModel(name: name, value: value)); + isParamEnabledList.add(!activeQuery); + } + + ContentType bodyContentType = kDefaultContentType; + String? body; + List<FormDataModel>? formData = []; + + if (request.postData?.mimeType == "application/json") { + bodyContentType = ContentType.json; + body = request.postData?.text; + } + FormDataType formDataType = FormDataType.text; + if (request.postData?.mimeType == "application/x-www-form-urlencoded") { + bodyContentType = ContentType.formdata; + var formDataStr = request.postData?.text; + Map<String, String> parsedData = parseFormData(formDataStr); + parsedData.forEach((key, value) { + formDataType = FormDataType.text; + var name = key ?? ""; + var val = value ?? ""; + formData.add(FormDataModel( + name: name, + value: val, + type: formDataType, + )); + }); + } + + if (request.postData?.mimeType == "multipart/form-data") { + bodyContentType = ContentType.formdata; + var name, val; + for (var fd in request.postData?.params ?? <hp.Param>[]) { + name = fd.name; + if (fd.contentType == "text/plain") { + formDataType = FormDataType.text; + val = fd.value; + } else { + formDataType = FormDataType.file; + val = fd.fileName; + } + formData.add(FormDataModel( + name: name, + value: val, + type: formDataType, + )); + } + } + + return HttpRequestModel( + method: method, + url: url, + headers: headers, + params: params, + isHeaderEnabledList: isHeaderEnabledList, + isParamEnabledList: isParamEnabledList, + body: body, + bodyContentType: bodyContentType, + formData: formData); + } + + Map<String, String> parseFormData(String? data) { + // Return an empty map if the input is null or empty + if (data == null || data.isEmpty) { + return {}; + } + // Split the input string into individual key-value pairs + var pairs = data.split('&'); + + // Create a Map to store key-value pairs + Map<String, String> result = {}; + + // Loop through the pairs and split them into keys and values + for (var pair in pairs) { + var keyValue = pair.split('='); + + // Ensure the pair contains both key and value + if (keyValue.length == 2) { + var key = Uri.decodeComponent(keyValue[0]); + var value = Uri.decodeComponent(keyValue[1]); + + result[key] = value; + } + } + + return result; + } +} diff --git a/packages/apidash_core/lib/import_export/import_export.dart b/packages/apidash_core/lib/import_export/import_export.dart index 33762e50c..bf1954557 100644 --- a/packages/apidash_core/lib/import_export/import_export.dart +++ b/packages/apidash_core/lib/import_export/import_export.dart @@ -1,3 +1,4 @@ export 'curl_io.dart'; export 'postman_io.dart'; export 'insomnia_io.dart'; +export 'har_io.dart'; diff --git a/packages/apidash_core/pubspec.yaml b/packages/apidash_core/pubspec.yaml index 13aaea079..935052aec 100644 --- a/packages/apidash_core/pubspec.yaml +++ b/packages/apidash_core/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: path: ../insomnia_collection postman: path: ../postman + har_parser: + path: ../har_parser seed: ^0.0.3 xml: ^6.3.0 diff --git a/packages/apidash_core/pubspec_overrides.yaml b/packages/apidash_core/pubspec_overrides.yaml index 61081fc76..f3858f35b 100644 --- a/packages/apidash_core/pubspec_overrides.yaml +++ b/packages/apidash_core/pubspec_overrides.yaml @@ -1,7 +1,10 @@ +# melos_managed_dependency_overrides: har_parser # melos_managed_dependency_overrides: curl_parser,insomnia_collection,postman,seed dependency_overrides: curl_parser: path: ../curl_parser + har_parser: + path: ..\\har_parser insomnia_collection: path: ../insomnia_collection postman: diff --git a/packages/har_parser/.gitignore b/packages/har_parser/.gitignore new file mode 100644 index 000000000..eb6c05cd3 --- /dev/null +++ b/packages/har_parser/.gitignore @@ -0,0 +1,31 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +build/ diff --git a/packages/har_parser/CHANGELOG.md b/packages/har_parser/CHANGELOG.md new file mode 100644 index 000000000..41cc7d819 --- /dev/null +++ b/packages/har_parser/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/har_parser/LICENSE b/packages/har_parser/LICENSE new file mode 100644 index 000000000..e1622b53f --- /dev/null +++ b/packages/har_parser/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2023 Ashita Prasad, Ankit Mahato + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/packages/har_parser/README.md b/packages/har_parser/README.md new file mode 100644 index 000000000..a9dfc45fa --- /dev/null +++ b/packages/har_parser/README.md @@ -0,0 +1,340 @@ +# insomnia + +Seamlessly convert Har Collection Format v1.2 to Dart. + +Helps you bring your APIs stored in Har to Dart and work with them. + +Currently, this package is being used by [API Dash](https://github.com/foss42/apidash), a beautiful open-source cross-platform (macOS, Windows, Linux, Android & iOS) API Client built using Flutter which can help you easily create & customize your API requests, visually inspect responses and generate API integration code. A lightweight alternative to postman. + +## Usage + +### Example 1: Har collection JSON string to Har model + +```dart +import 'package:har_parser/har_parser.dart'; + +void main() { + // Example 1: Har collection JSON string to Har model + var collectionJsonStr = r''' +{ + "log": { + "version": "1.2", + "creator": {"name": "Postman", "version": "v8.x.x"}, + "entries": [ + { + "startedDateTime": "2025-03-25T12:00:00.000Z", + "time": 100, + "request": { + "method": "GET", + "url": "https://api.apidash.dev", + "headers": [], + "queryString": [], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:01:00.000Z", + "time": 150, + "request": { + "method": "GET", + "url": "https://api.apidash.dev/country/data?code=US", + "headers": [], + "queryString": [ + {"name": "code", "value": "US"} + ], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:02:00.000Z", + "time": 200, + "request": { + "method": "GET", + "url": + "https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true", + "headers": [], + "queryString": [ + {"name": "num", "value": "8700000"}, + {"name": "digits", "value": "3"}, + {"name": "system", "value": "SS"}, + {"name": "add_space", "value": "true"}, + {"name": "trailing_zeros", "value": "true"} + ], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:03:00.000Z", + "time": 300, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/case/lower", + "headers": [], + "queryString": [], + "bodySize": 50, + "postData": { + "mimeType": "application/json", + "text": "{ \"text\": \"I LOVE Flutter\" }" + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:04:00.000Z", + "time": 350, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/io/form", + "headers": [ + {"name": "User-Agent", "value": "Test Agent"} + ], + "queryString": [], + "bodySize": 100, + "postData": { + "mimeType": "multipart/form-data", + "params": [ + {"name": "text", "value": "API", "contentType": "text/plain"}, + {"name": "sep", "value": "|", "contentType": "text/plain"}, + {"name": "times", "value": "3", "contentType": "text/plain"} + ] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:05:00.000Z", + "time": 400, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/io/img", + "headers": [], + "queryString": [], + "bodySize": 150, + "postData": { + "mimeType": "multipart/form-data", + "params": [ + {"name": "token", "value": "xyz", "contentType": "text/plain"}, + { + "name": "imfile", + "fileName": "hire AI.jpeg", + "contentType": "image/jpeg" + } + ] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + } + ] + } + } +'''; + + var collection = harLogFromJsonStr(collectionJsonStr); + + print(collection.log?.creator); + print(collection.log?.entries?[0].startedDateTime); + print(collection.log?.entries?[0].request?.url); +} +``` + +### Example 2: Har collection from JSON + +```dart +import 'package:har_parser/har_parser.dart'; + +void main() { + // Example 2: Har collection from JSON +var collectionJson = { + "log": { + "version": "1.2", + "creator": {"name": "Postman", "version": "v8.x.x"}, + "entries": [ + { + "startedDateTime": "2025-03-25T12:00:00.000Z", + "time": 100, + "request": { + "method": "GET", + "url": "https://api.apidash.dev", + "headers": [], + "queryString": [], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:01:00.000Z", + "time": 150, + "request": { + "method": "GET", + "url": "https://api.apidash.dev/country/data?code=US", + "headers": [], + "queryString": [ + {"name": "code", "value": "US"} + ], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:02:00.000Z", + "time": 200, + "request": { + "method": "GET", + "url": + "https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true", + "headers": [], + "queryString": [ + {"name": "num", "value": "8700000"}, + {"name": "digits", "value": "3"}, + {"name": "system", "value": "SS"}, + {"name": "add_space", "value": "true"}, + {"name": "trailing_zeros", "value": "true"} + ], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:03:00.000Z", + "time": 300, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/case/lower", + "headers": [], + "queryString": [], + "bodySize": 50, + "postData": { + "mimeType": "application/json", + "text": "{ \"text\": \"I LOVE Flutter\" }" + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:04:00.000Z", + "time": 350, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/io/form", + "headers": [ + {"name": "User-Agent", "value": "Test Agent"} + ], + "queryString": [], + "bodySize": 100, + "postData": { + "mimeType": "multipart/form-data", + "params": [ + {"name": "text", "value": "API", "contentType": "text/plain"}, + {"name": "sep", "value": "|", "contentType": "text/plain"}, + {"name": "times", "value": "3", "contentType": "text/plain"} + ] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:05:00.000Z", + "time": 400, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/io/img", + "headers": [], + "queryString": [], + "bodySize": 150, + "postData": { + "mimeType": "multipart/form-data", + "params": [ + {"name": "token", "value": "xyz", "contentType": "text/plain"}, + { + "name": "imfile", + "fileName": "hire AI.jpeg", + "contentType": "image/jpeg" + } + ] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + } + ] + } + }; + + var collection1 = HarLog.fromJson(collectionJson); + print(collection1.log?.creator?.name); + print(collection1.log?.entries?[0].startedDateTime); + print(collection1.log?.entries?[0].request?.url); + +} +``` + +## Maintainer + +- Ashita Prasad ([GitHub](https://github.com/ashitaprasad), [LinkedIn](https://www.linkedin.com/in/ashitaprasad/), [X](https://x.com/ashitaprasad)) +- Mohammed Ayaan (contributor) ([GitHub](https://github.com/ayaan-md-blr)) + +## License + +This project is licensed under the [Apache License 2.0](https://github.com/foss42/apidash/blob/main/packages/har_parser/LICENSE). diff --git a/packages/har_parser/analysis_options.yaml b/packages/har_parser/analysis_options.yaml new file mode 100644 index 000000000..1dea9522d --- /dev/null +++ b/packages/har_parser/analysis_options.yaml @@ -0,0 +1,6 @@ +analyzer: + exclude: + - "**/*.g.dart" + - "**/*.freezed.dart" + errors: + invalid_annotation_target: ignore diff --git a/packages/har_parser/example/har_example.dart b/packages/har_parser/example/har_example.dart new file mode 100644 index 000000000..5d2317027 --- /dev/null +++ b/packages/har_parser/example/har_example.dart @@ -0,0 +1,312 @@ +import 'package:har_parser/har_parser.dart'; + +void main() { + //Example 1 + var collectionJsonStr = r''' +{ + "log": { + "version": "1.2", + "creator": { + "name": "Postman", + "version": "v8.x.x" + }, + "entries": [ + { + "startedDateTime": "2025-03-25T12:00:00.000Z", + "time": 100, + "request": { + "method": "GET", + "url": "https://api.apidash.dev", + "headers": [], + "queryString": [], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:01:00.000Z", + "time": 150, + "request": { + "method": "GET", + "url": "https://api.apidash.dev/country/data?code=US", + "headers": [], + "queryString": [ + { + "name": "code", + "value": "US" + } + ], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:02:00.000Z", + "time": 200, + "request": { + "method": "GET", + "url": "https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true", + "headers": [], + "queryString": [ + { "name": "num", "value": "8700000" }, + { "name": "digits", "value": "3" }, + { "name": "system", "value": "SS" }, + { "name": "add_space", "value": "true" }, + { "name": "trailing_zeros", "value": "true" } + ], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:03:00.000Z", + "time": 300, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/case/lower", + "headers": [], + "queryString": [], + "bodySize": 50, + "postData": { + "mimeType": "application/json", + "text": "{ \"text\": \"I LOVE Flutter\" }" + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:04:00.000Z", + "time": 350, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/io/form", + "headers": [ + { + "name": "User-Agent", + "value": "Test Agent" + } + ], + "queryString": [], + "bodySize": 100, + "postData": { + "mimeType": "multipart/form-data", + "params": [ + { "name": "text", "value": "API", "contentType":"text/plain" }, + { "name": "sep", "value": "|", "contentType":"text/plain" }, + { "name": "times", "value": "3", "contentType":"text/plain" } + ] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + } + , + { + "startedDateTime": "2025-03-25T12:05:00.000Z", + "time": 400, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/io/img", + "headers": [], + "queryString": [], + "bodySize": 150, + "postData": { + "mimeType": "multipart/form-data", + "params": [ + { "name": "token", "value": "xyz", "contentType":"text/plain" }, + { "name": "imfile", "fileName": "hire AI.jpeg", "contentType":"image/jpeg" } + ] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + } + ] + } +} +'''; + + var collection = harLogFromJsonStr(collectionJsonStr); + + print(collection.log?.creator); + print(collection.log?.entries?[0].startedDateTime); + print(collection.log?.entries?[0].request?.url); + + var collectionJson = { + "log": { + "version": "1.2", + "creator": {"name": "Postman", "version": "v8.x.x"}, + "entries": [ + { + "startedDateTime": "2025-03-25T12:00:00.000Z", + "time": 100, + "request": { + "method": "GET", + "url": "https://api.apidash.dev", + "headers": [], + "queryString": [], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:01:00.000Z", + "time": 150, + "request": { + "method": "GET", + "url": "https://api.apidash.dev/country/data?code=US", + "headers": [], + "queryString": [ + {"name": "code", "value": "US"} + ], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:02:00.000Z", + "time": 200, + "request": { + "method": "GET", + "url": + "https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true", + "headers": [], + "queryString": [ + {"name": "num", "value": "8700000"}, + {"name": "digits", "value": "3"}, + {"name": "system", "value": "SS"}, + {"name": "add_space", "value": "true"}, + {"name": "trailing_zeros", "value": "true"} + ], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:03:00.000Z", + "time": 300, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/case/lower", + "headers": [], + "queryString": [], + "bodySize": 50, + "postData": { + "mimeType": "application/json", + "text": "{ \"text\": \"I LOVE Flutter\" }" + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:04:00.000Z", + "time": 350, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/io/form", + "headers": [ + {"name": "User-Agent", "value": "Test Agent"} + ], + "queryString": [], + "bodySize": 100, + "postData": { + "mimeType": "multipart/form-data", + "params": [ + {"name": "text", "value": "API", "contentType": "text/plain"}, + {"name": "sep", "value": "|", "contentType": "text/plain"}, + {"name": "times", "value": "3", "contentType": "text/plain"} + ] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:05:00.000Z", + "time": 400, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/io/img", + "headers": [], + "queryString": [], + "bodySize": 150, + "postData": { + "mimeType": "multipart/form-data", + "params": [ + {"name": "token", "value": "xyz", "contentType": "text/plain"}, + { + "name": "imfile", + "fileName": "hire AI.jpeg", + "contentType": "image/jpeg" + } + ] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + } + ] + } + }; + + var collection1 = HarLog.fromJson(collectionJson); + print(collection1.log?.creator?.name); + print(collection1.log?.entries?[0].startedDateTime); + print(collection1.log?.entries?[0].request?.url); +} diff --git a/packages/har_parser/lib/har_parser.dart b/packages/har_parser/lib/har_parser.dart new file mode 100644 index 000000000..cd7cfb952 --- /dev/null +++ b/packages/har_parser/lib/har_parser.dart @@ -0,0 +1,4 @@ +library har_parser; + +export 'models/models.dart'; +export 'utils/har_parser_utils.dart'; diff --git a/packages/har_parser/lib/models/har_log.dart b/packages/har_parser/lib/models/har_log.dart new file mode 100644 index 000000000..1c33db307 --- /dev/null +++ b/packages/har_parser/lib/models/har_log.dart @@ -0,0 +1,174 @@ +import 'dart:convert'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'har_log.freezed.dart'; +part 'har_log.g.dart'; + +HarLog harLogFromJsonStr(String str) => HarLog.fromJson(json.decode(str)); + +String harLogToJsonStr(HarLog data) => + JsonEncoder.withIndent(' ').convert(data); + +@freezed +class HarLog with _$HarLog { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory HarLog({ + Log? log, + }) = _HarLog; + + factory HarLog.fromJson(Map<String, dynamic> json) => _$HarLogFromJson(json); +} + +@freezed +class Log with _$Log { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory Log({ + String? version, + Creator? creator, + List<Entry>? entries, + }) = _Log; + + factory Log.fromJson(Map<String, dynamic> json) => _$LogFromJson(json); +} + +@freezed +class Creator with _$Creator { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory Creator({ + String? name, + String? version, + }) = _Creator; + + factory Creator.fromJson(Map<String, dynamic> json) => + _$CreatorFromJson(json); +} + +@freezed +class Entry with _$Entry { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory Entry({ + String? startedDateTime, + int? time, + Request? request, + Response? response, + }) = _Entry; + + factory Entry.fromJson(Map<String, dynamic> json) => _$EntryFromJson(json); +} + +@freezed +class Request with _$Request { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory Request({ + String? method, + String? url, + String? httpVersion, + List<dynamic>? cookies, + List<Header>? headers, + List<Query>? queryString, + PostData? postData, + int? headersSize, + int? bodySize, + }) = _Request; + + factory Request.fromJson(Map<String, dynamic> json) => + _$RequestFromJson(json); +} + +@freezed +class PostData with _$PostData { + @JsonSerializable( + explicitToJson: true, + anyMap: true, + includeIfNull: false, + ) + const factory PostData({ + String? mimeType, + String? text, + List<Param>? params, // for multipart/form-data params + }) = _PostData; + + factory PostData.fromJson(Map<String, dynamic> json) => + _$PostDataFromJson(json); +} + +@freezed +class Param with _$Param { + @JsonSerializable( + explicitToJson: true, + anyMap: true, + includeIfNull: false, + ) + const factory Param({ + String? name, + String? value, + String? fileName, + String? contentType, + bool? disabled, + }) = _Param; + + factory Param.fromJson(Map<String, dynamic> json) => _$ParamFromJson(json); +} + +@freezed +class Query with _$Query { + @JsonSerializable( + explicitToJson: true, + anyMap: true, + includeIfNull: false, + ) + const factory Query({ + String? name, + String? value, + bool? disabled, + }) = _Query; + + factory Query.fromJson(Map<String, dynamic> json) => _$QueryFromJson(json); +} + +@freezed +class Header with _$Header { + @JsonSerializable( + explicitToJson: true, + anyMap: true, + includeIfNull: false, + ) + const factory Header({ + String? name, + String? value, + bool? disabled, + }) = _Header; + + factory Header.fromJson(Map<String, dynamic> json) => _$HeaderFromJson(json); +} + +@freezed +class Response with _$Response { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory Response({ + int? status, + String? statusText, + String? httpVersion, + List<dynamic>? cookies, + List<dynamic>? headers, + Content? content, + String? redirectURL, + int? headersSize, + int? bodySize, + }) = _Response; + + factory Response.fromJson(Map<String, dynamic> json) => + _$ResponseFromJson(json); +} + +@freezed +class Content with _$Content { + @JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) + const factory Content({ + int? size, + String? mimeType, + }) = _Content; + + factory Content.fromJson(Map<String, dynamic> json) => + _$ContentFromJson(json); +} diff --git a/packages/har_parser/lib/models/har_log.freezed.dart b/packages/har_parser/lib/models/har_log.freezed.dart new file mode 100644 index 000000000..eb5b7f5ab --- /dev/null +++ b/packages/har_parser/lib/models/har_log.freezed.dart @@ -0,0 +1,2482 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'har_log.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity<T>(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +HarLog _$HarLogFromJson(Map<String, dynamic> json) { + return _HarLog.fromJson(json); +} + +/// @nodoc +mixin _$HarLog { + Log? get log => throw _privateConstructorUsedError; + + /// Serializes this HarLog to a JSON map. + Map<String, dynamic> toJson() => throw _privateConstructorUsedError; + + /// Create a copy of HarLog + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $HarLogCopyWith<HarLog> get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $HarLogCopyWith<$Res> { + factory $HarLogCopyWith(HarLog value, $Res Function(HarLog) then) = + _$HarLogCopyWithImpl<$Res, HarLog>; + @useResult + $Res call({Log? log}); + + $LogCopyWith<$Res>? get log; +} + +/// @nodoc +class _$HarLogCopyWithImpl<$Res, $Val extends HarLog> + implements $HarLogCopyWith<$Res> { + _$HarLogCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of HarLog + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? log = freezed, + }) { + return _then(_value.copyWith( + log: freezed == log + ? _value.log + : log // ignore: cast_nullable_to_non_nullable + as Log?, + ) as $Val); + } + + /// Create a copy of HarLog + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $LogCopyWith<$Res>? get log { + if (_value.log == null) { + return null; + } + + return $LogCopyWith<$Res>(_value.log!, (value) { + return _then(_value.copyWith(log: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$HarLogImplCopyWith<$Res> implements $HarLogCopyWith<$Res> { + factory _$$HarLogImplCopyWith( + _$HarLogImpl value, $Res Function(_$HarLogImpl) then) = + __$$HarLogImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({Log? log}); + + @override + $LogCopyWith<$Res>? get log; +} + +/// @nodoc +class __$$HarLogImplCopyWithImpl<$Res> + extends _$HarLogCopyWithImpl<$Res, _$HarLogImpl> + implements _$$HarLogImplCopyWith<$Res> { + __$$HarLogImplCopyWithImpl( + _$HarLogImpl _value, $Res Function(_$HarLogImpl) _then) + : super(_value, _then); + + /// Create a copy of HarLog + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? log = freezed, + }) { + return _then(_$HarLogImpl( + log: freezed == log + ? _value.log + : log // ignore: cast_nullable_to_non_nullable + as Log?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$HarLogImpl implements _HarLog { + const _$HarLogImpl({this.log}); + + factory _$HarLogImpl.fromJson(Map<String, dynamic> json) => + _$$HarLogImplFromJson(json); + + @override + final Log? log; + + @override + String toString() { + return 'HarLog(log: $log)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$HarLogImpl && + (identical(other.log, log) || other.log == log)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, log); + + /// Create a copy of HarLog + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$HarLogImplCopyWith<_$HarLogImpl> get copyWith => + __$$HarLogImplCopyWithImpl<_$HarLogImpl>(this, _$identity); + + @override + Map<String, dynamic> toJson() { + return _$$HarLogImplToJson( + this, + ); + } +} + +abstract class _HarLog implements HarLog { + const factory _HarLog({final Log? log}) = _$HarLogImpl; + + factory _HarLog.fromJson(Map<String, dynamic> json) = _$HarLogImpl.fromJson; + + @override + Log? get log; + + /// Create a copy of HarLog + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$HarLogImplCopyWith<_$HarLogImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Log _$LogFromJson(Map<String, dynamic> json) { + return _Log.fromJson(json); +} + +/// @nodoc +mixin _$Log { + String? get version => throw _privateConstructorUsedError; + Creator? get creator => throw _privateConstructorUsedError; + List<Entry>? get entries => throw _privateConstructorUsedError; + + /// Serializes this Log to a JSON map. + Map<String, dynamic> toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Log + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $LogCopyWith<Log> get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $LogCopyWith<$Res> { + factory $LogCopyWith(Log value, $Res Function(Log) then) = + _$LogCopyWithImpl<$Res, Log>; + @useResult + $Res call({String? version, Creator? creator, List<Entry>? entries}); + + $CreatorCopyWith<$Res>? get creator; +} + +/// @nodoc +class _$LogCopyWithImpl<$Res, $Val extends Log> implements $LogCopyWith<$Res> { + _$LogCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Log + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? version = freezed, + Object? creator = freezed, + Object? entries = freezed, + }) { + return _then(_value.copyWith( + version: freezed == version + ? _value.version + : version // ignore: cast_nullable_to_non_nullable + as String?, + creator: freezed == creator + ? _value.creator + : creator // ignore: cast_nullable_to_non_nullable + as Creator?, + entries: freezed == entries + ? _value.entries + : entries // ignore: cast_nullable_to_non_nullable + as List<Entry>?, + ) as $Val); + } + + /// Create a copy of Log + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $CreatorCopyWith<$Res>? get creator { + if (_value.creator == null) { + return null; + } + + return $CreatorCopyWith<$Res>(_value.creator!, (value) { + return _then(_value.copyWith(creator: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$LogImplCopyWith<$Res> implements $LogCopyWith<$Res> { + factory _$$LogImplCopyWith(_$LogImpl value, $Res Function(_$LogImpl) then) = + __$$LogImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String? version, Creator? creator, List<Entry>? entries}); + + @override + $CreatorCopyWith<$Res>? get creator; +} + +/// @nodoc +class __$$LogImplCopyWithImpl<$Res> extends _$LogCopyWithImpl<$Res, _$LogImpl> + implements _$$LogImplCopyWith<$Res> { + __$$LogImplCopyWithImpl(_$LogImpl _value, $Res Function(_$LogImpl) _then) + : super(_value, _then); + + /// Create a copy of Log + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? version = freezed, + Object? creator = freezed, + Object? entries = freezed, + }) { + return _then(_$LogImpl( + version: freezed == version + ? _value.version + : version // ignore: cast_nullable_to_non_nullable + as String?, + creator: freezed == creator + ? _value.creator + : creator // ignore: cast_nullable_to_non_nullable + as Creator?, + entries: freezed == entries + ? _value._entries + : entries // ignore: cast_nullable_to_non_nullable + as List<Entry>?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$LogImpl implements _Log { + const _$LogImpl({this.version, this.creator, final List<Entry>? entries}) + : _entries = entries; + + factory _$LogImpl.fromJson(Map<String, dynamic> json) => + _$$LogImplFromJson(json); + + @override + final String? version; + @override + final Creator? creator; + final List<Entry>? _entries; + @override + List<Entry>? get entries { + final value = _entries; + if (value == null) return null; + if (_entries is EqualUnmodifiableListView) return _entries; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + String toString() { + return 'Log(version: $version, creator: $creator, entries: $entries)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LogImpl && + (identical(other.version, version) || other.version == version) && + (identical(other.creator, creator) || other.creator == creator) && + const DeepCollectionEquality().equals(other._entries, _entries)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, version, creator, + const DeepCollectionEquality().hash(_entries)); + + /// Create a copy of Log + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$LogImplCopyWith<_$LogImpl> get copyWith => + __$$LogImplCopyWithImpl<_$LogImpl>(this, _$identity); + + @override + Map<String, dynamic> toJson() { + return _$$LogImplToJson( + this, + ); + } +} + +abstract class _Log implements Log { + const factory _Log( + {final String? version, + final Creator? creator, + final List<Entry>? entries}) = _$LogImpl; + + factory _Log.fromJson(Map<String, dynamic> json) = _$LogImpl.fromJson; + + @override + String? get version; + @override + Creator? get creator; + @override + List<Entry>? get entries; + + /// Create a copy of Log + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$LogImplCopyWith<_$LogImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Creator _$CreatorFromJson(Map<String, dynamic> json) { + return _Creator.fromJson(json); +} + +/// @nodoc +mixin _$Creator { + String? get name => throw _privateConstructorUsedError; + String? get version => throw _privateConstructorUsedError; + + /// Serializes this Creator to a JSON map. + Map<String, dynamic> toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Creator + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $CreatorCopyWith<Creator> get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CreatorCopyWith<$Res> { + factory $CreatorCopyWith(Creator value, $Res Function(Creator) then) = + _$CreatorCopyWithImpl<$Res, Creator>; + @useResult + $Res call({String? name, String? version}); +} + +/// @nodoc +class _$CreatorCopyWithImpl<$Res, $Val extends Creator> + implements $CreatorCopyWith<$Res> { + _$CreatorCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Creator + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = freezed, + Object? version = freezed, + }) { + return _then(_value.copyWith( + name: freezed == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String?, + version: freezed == version + ? _value.version + : version // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$CreatorImplCopyWith<$Res> implements $CreatorCopyWith<$Res> { + factory _$$CreatorImplCopyWith( + _$CreatorImpl value, $Res Function(_$CreatorImpl) then) = + __$$CreatorImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String? name, String? version}); +} + +/// @nodoc +class __$$CreatorImplCopyWithImpl<$Res> + extends _$CreatorCopyWithImpl<$Res, _$CreatorImpl> + implements _$$CreatorImplCopyWith<$Res> { + __$$CreatorImplCopyWithImpl( + _$CreatorImpl _value, $Res Function(_$CreatorImpl) _then) + : super(_value, _then); + + /// Create a copy of Creator + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = freezed, + Object? version = freezed, + }) { + return _then(_$CreatorImpl( + name: freezed == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String?, + version: freezed == version + ? _value.version + : version // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$CreatorImpl implements _Creator { + const _$CreatorImpl({this.name, this.version}); + + factory _$CreatorImpl.fromJson(Map<String, dynamic> json) => + _$$CreatorImplFromJson(json); + + @override + final String? name; + @override + final String? version; + + @override + String toString() { + return 'Creator(name: $name, version: $version)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$CreatorImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.version, version) || other.version == version)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, name, version); + + /// Create a copy of Creator + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$CreatorImplCopyWith<_$CreatorImpl> get copyWith => + __$$CreatorImplCopyWithImpl<_$CreatorImpl>(this, _$identity); + + @override + Map<String, dynamic> toJson() { + return _$$CreatorImplToJson( + this, + ); + } +} + +abstract class _Creator implements Creator { + const factory _Creator({final String? name, final String? version}) = + _$CreatorImpl; + + factory _Creator.fromJson(Map<String, dynamic> json) = _$CreatorImpl.fromJson; + + @override + String? get name; + @override + String? get version; + + /// Create a copy of Creator + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$CreatorImplCopyWith<_$CreatorImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Entry _$EntryFromJson(Map<String, dynamic> json) { + return _Entry.fromJson(json); +} + +/// @nodoc +mixin _$Entry { + String? get startedDateTime => throw _privateConstructorUsedError; + int? get time => throw _privateConstructorUsedError; + Request? get request => throw _privateConstructorUsedError; + Response? get response => throw _privateConstructorUsedError; + + /// Serializes this Entry to a JSON map. + Map<String, dynamic> toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $EntryCopyWith<Entry> get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $EntryCopyWith<$Res> { + factory $EntryCopyWith(Entry value, $Res Function(Entry) then) = + _$EntryCopyWithImpl<$Res, Entry>; + @useResult + $Res call( + {String? startedDateTime, + int? time, + Request? request, + Response? response}); + + $RequestCopyWith<$Res>? get request; + $ResponseCopyWith<$Res>? get response; +} + +/// @nodoc +class _$EntryCopyWithImpl<$Res, $Val extends Entry> + implements $EntryCopyWith<$Res> { + _$EntryCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? startedDateTime = freezed, + Object? time = freezed, + Object? request = freezed, + Object? response = freezed, + }) { + return _then(_value.copyWith( + startedDateTime: freezed == startedDateTime + ? _value.startedDateTime + : startedDateTime // ignore: cast_nullable_to_non_nullable + as String?, + time: freezed == time + ? _value.time + : time // ignore: cast_nullable_to_non_nullable + as int?, + request: freezed == request + ? _value.request + : request // ignore: cast_nullable_to_non_nullable + as Request?, + response: freezed == response + ? _value.response + : response // ignore: cast_nullable_to_non_nullable + as Response?, + ) as $Val); + } + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $RequestCopyWith<$Res>? get request { + if (_value.request == null) { + return null; + } + + return $RequestCopyWith<$Res>(_value.request!, (value) { + return _then(_value.copyWith(request: value) as $Val); + }); + } + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $ResponseCopyWith<$Res>? get response { + if (_value.response == null) { + return null; + } + + return $ResponseCopyWith<$Res>(_value.response!, (value) { + return _then(_value.copyWith(response: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$EntryImplCopyWith<$Res> implements $EntryCopyWith<$Res> { + factory _$$EntryImplCopyWith( + _$EntryImpl value, $Res Function(_$EntryImpl) then) = + __$$EntryImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String? startedDateTime, + int? time, + Request? request, + Response? response}); + + @override + $RequestCopyWith<$Res>? get request; + @override + $ResponseCopyWith<$Res>? get response; +} + +/// @nodoc +class __$$EntryImplCopyWithImpl<$Res> + extends _$EntryCopyWithImpl<$Res, _$EntryImpl> + implements _$$EntryImplCopyWith<$Res> { + __$$EntryImplCopyWithImpl( + _$EntryImpl _value, $Res Function(_$EntryImpl) _then) + : super(_value, _then); + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? startedDateTime = freezed, + Object? time = freezed, + Object? request = freezed, + Object? response = freezed, + }) { + return _then(_$EntryImpl( + startedDateTime: freezed == startedDateTime + ? _value.startedDateTime + : startedDateTime // ignore: cast_nullable_to_non_nullable + as String?, + time: freezed == time + ? _value.time + : time // ignore: cast_nullable_to_non_nullable + as int?, + request: freezed == request + ? _value.request + : request // ignore: cast_nullable_to_non_nullable + as Request?, + response: freezed == response + ? _value.response + : response // ignore: cast_nullable_to_non_nullable + as Response?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$EntryImpl implements _Entry { + const _$EntryImpl( + {this.startedDateTime, this.time, this.request, this.response}); + + factory _$EntryImpl.fromJson(Map<String, dynamic> json) => + _$$EntryImplFromJson(json); + + @override + final String? startedDateTime; + @override + final int? time; + @override + final Request? request; + @override + final Response? response; + + @override + String toString() { + return 'Entry(startedDateTime: $startedDateTime, time: $time, request: $request, response: $response)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$EntryImpl && + (identical(other.startedDateTime, startedDateTime) || + other.startedDateTime == startedDateTime) && + (identical(other.time, time) || other.time == time) && + (identical(other.request, request) || other.request == request) && + (identical(other.response, response) || + other.response == response)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => + Object.hash(runtimeType, startedDateTime, time, request, response); + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$EntryImplCopyWith<_$EntryImpl> get copyWith => + __$$EntryImplCopyWithImpl<_$EntryImpl>(this, _$identity); + + @override + Map<String, dynamic> toJson() { + return _$$EntryImplToJson( + this, + ); + } +} + +abstract class _Entry implements Entry { + const factory _Entry( + {final String? startedDateTime, + final int? time, + final Request? request, + final Response? response}) = _$EntryImpl; + + factory _Entry.fromJson(Map<String, dynamic> json) = _$EntryImpl.fromJson; + + @override + String? get startedDateTime; + @override + int? get time; + @override + Request? get request; + @override + Response? get response; + + /// Create a copy of Entry + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$EntryImplCopyWith<_$EntryImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Request _$RequestFromJson(Map<String, dynamic> json) { + return _Request.fromJson(json); +} + +/// @nodoc +mixin _$Request { + String? get method => throw _privateConstructorUsedError; + String? get url => throw _privateConstructorUsedError; + String? get httpVersion => throw _privateConstructorUsedError; + List<dynamic>? get cookies => throw _privateConstructorUsedError; + List<Header>? get headers => throw _privateConstructorUsedError; + List<Query>? get queryString => throw _privateConstructorUsedError; + PostData? get postData => throw _privateConstructorUsedError; + int? get headersSize => throw _privateConstructorUsedError; + int? get bodySize => throw _privateConstructorUsedError; + + /// Serializes this Request to a JSON map. + Map<String, dynamic> toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Request + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $RequestCopyWith<Request> get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $RequestCopyWith<$Res> { + factory $RequestCopyWith(Request value, $Res Function(Request) then) = + _$RequestCopyWithImpl<$Res, Request>; + @useResult + $Res call( + {String? method, + String? url, + String? httpVersion, + List<dynamic>? cookies, + List<Header>? headers, + List<Query>? queryString, + PostData? postData, + int? headersSize, + int? bodySize}); + + $PostDataCopyWith<$Res>? get postData; +} + +/// @nodoc +class _$RequestCopyWithImpl<$Res, $Val extends Request> + implements $RequestCopyWith<$Res> { + _$RequestCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Request + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? method = freezed, + Object? url = freezed, + Object? httpVersion = freezed, + Object? cookies = freezed, + Object? headers = freezed, + Object? queryString = freezed, + Object? postData = freezed, + Object? headersSize = freezed, + Object? bodySize = freezed, + }) { + return _then(_value.copyWith( + method: freezed == method + ? _value.method + : method // ignore: cast_nullable_to_non_nullable + as String?, + url: freezed == url + ? _value.url + : url // ignore: cast_nullable_to_non_nullable + as String?, + httpVersion: freezed == httpVersion + ? _value.httpVersion + : httpVersion // ignore: cast_nullable_to_non_nullable + as String?, + cookies: freezed == cookies + ? _value.cookies + : cookies // ignore: cast_nullable_to_non_nullable + as List<dynamic>?, + headers: freezed == headers + ? _value.headers + : headers // ignore: cast_nullable_to_non_nullable + as List<Header>?, + queryString: freezed == queryString + ? _value.queryString + : queryString // ignore: cast_nullable_to_non_nullable + as List<Query>?, + postData: freezed == postData + ? _value.postData + : postData // ignore: cast_nullable_to_non_nullable + as PostData?, + headersSize: freezed == headersSize + ? _value.headersSize + : headersSize // ignore: cast_nullable_to_non_nullable + as int?, + bodySize: freezed == bodySize + ? _value.bodySize + : bodySize // ignore: cast_nullable_to_non_nullable + as int?, + ) as $Val); + } + + /// Create a copy of Request + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $PostDataCopyWith<$Res>? get postData { + if (_value.postData == null) { + return null; + } + + return $PostDataCopyWith<$Res>(_value.postData!, (value) { + return _then(_value.copyWith(postData: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$RequestImplCopyWith<$Res> implements $RequestCopyWith<$Res> { + factory _$$RequestImplCopyWith( + _$RequestImpl value, $Res Function(_$RequestImpl) then) = + __$$RequestImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String? method, + String? url, + String? httpVersion, + List<dynamic>? cookies, + List<Header>? headers, + List<Query>? queryString, + PostData? postData, + int? headersSize, + int? bodySize}); + + @override + $PostDataCopyWith<$Res>? get postData; +} + +/// @nodoc +class __$$RequestImplCopyWithImpl<$Res> + extends _$RequestCopyWithImpl<$Res, _$RequestImpl> + implements _$$RequestImplCopyWith<$Res> { + __$$RequestImplCopyWithImpl( + _$RequestImpl _value, $Res Function(_$RequestImpl) _then) + : super(_value, _then); + + /// Create a copy of Request + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? method = freezed, + Object? url = freezed, + Object? httpVersion = freezed, + Object? cookies = freezed, + Object? headers = freezed, + Object? queryString = freezed, + Object? postData = freezed, + Object? headersSize = freezed, + Object? bodySize = freezed, + }) { + return _then(_$RequestImpl( + method: freezed == method + ? _value.method + : method // ignore: cast_nullable_to_non_nullable + as String?, + url: freezed == url + ? _value.url + : url // ignore: cast_nullable_to_non_nullable + as String?, + httpVersion: freezed == httpVersion + ? _value.httpVersion + : httpVersion // ignore: cast_nullable_to_non_nullable + as String?, + cookies: freezed == cookies + ? _value._cookies + : cookies // ignore: cast_nullable_to_non_nullable + as List<dynamic>?, + headers: freezed == headers + ? _value._headers + : headers // ignore: cast_nullable_to_non_nullable + as List<Header>?, + queryString: freezed == queryString + ? _value._queryString + : queryString // ignore: cast_nullable_to_non_nullable + as List<Query>?, + postData: freezed == postData + ? _value.postData + : postData // ignore: cast_nullable_to_non_nullable + as PostData?, + headersSize: freezed == headersSize + ? _value.headersSize + : headersSize // ignore: cast_nullable_to_non_nullable + as int?, + bodySize: freezed == bodySize + ? _value.bodySize + : bodySize // ignore: cast_nullable_to_non_nullable + as int?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$RequestImpl implements _Request { + const _$RequestImpl( + {this.method, + this.url, + this.httpVersion, + final List<dynamic>? cookies, + final List<Header>? headers, + final List<Query>? queryString, + this.postData, + this.headersSize, + this.bodySize}) + : _cookies = cookies, + _headers = headers, + _queryString = queryString; + + factory _$RequestImpl.fromJson(Map<String, dynamic> json) => + _$$RequestImplFromJson(json); + + @override + final String? method; + @override + final String? url; + @override + final String? httpVersion; + final List<dynamic>? _cookies; + @override + List<dynamic>? get cookies { + final value = _cookies; + if (value == null) return null; + if (_cookies is EqualUnmodifiableListView) return _cookies; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + final List<Header>? _headers; + @override + List<Header>? get headers { + final value = _headers; + if (value == null) return null; + if (_headers is EqualUnmodifiableListView) return _headers; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + final List<Query>? _queryString; + @override + List<Query>? get queryString { + final value = _queryString; + if (value == null) return null; + if (_queryString is EqualUnmodifiableListView) return _queryString; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + final PostData? postData; + @override + final int? headersSize; + @override + final int? bodySize; + + @override + String toString() { + return 'Request(method: $method, url: $url, httpVersion: $httpVersion, cookies: $cookies, headers: $headers, queryString: $queryString, postData: $postData, headersSize: $headersSize, bodySize: $bodySize)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$RequestImpl && + (identical(other.method, method) || other.method == method) && + (identical(other.url, url) || other.url == url) && + (identical(other.httpVersion, httpVersion) || + other.httpVersion == httpVersion) && + const DeepCollectionEquality().equals(other._cookies, _cookies) && + const DeepCollectionEquality().equals(other._headers, _headers) && + const DeepCollectionEquality() + .equals(other._queryString, _queryString) && + (identical(other.postData, postData) || + other.postData == postData) && + (identical(other.headersSize, headersSize) || + other.headersSize == headersSize) && + (identical(other.bodySize, bodySize) || + other.bodySize == bodySize)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + method, + url, + httpVersion, + const DeepCollectionEquality().hash(_cookies), + const DeepCollectionEquality().hash(_headers), + const DeepCollectionEquality().hash(_queryString), + postData, + headersSize, + bodySize); + + /// Create a copy of Request + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$RequestImplCopyWith<_$RequestImpl> get copyWith => + __$$RequestImplCopyWithImpl<_$RequestImpl>(this, _$identity); + + @override + Map<String, dynamic> toJson() { + return _$$RequestImplToJson( + this, + ); + } +} + +abstract class _Request implements Request { + const factory _Request( + {final String? method, + final String? url, + final String? httpVersion, + final List<dynamic>? cookies, + final List<Header>? headers, + final List<Query>? queryString, + final PostData? postData, + final int? headersSize, + final int? bodySize}) = _$RequestImpl; + + factory _Request.fromJson(Map<String, dynamic> json) = _$RequestImpl.fromJson; + + @override + String? get method; + @override + String? get url; + @override + String? get httpVersion; + @override + List<dynamic>? get cookies; + @override + List<Header>? get headers; + @override + List<Query>? get queryString; + @override + PostData? get postData; + @override + int? get headersSize; + @override + int? get bodySize; + + /// Create a copy of Request + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$RequestImplCopyWith<_$RequestImpl> get copyWith => + throw _privateConstructorUsedError; +} + +PostData _$PostDataFromJson(Map<String, dynamic> json) { + return _PostData.fromJson(json); +} + +/// @nodoc +mixin _$PostData { + String? get mimeType => throw _privateConstructorUsedError; + String? get text => throw _privateConstructorUsedError; + List<Param>? get params => throw _privateConstructorUsedError; + + /// Serializes this PostData to a JSON map. + Map<String, dynamic> toJson() => throw _privateConstructorUsedError; + + /// Create a copy of PostData + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $PostDataCopyWith<PostData> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PostDataCopyWith<$Res> { + factory $PostDataCopyWith(PostData value, $Res Function(PostData) then) = + _$PostDataCopyWithImpl<$Res, PostData>; + @useResult + $Res call({String? mimeType, String? text, List<Param>? params}); +} + +/// @nodoc +class _$PostDataCopyWithImpl<$Res, $Val extends PostData> + implements $PostDataCopyWith<$Res> { + _$PostDataCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of PostData + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? mimeType = freezed, + Object? text = freezed, + Object? params = freezed, + }) { + return _then(_value.copyWith( + mimeType: freezed == mimeType + ? _value.mimeType + : mimeType // ignore: cast_nullable_to_non_nullable + as String?, + text: freezed == text + ? _value.text + : text // ignore: cast_nullable_to_non_nullable + as String?, + params: freezed == params + ? _value.params + : params // ignore: cast_nullable_to_non_nullable + as List<Param>?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$PostDataImplCopyWith<$Res> + implements $PostDataCopyWith<$Res> { + factory _$$PostDataImplCopyWith( + _$PostDataImpl value, $Res Function(_$PostDataImpl) then) = + __$$PostDataImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String? mimeType, String? text, List<Param>? params}); +} + +/// @nodoc +class __$$PostDataImplCopyWithImpl<$Res> + extends _$PostDataCopyWithImpl<$Res, _$PostDataImpl> + implements _$$PostDataImplCopyWith<$Res> { + __$$PostDataImplCopyWithImpl( + _$PostDataImpl _value, $Res Function(_$PostDataImpl) _then) + : super(_value, _then); + + /// Create a copy of PostData + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? mimeType = freezed, + Object? text = freezed, + Object? params = freezed, + }) { + return _then(_$PostDataImpl( + mimeType: freezed == mimeType + ? _value.mimeType + : mimeType // ignore: cast_nullable_to_non_nullable + as String?, + text: freezed == text + ? _value.text + : text // ignore: cast_nullable_to_non_nullable + as String?, + params: freezed == params + ? _value._params + : params // ignore: cast_nullable_to_non_nullable + as List<Param>?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$PostDataImpl implements _PostData { + const _$PostDataImpl({this.mimeType, this.text, final List<Param>? params}) + : _params = params; + + factory _$PostDataImpl.fromJson(Map<String, dynamic> json) => + _$$PostDataImplFromJson(json); + + @override + final String? mimeType; + @override + final String? text; + final List<Param>? _params; + @override + List<Param>? get params { + final value = _params; + if (value == null) return null; + if (_params is EqualUnmodifiableListView) return _params; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + String toString() { + return 'PostData(mimeType: $mimeType, text: $text, params: $params)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PostDataImpl && + (identical(other.mimeType, mimeType) || + other.mimeType == mimeType) && + (identical(other.text, text) || other.text == text) && + const DeepCollectionEquality().equals(other._params, _params)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, mimeType, text, + const DeepCollectionEquality().hash(_params)); + + /// Create a copy of PostData + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$PostDataImplCopyWith<_$PostDataImpl> get copyWith => + __$$PostDataImplCopyWithImpl<_$PostDataImpl>(this, _$identity); + + @override + Map<String, dynamic> toJson() { + return _$$PostDataImplToJson( + this, + ); + } +} + +abstract class _PostData implements PostData { + const factory _PostData( + {final String? mimeType, + final String? text, + final List<Param>? params}) = _$PostDataImpl; + + factory _PostData.fromJson(Map<String, dynamic> json) = + _$PostDataImpl.fromJson; + + @override + String? get mimeType; + @override + String? get text; + @override + List<Param>? get params; + + /// Create a copy of PostData + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$PostDataImplCopyWith<_$PostDataImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Param _$ParamFromJson(Map<String, dynamic> json) { + return _Param.fromJson(json); +} + +/// @nodoc +mixin _$Param { + String? get name => throw _privateConstructorUsedError; + String? get value => throw _privateConstructorUsedError; + String? get fileName => throw _privateConstructorUsedError; + String? get contentType => throw _privateConstructorUsedError; + bool? get disabled => throw _privateConstructorUsedError; + + /// Serializes this Param to a JSON map. + Map<String, dynamic> toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Param + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ParamCopyWith<Param> get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ParamCopyWith<$Res> { + factory $ParamCopyWith(Param value, $Res Function(Param) then) = + _$ParamCopyWithImpl<$Res, Param>; + @useResult + $Res call( + {String? name, + String? value, + String? fileName, + String? contentType, + bool? disabled}); +} + +/// @nodoc +class _$ParamCopyWithImpl<$Res, $Val extends Param> + implements $ParamCopyWith<$Res> { + _$ParamCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Param + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = freezed, + Object? value = freezed, + Object? fileName = freezed, + Object? contentType = freezed, + Object? disabled = freezed, + }) { + return _then(_value.copyWith( + name: freezed == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String?, + value: freezed == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String?, + fileName: freezed == fileName + ? _value.fileName + : fileName // ignore: cast_nullable_to_non_nullable + as String?, + contentType: freezed == contentType + ? _value.contentType + : contentType // ignore: cast_nullable_to_non_nullable + as String?, + disabled: freezed == disabled + ? _value.disabled + : disabled // ignore: cast_nullable_to_non_nullable + as bool?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ParamImplCopyWith<$Res> implements $ParamCopyWith<$Res> { + factory _$$ParamImplCopyWith( + _$ParamImpl value, $Res Function(_$ParamImpl) then) = + __$$ParamImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String? name, + String? value, + String? fileName, + String? contentType, + bool? disabled}); +} + +/// @nodoc +class __$$ParamImplCopyWithImpl<$Res> + extends _$ParamCopyWithImpl<$Res, _$ParamImpl> + implements _$$ParamImplCopyWith<$Res> { + __$$ParamImplCopyWithImpl( + _$ParamImpl _value, $Res Function(_$ParamImpl) _then) + : super(_value, _then); + + /// Create a copy of Param + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = freezed, + Object? value = freezed, + Object? fileName = freezed, + Object? contentType = freezed, + Object? disabled = freezed, + }) { + return _then(_$ParamImpl( + name: freezed == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String?, + value: freezed == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String?, + fileName: freezed == fileName + ? _value.fileName + : fileName // ignore: cast_nullable_to_non_nullable + as String?, + contentType: freezed == contentType + ? _value.contentType + : contentType // ignore: cast_nullable_to_non_nullable + as String?, + disabled: freezed == disabled + ? _value.disabled + : disabled // ignore: cast_nullable_to_non_nullable + as bool?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$ParamImpl implements _Param { + const _$ParamImpl( + {this.name, this.value, this.fileName, this.contentType, this.disabled}); + + factory _$ParamImpl.fromJson(Map<String, dynamic> json) => + _$$ParamImplFromJson(json); + + @override + final String? name; + @override + final String? value; + @override + final String? fileName; + @override + final String? contentType; + @override + final bool? disabled; + + @override + String toString() { + return 'Param(name: $name, value: $value, fileName: $fileName, contentType: $contentType, disabled: $disabled)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ParamImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.value, value) || other.value == value) && + (identical(other.fileName, fileName) || + other.fileName == fileName) && + (identical(other.contentType, contentType) || + other.contentType == contentType) && + (identical(other.disabled, disabled) || + other.disabled == disabled)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => + Object.hash(runtimeType, name, value, fileName, contentType, disabled); + + /// Create a copy of Param + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ParamImplCopyWith<_$ParamImpl> get copyWith => + __$$ParamImplCopyWithImpl<_$ParamImpl>(this, _$identity); + + @override + Map<String, dynamic> toJson() { + return _$$ParamImplToJson( + this, + ); + } +} + +abstract class _Param implements Param { + const factory _Param( + {final String? name, + final String? value, + final String? fileName, + final String? contentType, + final bool? disabled}) = _$ParamImpl; + + factory _Param.fromJson(Map<String, dynamic> json) = _$ParamImpl.fromJson; + + @override + String? get name; + @override + String? get value; + @override + String? get fileName; + @override + String? get contentType; + @override + bool? get disabled; + + /// Create a copy of Param + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ParamImplCopyWith<_$ParamImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Query _$QueryFromJson(Map<String, dynamic> json) { + return _Query.fromJson(json); +} + +/// @nodoc +mixin _$Query { + String? get name => throw _privateConstructorUsedError; + String? get value => throw _privateConstructorUsedError; + bool? get disabled => throw _privateConstructorUsedError; + + /// Serializes this Query to a JSON map. + Map<String, dynamic> toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Query + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $QueryCopyWith<Query> get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $QueryCopyWith<$Res> { + factory $QueryCopyWith(Query value, $Res Function(Query) then) = + _$QueryCopyWithImpl<$Res, Query>; + @useResult + $Res call({String? name, String? value, bool? disabled}); +} + +/// @nodoc +class _$QueryCopyWithImpl<$Res, $Val extends Query> + implements $QueryCopyWith<$Res> { + _$QueryCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Query + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = freezed, + Object? value = freezed, + Object? disabled = freezed, + }) { + return _then(_value.copyWith( + name: freezed == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String?, + value: freezed == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String?, + disabled: freezed == disabled + ? _value.disabled + : disabled // ignore: cast_nullable_to_non_nullable + as bool?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$QueryImplCopyWith<$Res> implements $QueryCopyWith<$Res> { + factory _$$QueryImplCopyWith( + _$QueryImpl value, $Res Function(_$QueryImpl) then) = + __$$QueryImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String? name, String? value, bool? disabled}); +} + +/// @nodoc +class __$$QueryImplCopyWithImpl<$Res> + extends _$QueryCopyWithImpl<$Res, _$QueryImpl> + implements _$$QueryImplCopyWith<$Res> { + __$$QueryImplCopyWithImpl( + _$QueryImpl _value, $Res Function(_$QueryImpl) _then) + : super(_value, _then); + + /// Create a copy of Query + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = freezed, + Object? value = freezed, + Object? disabled = freezed, + }) { + return _then(_$QueryImpl( + name: freezed == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String?, + value: freezed == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String?, + disabled: freezed == disabled + ? _value.disabled + : disabled // ignore: cast_nullable_to_non_nullable + as bool?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$QueryImpl implements _Query { + const _$QueryImpl({this.name, this.value, this.disabled}); + + factory _$QueryImpl.fromJson(Map<String, dynamic> json) => + _$$QueryImplFromJson(json); + + @override + final String? name; + @override + final String? value; + @override + final bool? disabled; + + @override + String toString() { + return 'Query(name: $name, value: $value, disabled: $disabled)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$QueryImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.value, value) || other.value == value) && + (identical(other.disabled, disabled) || + other.disabled == disabled)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, name, value, disabled); + + /// Create a copy of Query + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$QueryImplCopyWith<_$QueryImpl> get copyWith => + __$$QueryImplCopyWithImpl<_$QueryImpl>(this, _$identity); + + @override + Map<String, dynamic> toJson() { + return _$$QueryImplToJson( + this, + ); + } +} + +abstract class _Query implements Query { + const factory _Query( + {final String? name, + final String? value, + final bool? disabled}) = _$QueryImpl; + + factory _Query.fromJson(Map<String, dynamic> json) = _$QueryImpl.fromJson; + + @override + String? get name; + @override + String? get value; + @override + bool? get disabled; + + /// Create a copy of Query + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$QueryImplCopyWith<_$QueryImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Header _$HeaderFromJson(Map<String, dynamic> json) { + return _Header.fromJson(json); +} + +/// @nodoc +mixin _$Header { + String? get name => throw _privateConstructorUsedError; + String? get value => throw _privateConstructorUsedError; + bool? get disabled => throw _privateConstructorUsedError; + + /// Serializes this Header to a JSON map. + Map<String, dynamic> toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Header + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $HeaderCopyWith<Header> get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $HeaderCopyWith<$Res> { + factory $HeaderCopyWith(Header value, $Res Function(Header) then) = + _$HeaderCopyWithImpl<$Res, Header>; + @useResult + $Res call({String? name, String? value, bool? disabled}); +} + +/// @nodoc +class _$HeaderCopyWithImpl<$Res, $Val extends Header> + implements $HeaderCopyWith<$Res> { + _$HeaderCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Header + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = freezed, + Object? value = freezed, + Object? disabled = freezed, + }) { + return _then(_value.copyWith( + name: freezed == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String?, + value: freezed == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String?, + disabled: freezed == disabled + ? _value.disabled + : disabled // ignore: cast_nullable_to_non_nullable + as bool?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$HeaderImplCopyWith<$Res> implements $HeaderCopyWith<$Res> { + factory _$$HeaderImplCopyWith( + _$HeaderImpl value, $Res Function(_$HeaderImpl) then) = + __$$HeaderImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String? name, String? value, bool? disabled}); +} + +/// @nodoc +class __$$HeaderImplCopyWithImpl<$Res> + extends _$HeaderCopyWithImpl<$Res, _$HeaderImpl> + implements _$$HeaderImplCopyWith<$Res> { + __$$HeaderImplCopyWithImpl( + _$HeaderImpl _value, $Res Function(_$HeaderImpl) _then) + : super(_value, _then); + + /// Create a copy of Header + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? name = freezed, + Object? value = freezed, + Object? disabled = freezed, + }) { + return _then(_$HeaderImpl( + name: freezed == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String?, + value: freezed == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as String?, + disabled: freezed == disabled + ? _value.disabled + : disabled // ignore: cast_nullable_to_non_nullable + as bool?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$HeaderImpl implements _Header { + const _$HeaderImpl({this.name, this.value, this.disabled}); + + factory _$HeaderImpl.fromJson(Map<String, dynamic> json) => + _$$HeaderImplFromJson(json); + + @override + final String? name; + @override + final String? value; + @override + final bool? disabled; + + @override + String toString() { + return 'Header(name: $name, value: $value, disabled: $disabled)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$HeaderImpl && + (identical(other.name, name) || other.name == name) && + (identical(other.value, value) || other.value == value) && + (identical(other.disabled, disabled) || + other.disabled == disabled)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, name, value, disabled); + + /// Create a copy of Header + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$HeaderImplCopyWith<_$HeaderImpl> get copyWith => + __$$HeaderImplCopyWithImpl<_$HeaderImpl>(this, _$identity); + + @override + Map<String, dynamic> toJson() { + return _$$HeaderImplToJson( + this, + ); + } +} + +abstract class _Header implements Header { + const factory _Header( + {final String? name, + final String? value, + final bool? disabled}) = _$HeaderImpl; + + factory _Header.fromJson(Map<String, dynamic> json) = _$HeaderImpl.fromJson; + + @override + String? get name; + @override + String? get value; + @override + bool? get disabled; + + /// Create a copy of Header + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$HeaderImplCopyWith<_$HeaderImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Response _$ResponseFromJson(Map<String, dynamic> json) { + return _Response.fromJson(json); +} + +/// @nodoc +mixin _$Response { + int? get status => throw _privateConstructorUsedError; + String? get statusText => throw _privateConstructorUsedError; + String? get httpVersion => throw _privateConstructorUsedError; + List<dynamic>? get cookies => throw _privateConstructorUsedError; + List<dynamic>? get headers => throw _privateConstructorUsedError; + Content? get content => throw _privateConstructorUsedError; + String? get redirectURL => throw _privateConstructorUsedError; + int? get headersSize => throw _privateConstructorUsedError; + int? get bodySize => throw _privateConstructorUsedError; + + /// Serializes this Response to a JSON map. + Map<String, dynamic> toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Response + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ResponseCopyWith<Response> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ResponseCopyWith<$Res> { + factory $ResponseCopyWith(Response value, $Res Function(Response) then) = + _$ResponseCopyWithImpl<$Res, Response>; + @useResult + $Res call( + {int? status, + String? statusText, + String? httpVersion, + List<dynamic>? cookies, + List<dynamic>? headers, + Content? content, + String? redirectURL, + int? headersSize, + int? bodySize}); + + $ContentCopyWith<$Res>? get content; +} + +/// @nodoc +class _$ResponseCopyWithImpl<$Res, $Val extends Response> + implements $ResponseCopyWith<$Res> { + _$ResponseCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Response + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = freezed, + Object? statusText = freezed, + Object? httpVersion = freezed, + Object? cookies = freezed, + Object? headers = freezed, + Object? content = freezed, + Object? redirectURL = freezed, + Object? headersSize = freezed, + Object? bodySize = freezed, + }) { + return _then(_value.copyWith( + status: freezed == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as int?, + statusText: freezed == statusText + ? _value.statusText + : statusText // ignore: cast_nullable_to_non_nullable + as String?, + httpVersion: freezed == httpVersion + ? _value.httpVersion + : httpVersion // ignore: cast_nullable_to_non_nullable + as String?, + cookies: freezed == cookies + ? _value.cookies + : cookies // ignore: cast_nullable_to_non_nullable + as List<dynamic>?, + headers: freezed == headers + ? _value.headers + : headers // ignore: cast_nullable_to_non_nullable + as List<dynamic>?, + content: freezed == content + ? _value.content + : content // ignore: cast_nullable_to_non_nullable + as Content?, + redirectURL: freezed == redirectURL + ? _value.redirectURL + : redirectURL // ignore: cast_nullable_to_non_nullable + as String?, + headersSize: freezed == headersSize + ? _value.headersSize + : headersSize // ignore: cast_nullable_to_non_nullable + as int?, + bodySize: freezed == bodySize + ? _value.bodySize + : bodySize // ignore: cast_nullable_to_non_nullable + as int?, + ) as $Val); + } + + /// Create a copy of Response + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $ContentCopyWith<$Res>? get content { + if (_value.content == null) { + return null; + } + + return $ContentCopyWith<$Res>(_value.content!, (value) { + return _then(_value.copyWith(content: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$ResponseImplCopyWith<$Res> + implements $ResponseCopyWith<$Res> { + factory _$$ResponseImplCopyWith( + _$ResponseImpl value, $Res Function(_$ResponseImpl) then) = + __$$ResponseImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int? status, + String? statusText, + String? httpVersion, + List<dynamic>? cookies, + List<dynamic>? headers, + Content? content, + String? redirectURL, + int? headersSize, + int? bodySize}); + + @override + $ContentCopyWith<$Res>? get content; +} + +/// @nodoc +class __$$ResponseImplCopyWithImpl<$Res> + extends _$ResponseCopyWithImpl<$Res, _$ResponseImpl> + implements _$$ResponseImplCopyWith<$Res> { + __$$ResponseImplCopyWithImpl( + _$ResponseImpl _value, $Res Function(_$ResponseImpl) _then) + : super(_value, _then); + + /// Create a copy of Response + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? status = freezed, + Object? statusText = freezed, + Object? httpVersion = freezed, + Object? cookies = freezed, + Object? headers = freezed, + Object? content = freezed, + Object? redirectURL = freezed, + Object? headersSize = freezed, + Object? bodySize = freezed, + }) { + return _then(_$ResponseImpl( + status: freezed == status + ? _value.status + : status // ignore: cast_nullable_to_non_nullable + as int?, + statusText: freezed == statusText + ? _value.statusText + : statusText // ignore: cast_nullable_to_non_nullable + as String?, + httpVersion: freezed == httpVersion + ? _value.httpVersion + : httpVersion // ignore: cast_nullable_to_non_nullable + as String?, + cookies: freezed == cookies + ? _value._cookies + : cookies // ignore: cast_nullable_to_non_nullable + as List<dynamic>?, + headers: freezed == headers + ? _value._headers + : headers // ignore: cast_nullable_to_non_nullable + as List<dynamic>?, + content: freezed == content + ? _value.content + : content // ignore: cast_nullable_to_non_nullable + as Content?, + redirectURL: freezed == redirectURL + ? _value.redirectURL + : redirectURL // ignore: cast_nullable_to_non_nullable + as String?, + headersSize: freezed == headersSize + ? _value.headersSize + : headersSize // ignore: cast_nullable_to_non_nullable + as int?, + bodySize: freezed == bodySize + ? _value.bodySize + : bodySize // ignore: cast_nullable_to_non_nullable + as int?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$ResponseImpl implements _Response { + const _$ResponseImpl( + {this.status, + this.statusText, + this.httpVersion, + final List<dynamic>? cookies, + final List<dynamic>? headers, + this.content, + this.redirectURL, + this.headersSize, + this.bodySize}) + : _cookies = cookies, + _headers = headers; + + factory _$ResponseImpl.fromJson(Map<String, dynamic> json) => + _$$ResponseImplFromJson(json); + + @override + final int? status; + @override + final String? statusText; + @override + final String? httpVersion; + final List<dynamic>? _cookies; + @override + List<dynamic>? get cookies { + final value = _cookies; + if (value == null) return null; + if (_cookies is EqualUnmodifiableListView) return _cookies; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + final List<dynamic>? _headers; + @override + List<dynamic>? get headers { + final value = _headers; + if (value == null) return null; + if (_headers is EqualUnmodifiableListView) return _headers; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + final Content? content; + @override + final String? redirectURL; + @override + final int? headersSize; + @override + final int? bodySize; + + @override + String toString() { + return 'Response(status: $status, statusText: $statusText, httpVersion: $httpVersion, cookies: $cookies, headers: $headers, content: $content, redirectURL: $redirectURL, headersSize: $headersSize, bodySize: $bodySize)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ResponseImpl && + (identical(other.status, status) || other.status == status) && + (identical(other.statusText, statusText) || + other.statusText == statusText) && + (identical(other.httpVersion, httpVersion) || + other.httpVersion == httpVersion) && + const DeepCollectionEquality().equals(other._cookies, _cookies) && + const DeepCollectionEquality().equals(other._headers, _headers) && + (identical(other.content, content) || other.content == content) && + (identical(other.redirectURL, redirectURL) || + other.redirectURL == redirectURL) && + (identical(other.headersSize, headersSize) || + other.headersSize == headersSize) && + (identical(other.bodySize, bodySize) || + other.bodySize == bodySize)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + status, + statusText, + httpVersion, + const DeepCollectionEquality().hash(_cookies), + const DeepCollectionEquality().hash(_headers), + content, + redirectURL, + headersSize, + bodySize); + + /// Create a copy of Response + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ResponseImplCopyWith<_$ResponseImpl> get copyWith => + __$$ResponseImplCopyWithImpl<_$ResponseImpl>(this, _$identity); + + @override + Map<String, dynamic> toJson() { + return _$$ResponseImplToJson( + this, + ); + } +} + +abstract class _Response implements Response { + const factory _Response( + {final int? status, + final String? statusText, + final String? httpVersion, + final List<dynamic>? cookies, + final List<dynamic>? headers, + final Content? content, + final String? redirectURL, + final int? headersSize, + final int? bodySize}) = _$ResponseImpl; + + factory _Response.fromJson(Map<String, dynamic> json) = + _$ResponseImpl.fromJson; + + @override + int? get status; + @override + String? get statusText; + @override + String? get httpVersion; + @override + List<dynamic>? get cookies; + @override + List<dynamic>? get headers; + @override + Content? get content; + @override + String? get redirectURL; + @override + int? get headersSize; + @override + int? get bodySize; + + /// Create a copy of Response + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ResponseImplCopyWith<_$ResponseImpl> get copyWith => + throw _privateConstructorUsedError; +} + +Content _$ContentFromJson(Map<String, dynamic> json) { + return _Content.fromJson(json); +} + +/// @nodoc +mixin _$Content { + int? get size => throw _privateConstructorUsedError; + String? get mimeType => throw _privateConstructorUsedError; + + /// Serializes this Content to a JSON map. + Map<String, dynamic> toJson() => throw _privateConstructorUsedError; + + /// Create a copy of Content + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $ContentCopyWith<Content> get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ContentCopyWith<$Res> { + factory $ContentCopyWith(Content value, $Res Function(Content) then) = + _$ContentCopyWithImpl<$Res, Content>; + @useResult + $Res call({int? size, String? mimeType}); +} + +/// @nodoc +class _$ContentCopyWithImpl<$Res, $Val extends Content> + implements $ContentCopyWith<$Res> { + _$ContentCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of Content + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? size = freezed, + Object? mimeType = freezed, + }) { + return _then(_value.copyWith( + size: freezed == size + ? _value.size + : size // ignore: cast_nullable_to_non_nullable + as int?, + mimeType: freezed == mimeType + ? _value.mimeType + : mimeType // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ContentImplCopyWith<$Res> implements $ContentCopyWith<$Res> { + factory _$$ContentImplCopyWith( + _$ContentImpl value, $Res Function(_$ContentImpl) then) = + __$$ContentImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({int? size, String? mimeType}); +} + +/// @nodoc +class __$$ContentImplCopyWithImpl<$Res> + extends _$ContentCopyWithImpl<$Res, _$ContentImpl> + implements _$$ContentImplCopyWith<$Res> { + __$$ContentImplCopyWithImpl( + _$ContentImpl _value, $Res Function(_$ContentImpl) _then) + : super(_value, _then); + + /// Create a copy of Content + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? size = freezed, + Object? mimeType = freezed, + }) { + return _then(_$ContentImpl( + size: freezed == size + ? _value.size + : size // ignore: cast_nullable_to_non_nullable + as int?, + mimeType: freezed == mimeType + ? _value.mimeType + : mimeType // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true, anyMap: true, includeIfNull: false) +class _$ContentImpl implements _Content { + const _$ContentImpl({this.size, this.mimeType}); + + factory _$ContentImpl.fromJson(Map<String, dynamic> json) => + _$$ContentImplFromJson(json); + + @override + final int? size; + @override + final String? mimeType; + + @override + String toString() { + return 'Content(size: $size, mimeType: $mimeType)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ContentImpl && + (identical(other.size, size) || other.size == size) && + (identical(other.mimeType, mimeType) || + other.mimeType == mimeType)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, size, mimeType); + + /// Create a copy of Content + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ContentImplCopyWith<_$ContentImpl> get copyWith => + __$$ContentImplCopyWithImpl<_$ContentImpl>(this, _$identity); + + @override + Map<String, dynamic> toJson() { + return _$$ContentImplToJson( + this, + ); + } +} + +abstract class _Content implements Content { + const factory _Content({final int? size, final String? mimeType}) = + _$ContentImpl; + + factory _Content.fromJson(Map<String, dynamic> json) = _$ContentImpl.fromJson; + + @override + int? get size; + @override + String? get mimeType; + + /// Create a copy of Content + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ContentImplCopyWith<_$ContentImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/packages/har_parser/lib/models/har_log.g.dart b/packages/har_parser/lib/models/har_log.g.dart new file mode 100644 index 000000000..e383f6a87 --- /dev/null +++ b/packages/har_parser/lib/models/har_log.g.dart @@ -0,0 +1,198 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'har_log.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$HarLogImpl _$$HarLogImplFromJson(Map json) => _$HarLogImpl( + log: json['log'] == null + ? null + : Log.fromJson(Map<String, dynamic>.from(json['log'] as Map)), + ); + +Map<String, dynamic> _$$HarLogImplToJson(_$HarLogImpl instance) => + <String, dynamic>{ + if (instance.log?.toJson() case final value?) 'log': value, + }; + +_$LogImpl _$$LogImplFromJson(Map json) => _$LogImpl( + version: json['version'] as String?, + creator: json['creator'] == null + ? null + : Creator.fromJson(Map<String, dynamic>.from(json['creator'] as Map)), + entries: (json['entries'] as List<dynamic>?) + ?.map((e) => Entry.fromJson(Map<String, dynamic>.from(e as Map))) + .toList(), + ); + +Map<String, dynamic> _$$LogImplToJson(_$LogImpl instance) => <String, dynamic>{ + if (instance.version case final value?) 'version': value, + if (instance.creator?.toJson() case final value?) 'creator': value, + if (instance.entries?.map((e) => e.toJson()).toList() case final value?) + 'entries': value, + }; + +_$CreatorImpl _$$CreatorImplFromJson(Map json) => _$CreatorImpl( + name: json['name'] as String?, + version: json['version'] as String?, + ); + +Map<String, dynamic> _$$CreatorImplToJson(_$CreatorImpl instance) => + <String, dynamic>{ + if (instance.name case final value?) 'name': value, + if (instance.version case final value?) 'version': value, + }; + +_$EntryImpl _$$EntryImplFromJson(Map json) => _$EntryImpl( + startedDateTime: json['startedDateTime'] as String?, + time: (json['time'] as num?)?.toInt(), + request: json['request'] == null + ? null + : Request.fromJson(Map<String, dynamic>.from(json['request'] as Map)), + response: json['response'] == null + ? null + : Response.fromJson( + Map<String, dynamic>.from(json['response'] as Map)), + ); + +Map<String, dynamic> _$$EntryImplToJson(_$EntryImpl instance) => + <String, dynamic>{ + if (instance.startedDateTime case final value?) 'startedDateTime': value, + if (instance.time case final value?) 'time': value, + if (instance.request?.toJson() case final value?) 'request': value, + if (instance.response?.toJson() case final value?) 'response': value, + }; + +_$RequestImpl _$$RequestImplFromJson(Map json) => _$RequestImpl( + method: json['method'] as String?, + url: json['url'] as String?, + httpVersion: json['httpVersion'] as String?, + cookies: json['cookies'] as List<dynamic>?, + headers: (json['headers'] as List<dynamic>?) + ?.map((e) => Header.fromJson(Map<String, dynamic>.from(e as Map))) + .toList(), + queryString: (json['queryString'] as List<dynamic>?) + ?.map((e) => Query.fromJson(Map<String, dynamic>.from(e as Map))) + .toList(), + postData: json['postData'] == null + ? null + : PostData.fromJson( + Map<String, dynamic>.from(json['postData'] as Map)), + headersSize: (json['headersSize'] as num?)?.toInt(), + bodySize: (json['bodySize'] as num?)?.toInt(), + ); + +Map<String, dynamic> _$$RequestImplToJson(_$RequestImpl instance) => + <String, dynamic>{ + if (instance.method case final value?) 'method': value, + if (instance.url case final value?) 'url': value, + if (instance.httpVersion case final value?) 'httpVersion': value, + if (instance.cookies case final value?) 'cookies': value, + if (instance.headers?.map((e) => e.toJson()).toList() case final value?) + 'headers': value, + if (instance.queryString?.map((e) => e.toJson()).toList() + case final value?) + 'queryString': value, + if (instance.postData?.toJson() case final value?) 'postData': value, + if (instance.headersSize case final value?) 'headersSize': value, + if (instance.bodySize case final value?) 'bodySize': value, + }; + +_$PostDataImpl _$$PostDataImplFromJson(Map json) => _$PostDataImpl( + mimeType: json['mimeType'] as String?, + text: json['text'] as String?, + params: (json['params'] as List<dynamic>?) + ?.map((e) => Param.fromJson(Map<String, dynamic>.from(e as Map))) + .toList(), + ); + +Map<String, dynamic> _$$PostDataImplToJson(_$PostDataImpl instance) => + <String, dynamic>{ + if (instance.mimeType case final value?) 'mimeType': value, + if (instance.text case final value?) 'text': value, + if (instance.params?.map((e) => e.toJson()).toList() case final value?) + 'params': value, + }; + +_$ParamImpl _$$ParamImplFromJson(Map json) => _$ParamImpl( + name: json['name'] as String?, + value: json['value'] as String?, + fileName: json['fileName'] as String?, + contentType: json['contentType'] as String?, + disabled: json['disabled'] as bool?, + ); + +Map<String, dynamic> _$$ParamImplToJson(_$ParamImpl instance) => + <String, dynamic>{ + if (instance.name case final value?) 'name': value, + if (instance.value case final value?) 'value': value, + if (instance.fileName case final value?) 'fileName': value, + if (instance.contentType case final value?) 'contentType': value, + if (instance.disabled case final value?) 'disabled': value, + }; + +_$QueryImpl _$$QueryImplFromJson(Map json) => _$QueryImpl( + name: json['name'] as String?, + value: json['value'] as String?, + disabled: json['disabled'] as bool?, + ); + +Map<String, dynamic> _$$QueryImplToJson(_$QueryImpl instance) => + <String, dynamic>{ + if (instance.name case final value?) 'name': value, + if (instance.value case final value?) 'value': value, + if (instance.disabled case final value?) 'disabled': value, + }; + +_$HeaderImpl _$$HeaderImplFromJson(Map json) => _$HeaderImpl( + name: json['name'] as String?, + value: json['value'] as String?, + disabled: json['disabled'] as bool?, + ); + +Map<String, dynamic> _$$HeaderImplToJson(_$HeaderImpl instance) => + <String, dynamic>{ + if (instance.name case final value?) 'name': value, + if (instance.value case final value?) 'value': value, + if (instance.disabled case final value?) 'disabled': value, + }; + +_$ResponseImpl _$$ResponseImplFromJson(Map json) => _$ResponseImpl( + status: (json['status'] as num?)?.toInt(), + statusText: json['statusText'] as String?, + httpVersion: json['httpVersion'] as String?, + cookies: json['cookies'] as List<dynamic>?, + headers: json['headers'] as List<dynamic>?, + content: json['content'] == null + ? null + : Content.fromJson(Map<String, dynamic>.from(json['content'] as Map)), + redirectURL: json['redirectURL'] as String?, + headersSize: (json['headersSize'] as num?)?.toInt(), + bodySize: (json['bodySize'] as num?)?.toInt(), + ); + +Map<String, dynamic> _$$ResponseImplToJson(_$ResponseImpl instance) => + <String, dynamic>{ + if (instance.status case final value?) 'status': value, + if (instance.statusText case final value?) 'statusText': value, + if (instance.httpVersion case final value?) 'httpVersion': value, + if (instance.cookies case final value?) 'cookies': value, + if (instance.headers case final value?) 'headers': value, + if (instance.content?.toJson() case final value?) 'content': value, + if (instance.redirectURL case final value?) 'redirectURL': value, + if (instance.headersSize case final value?) 'headersSize': value, + if (instance.bodySize case final value?) 'bodySize': value, + }; + +_$ContentImpl _$$ContentImplFromJson(Map json) => _$ContentImpl( + size: (json['size'] as num?)?.toInt(), + mimeType: json['mimeType'] as String?, + ); + +Map<String, dynamic> _$$ContentImplToJson(_$ContentImpl instance) => + <String, dynamic>{ + if (instance.size case final value?) 'size': value, + if (instance.mimeType case final value?) 'mimeType': value, + }; diff --git a/packages/har_parser/lib/models/models.dart b/packages/har_parser/lib/models/models.dart new file mode 100644 index 000000000..f3ea53694 --- /dev/null +++ b/packages/har_parser/lib/models/models.dart @@ -0,0 +1 @@ +export 'har_log.dart'; diff --git a/packages/har_parser/lib/utils/har_parser_utils.dart b/packages/har_parser/lib/utils/har_parser_utils.dart new file mode 100644 index 000000000..aec7bf71e --- /dev/null +++ b/packages/har_parser/lib/utils/har_parser_utils.dart @@ -0,0 +1,24 @@ +import '../models/har_log.dart'; + +List<(String?, Request)> getRequestsFromHarLog(HarLog? hl) { + if (hl == null || hl.log == null || hl.log?.entries == null) { + return []; + } + List<(String?, Request)> requests = []; + if (hl.log?.entries?.isNotEmpty ?? false) + for (var entry in hl.log!.entries!) { + requests.addAll(getRequestsFromHarLogEntry(entry)); + } + return requests; +} + +List<(String?, Request)> getRequestsFromHarLogEntry(Entry? entry) { + if (entry == null) { + return []; + } + List<(String?, Request)> requests = []; + if (entry.request != null) { + requests.add((entry.startedDateTime, entry.request!)); + } + return requests; +} diff --git a/packages/har_parser/pubspec.yaml b/packages/har_parser/pubspec.yaml new file mode 100644 index 000000000..14b9c10a3 --- /dev/null +++ b/packages/har_parser/pubspec.yaml @@ -0,0 +1,25 @@ +name: har_parser +description: "Seamlessly convert har Format to Dart and vice versa." +version: 0.0.1 +homepage: https://github.com/foss42/apidash + +topics: + - har + - api + - rest + - http + - network + +environment: + sdk: ">=3.0.0 <4.0.0" + +dependencies: + freezed_annotation: ^2.4.4 + json_annotation: ^4.9.0 + +dev_dependencies: + build_runner: ^2.4.12 + freezed: ^2.5.7 + json_serializable: ^6.7.1 + lints: ^4.0.0 + test: ^1.24.0 diff --git a/packages/har_parser/test/collection_examples/collection_apidash.dart b/packages/har_parser/test/collection_examples/collection_apidash.dart new file mode 100644 index 000000000..47a1a0a0b --- /dev/null +++ b/packages/har_parser/test/collection_examples/collection_apidash.dart @@ -0,0 +1,332 @@ +var collectionJsonStr = r''' +{ + "log": { + "version": "1.2", + "creator": { + "name": "Postman", + "version": "v8.x.x" + }, + "entries": [ + { + "startedDateTime": "2025-03-25T12:00:00.000Z", + "time": 100, + "request": { + "method": "GET", + "url": "https://api.apidash.dev", + "headers": [], + "queryString": [], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:01:00.000Z", + "time": 150, + "request": { + "method": "GET", + "url": "https://api.apidash.dev/country/data?code=US", + "headers": [], + "queryString": [ + { + "name": "code", + "value": "US" + } + ], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:02:00.000Z", + "time": 200, + "request": { + "method": "GET", + "url": "https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true", + "headers": [], + "queryString": [ + { + "name": "num", + "value": "8700000" + }, + { + "name": "digits", + "value": "3" + }, + { + "name": "system", + "value": "SS" + }, + { + "name": "add_space", + "value": "true" + }, + { + "name": "trailing_zeros", + "value": "true" + } + ], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:03:00.000Z", + "time": 300, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/case/lower", + "headers": [], + "queryString": [], + "postData": { + "mimeType": "application/json", + "text": "{ \"text\": \"I LOVE Flutter\" }" + }, + "bodySize": 50 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:04:00.000Z", + "time": 350, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/io/form", + "headers": [ + { + "name": "User-Agent", + "value": "Test Agent" + } + ], + "queryString": [], + "postData": { + "mimeType": "multipart/form-data", + "params": [ + { + "name": "text", + "value": "API", + "contentType": "text/plain" + }, + { + "name": "sep", + "value": "|", + "contentType": "text/plain" + }, + { + "name": "times", + "value": "3", + "contentType": "text/plain" + } + ] + }, + "bodySize": 100 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:05:00.000Z", + "time": 400, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/io/img", + "headers": [], + "queryString": [], + "postData": { + "mimeType": "multipart/form-data", + "params": [ + { + "name": "token", + "value": "xyz", + "contentType": "text/plain" + }, + { + "name": "imfile", + "fileName": "hire AI.jpeg", + "contentType": "image/jpeg" + } + ] + }, + "bodySize": 150 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + } + ] + } +}'''; + +var collectionJson = { + "log": { + "version": "1.2", + "creator": { + "name": "Postman", + "version": "v8.x.x" + }, + "entries": [ + { + "startedDateTime": "2025-03-25T12:00:00.000Z", + "time": 100, + "request": { + "method": "GET", + "url": "https://api.apidash.dev", + "headers": [], + "queryString": [], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:01:00.000Z", + "time": 150, + "request": { + "method": "GET", + "url": "https://api.apidash.dev/country/data?code=US", + "headers": [], + "queryString": [ + {"name": "code", "value": "US"} + ], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:02:00.000Z", + "time": 200, + "request": { + "method": "GET", + "url": + "https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true", + "headers": [], + "queryString": [ + {"name": "num", "value": "8700000"}, + {"name": "digits", "value": "3"}, + {"name": "system", "value": "SS"}, + {"name": "add_space", "value": "true"}, + {"name": "trailing_zeros", "value": "true"} + ], + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:03:00.000Z", + "time": 300, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/case/lower", + "headers": [], + "queryString": [], + "bodySize": 50, + "postData": { + "mimeType": "application/json", + "text": "{ \"text\": \"I LOVE Flutter\" }" + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:04:00.000Z", + "time": 350, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/io/form", + "headers": [ + {"name": "User-Agent", "value": "Test Agent"} + ], + "queryString": [], + "bodySize": 100, + "postData": { + "mimeType": "multipart/form-data", + "params": [ + {"name": "text", "value": "API", "contentType": "text/plain"}, + {"name": "sep", "value": "|", "contentType": "text/plain"}, + {"name": "times", "value": "3", "contentType": "text/plain"} + ] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + }, + { + "startedDateTime": "2025-03-25T12:05:00.000Z", + "time": 400, + "request": { + "method": "POST", + "url": "https://api.apidash.dev/io/img", + "headers": [], + "queryString": [], + "bodySize": 150, + "postData": { + "mimeType": "multipart/form-data", + "params": [ + {"name": "token", "value": "xyz", "contentType": "text/plain"}, + { + "name": "imfile", + "fileName": "hire AI.jpeg", + "contentType": "image/jpeg" + } + ] + } + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": [], + "bodySize": 0 + } + } + ] + } + }; diff --git a/packages/har_parser/test/har_parser_test.dart b/packages/har_parser/test/har_parser_test.dart new file mode 100644 index 000000000..52d29bd0c --- /dev/null +++ b/packages/har_parser/test/har_parser_test.dart @@ -0,0 +1,25 @@ +import 'package:har_parser/har_parser.dart'; +import 'package:test/test.dart'; + +import 'collection_examples/collection_apidash.dart'; +import 'models/collection_apidash_model.dart'; + +void main() { + group('Har tests', () { + test('API Dash Har Requests from Json String', () { + expect(harLogFromJsonStr(collectionJsonStr), collectionApiDashModel); + }); + + test('API Dash Har Requests from Json', () { + expect(HarLog.fromJson(collectionJson), collectionApiDashModel); + }); + + test('API Dash Har Requests to Json String', () { + expect(harLogToJsonStr(collectionApiDashModel), collectionJsonStr); + }); + + test('API Dash Har Requests to Json', () { + expect(collectionApiDashModel.toJson(), collectionJson); + }); + }); +} diff --git a/packages/har_parser/test/models/collection_apidash_model.dart b/packages/har_parser/test/models/collection_apidash_model.dart new file mode 100644 index 000000000..2705fcc5e --- /dev/null +++ b/packages/har_parser/test/models/collection_apidash_model.dart @@ -0,0 +1,184 @@ +import 'package:har_parser/models/models.dart'; + +var collectionApiDashModel = HarLog( + log: Log( + version: "1.2", + creator: Creator(name: "Postman", version: "v8.x.x"), + entries: [ + Entry( + startedDateTime: "2025-03-25T12:00:00.000Z", + time: 100, + request: Request( + method: "GET", + url: "https://api.apidash.dev", + httpVersion: null, + cookies: null, + headers: [], + queryString: [], + postData: null, + headersSize: null, + bodySize: 0, + ), + response: Response( + status: 200, + statusText: "OK", + httpVersion: null, + cookies: null, + headers: [], + content: null, + redirectURL: null, + headersSize: null, + bodySize: 0, + ), + ), + Entry( + startedDateTime: "2025-03-25T12:01:00.000Z", + time: 150, + request: Request( + method: "GET", + url: "https://api.apidash.dev/country/data?code=US", + httpVersion: null, + cookies: null, + headers: [], + queryString: [Query(name: "code", value: "US", disabled: null)], + postData: null, + headersSize: null, + bodySize: 0, + ), + response: Response( + status: 200, + statusText: "OK", + httpVersion: null, + cookies: null, + headers: [], + content: null, + redirectURL: null, + headersSize: null, + bodySize: 0, + ), + ), + Entry( + startedDateTime: "2025-03-25T12:02:00.000Z", + time: 200, + request: Request( + method: "GET", + url: "https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true", + httpVersion: null, + cookies: null, + headers: [], + queryString: [ + Query(name: "num", value: "8700000", disabled: null), + Query(name: "digits", value: "3", disabled: null), + Query(name: "system", value: "SS", disabled: null), + Query(name: "add_space", value: "true", disabled: null), + Query(name: "trailing_zeros", value: "true", disabled: null) + ], + postData: null, + headersSize: null, + bodySize: 0, + ), + response: Response( + status: 200, + statusText: "OK", + httpVersion: null, + cookies: null, + headers: [], + content: null, + redirectURL: null, + headersSize: null, + bodySize: 0, + ), + ), + Entry( + startedDateTime: "2025-03-25T12:03:00.000Z", + time: 300, + request: Request( + method: "POST", + url: "https://api.apidash.dev/case/lower", + headers: [], + queryString: [], + postData: PostData( + mimeType: "application/json", + text: '{ "text": "I LOVE Flutter" }', + params: null, + ), + bodySize: 50, + ), + response: Response( + status: 200, + statusText: "OK", + httpVersion: null, + cookies: null, + headers: [], + content: null, + redirectURL: null, + headersSize: null, + bodySize: 0, + ), + ), + Entry( + startedDateTime: "2025-03-25T12:04:00.000Z", + time: 350, + request: Request( + method: "POST", + url: "https://api.apidash.dev/io/form", + headers: [Header(name: "User-Agent", value: "Test Agent", disabled: null)], + queryString: [], + bodySize: 100, + postData: PostData( + mimeType: "multipart/form-data", + params: [ + Param(name: "text", value: "API", fileName: null, contentType: "text/plain", disabled: null), + Param(name: "sep", value: "|", fileName: null, contentType: "text/plain", disabled: null), + Param(name: "times", value: "3", fileName: null, contentType: "text/plain", disabled: null) + ], + ), + ), + response: Response( + status: 200, + statusText: "OK", + httpVersion: null, + cookies: null, + headers: [], + content: null, + redirectURL: null, + headersSize: null, + bodySize: 0, + ), + ), + Entry( + startedDateTime: "2025-03-25T12:05:00.000Z", + time: 400, + request: Request( + method: "POST", + url: "https://api.apidash.dev/io/img", + httpVersion: null, + cookies: null, + headers: [], + queryString: [], + postData: PostData( + mimeType: "multipart/form-data", + text: null, + params: [ + Param(name: "token", value: "xyz", fileName: null, contentType: "text/plain", disabled: null), + Param(name: "imfile", value: null, fileName: "hire AI.jpeg", contentType: "image/jpeg", disabled: null) + ], + ), + headersSize: null, + bodySize: 150, + ), + response: Response( + status: 200, + statusText: "OK", + httpVersion: null, + cookies: null, + headers: [], + content: null, + redirectURL: null, + headersSize: null, + bodySize: 0, + ), + ), + ], + ), +); diff --git a/pubspec.lock b/pubspec.lock index 031b24346..9e5528c4d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -663,6 +663,13 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + har_parser: + dependency: transitive + description: + path: "packages/har_parser" + relative: true + source: path + version: "0.0.1" highlighter: dependency: "direct main" description: