apidash_core: networking contents removed & platform-wide changes made

This commit is contained in:
Manas Hejmadi
2025-06-18 00:14:37 +05:30
parent 6558a4028e
commit ee75dd6fed
159 changed files with 170 additions and 2369 deletions

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

View File

@ -1,7 +1,7 @@
import 'package:apidash/models/settings_model.dart';
import 'package:apidash/providers/providers.dart';
import 'package:apidash/services/services.dart';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class CCurlCodeGen {

View File

@ -1,7 +1,7 @@
import 'package:apidash/consts.dart';
import 'package:apidash/models/models.dart';
import 'package:apidash/utils/utils.dart' show getNewUuid;
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'c/curl.dart';
import 'csharp/http_client.dart';
import 'csharp/rest_sharp.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class CSharpHttpClientCodeGen {

View File

@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class CSharpRestSharp {

View File

@ -1,5 +1,5 @@
import 'dart:convert';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:code_builder/code_builder.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:dart_style/dart_style.dart';

View File

@ -1,6 +1,6 @@
import 'dart:convert';
import 'dart:io';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:code_builder/code_builder.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:dart_style/dart_style.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class GoHttpCodeGen {

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class JavaAsyncHttpClientGen {

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
import '../../utils/har_utils.dart';

View File

@ -1,5 +1,5 @@
import 'dart:convert';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class JavaOkHttpCodeGen {

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class JavaUnirestGen {

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
import '../../utils/utils.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
import '../../utils/utils.dart';

View File

@ -1,5 +1,5 @@
import 'dart:io';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class JuliaHttpClientCodeGen {

View File

@ -1,5 +1,5 @@
import 'dart:convert';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class KotlinOkHttpCodeGen {

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
import '../../utils/utils.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import '../../utils/utils.dart';
class HARCodeGen {

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class PHPcURLCodeGen {

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class PhpGuzzleCodeGen {

View File

@ -1,5 +1,5 @@
import 'dart:convert';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class PhpHttpPlugCodeGen {

View File

@ -1,6 +1,6 @@
import 'dart:io';
import 'dart:convert';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class PythonHttpClientCodeGen {

View File

@ -1,5 +1,5 @@
import 'dart:io';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
import '../../utils/utils.dart';
import '../codegen_utils.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
// Note that delete is a special case in Faraday as API Dash supports request

View File

@ -1,3 +1,4 @@
import 'package:better_networking/better_networking.dart';
import 'package:apidash_core/apidash_core.dart';
import 'package:jinja/jinja.dart' as jj;

View File

@ -1,6 +1,6 @@
import 'dart:io';
import 'dart:convert';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
import '../../utils/utils.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
import '../../utils/utils.dart';

View File

@ -1,5 +1,5 @@
import 'dart:core';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class RustHyperCodeGen {

View File

@ -1,6 +1,6 @@
import 'dart:io';
import 'dart:convert';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
class RustReqwestCodeGen {

View File

@ -1,6 +1,6 @@
import 'dart:io';
import 'dart:convert';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
import '../../utils/utils.dart';
@ -126,7 +126,8 @@ multipart/form-data; boundary={{boundary}}''';
Uri? uri = rec.$1;
var method = requestModel.method;
var requestBody = requestModel.body;
if (requestModel.bodyContentType == ContentType.json && requestBody?.isNotEmpty == true){
if (requestModel.bodyContentType == ContentType.json &&
requestBody?.isNotEmpty == true) {
result += kJsonImport;
}
if (uri != null) {
@ -136,8 +137,7 @@ multipart/form-data; boundary={{boundary}}''';
'isFormDataRequest': requestModel.hasFormData,
"method": requestModel.method.name.toLowerCase()
});
if (kMethodsWithBody.contains(method) && requestBody != null) {
var contentLength = utf8.encode(requestBody).length;
if (contentLength > 0) {

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
import 'package:path/path.dart' as path;

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:jinja/jinja.dart' as jj;
import 'package:path/path.dart' as path;
@ -96,22 +96,22 @@ task.resume()
semaphore.wait()
""";
String? getCode(HttpRequestModel requestModel) {
try {
String result = kTemplateStart;
var rec = getValidRequestUri(requestModel.url, requestModel.enabledParams);
var rec =
getValidRequestUri(requestModel.url, requestModel.enabledParams);
Uri? uri = rec.$1;
if (requestModel.hasFormData) {
result += kTemplateFormDataImport;
var formDataList = requestModel.formDataMapList.map((param) {
if (param['type'] == 'file') {
final filePath = param['value'] as String;
final fileName = path.basename(filePath);
final fileExtension =
final fileExtension =
path.extension(fileName).toLowerCase().replaceFirst('.', '');
return {
'type': 'file',
@ -133,20 +133,16 @@ semaphore.wait()
result += templateFormData.render({
"formData": formDataList,
});
}
}
// Handle JSON data
else if (requestModel.hasJsonData) {
var templateJsonData = jj.Template(kTemplateJsonData);
result += templateJsonData.render({
"jsonData": requestModel.body!
});
}
result += templateJsonData.render({"jsonData": requestModel.body!});
}
// Handle text data
else if (requestModel.hasTextData) {
var templateTextData = jj.Template(kTemplateTextData);
result += templateTextData.render({
"textData": requestModel.body!
});
result += templateTextData.render({"textData": requestModel.body!});
}
var templateRequest = jj.Template(kTemplateRequest);
@ -157,11 +153,11 @@ semaphore.wait()
var headers = requestModel.enabledHeadersMap;
if (requestModel.hasFormData) {
headers['Content-Type'] =
headers['Content-Type'] =
"multipart/form-data; boundary=\\(boundary.stringValue)";
} else if(requestModel.hasJsonData||requestModel.hasTextData){
} else if (requestModel.hasJsonData || requestModel.hasTextData) {
headers['Content-Type'] = 'application/json';
}
}
if (headers.isNotEmpty) {
var templateHeader = jj.Template(kTemplateHeaders);

View File

@ -1,6 +1,6 @@
import 'dart:io';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

View File

@ -1,5 +1,6 @@
import 'package:apidash/consts.dart';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
class Importer {
Future<List<(String?, HttpRequestModel)>?> getHttpRequestModelList(

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
part 'history_meta_model.freezed.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'models.dart';
part 'history_request_model.freezed.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
part 'request_model.freezed.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:flutter/material.dart';
import 'package:apidash/consts.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:apidash/consts.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../models/models.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:apidash/providers/providers.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:apidash/widgets/widgets.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

View File

@ -1,5 +1,5 @@
import 'dart:math';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

View File

@ -1,5 +1,5 @@
import 'dart:math';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

View File

@ -1,5 +1,5 @@
import 'dart:math';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:apidash/providers/providers.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../models/models.dart';

View File

@ -1,6 +1,7 @@
import 'dart:typed_data';
import 'dart:convert';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:intl/intl.dart';
String humanizeDate(DateTime? date) {

View File

@ -1,4 +1,5 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash/consts.dart';
String getEnvironmentTitle(String? name) {

View File

@ -5,7 +5,7 @@ import 'dart:convert';
import 'package:apidash/consts.dart';
import 'package:apidash/utils/utils.dart' show getNewUuid, getFilenameFromPath;
import 'package:apidash/models/models.dart';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:package_info_plus/package_info_plus.dart';
Future<Map<String, dynamic>> collectionToHAR(

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import '../consts.dart';
String getRequestTitleFromUrl(String? url) {

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import '../consts.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:apidash/models/models.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:apidash/consts.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:apidash/utils/utils.dart';

View File

@ -1,5 +1,5 @@
import 'package:apidash/consts.dart';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';

View File

@ -1,5 +1,5 @@
import 'dart:convert';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:jinja/jinja.dart' as jj;

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:flutter/material.dart';
import 'package:highlighter/highlighter.dart' show highlight, Node;
import 'package:apidash/consts.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash/models/models.dart';
import 'package:apidash/utils/utils.dart';
import 'package:apidash/consts.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:apidash/consts.dart';
import 'button_copy.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:data_table_2/data_table_2.dart';

View File

@ -1,4 +1,4 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart';
import 'package:apidash/utils/utils.dart';

View File

@ -3,9 +3,8 @@ library apidash_core;
export 'consts.dart';
export 'extensions/extensions.dart';
export 'models/models.dart';
export 'utils/utils.dart';
export 'services/services.dart';
export 'import_export/import_export.dart';
export 'utils/utils.dart';
// Export 3rd party packages
export 'package:collection/collection.dart';

View File

@ -1,98 +1 @@
import 'dart:convert';
enum APIType {
rest("HTTP", "HTTP"),
graphql("GraphQL", "GQL");
const APIType(this.label, this.abbr);
final String label;
final String abbr;
}
enum EnvironmentVariableType { variable, secret }
enum HTTPVerb {
get("GET"),
head("HEAD"),
post("POST"),
put("PUT"),
patch("PAT"),
delete("DEL"),
options("OPT");
const HTTPVerb(this.abbr);
final String abbr;
}
enum SupportedUriSchemes { https, http }
final kSupportedUriSchemes =
SupportedUriSchemes.values.map((i) => i.name).toList();
const kDefaultUriScheme = SupportedUriSchemes.https;
final kLocalhostRegex = RegExp(r'^localhost(:\d+)?(/.*)?$');
final kIPHostRegex =
RegExp(r'^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}(:\d+)?(/.*)?$');
const kMethodsWithBody = [
HTTPVerb.post,
HTTPVerb.put,
HTTPVerb.patch,
HTTPVerb.delete,
];
const kDefaultHttpMethod = HTTPVerb.get;
const kDefaultContentType = ContentType.json;
const kTypeApplication = 'application';
// application
const kSubTypeJson = 'json';
const kSubTypeOctetStream = 'octet-stream';
const kSubTypePdf = 'pdf';
const kSubTypeSql = 'sql';
const kSubTypeXml = 'xml';
const kSubTypeYaml = 'yaml';
const kSubTypeXYaml = 'x-yaml';
const kSubTypeYml = 'x-yml';
const kSubTypeXWwwFormUrlencoded = 'x-www-form-urlencoded';
const kTypeText = 'text';
// text
const kSubTypeCss = 'css';
const kSubTypeCsv = 'csv';
const kSubTypeHtml = 'html';
const kSubTypeJavascript = 'javascript';
const kSubTypeMarkdown = 'markdown';
const kSubTypePlain = 'plain';
const kSubTypeTextXml = 'xml';
const kSubTypeTextYaml = 'yaml';
const kSubTypeTextYml = 'yml';
const kTypeImage = 'image';
//image
const kSubTypeSvg = 'svg+xml';
const kTypeAudio = 'audio';
const kTypeVideo = 'video';
const kTypeMultipart = "multipart";
const kSubTypeFormData = "form-data";
const kSubTypeDefaultViewOptions = 'all';
enum ContentType {
json("$kTypeApplication/$kSubTypeJson"),
text("$kTypeText/$kSubTypePlain"),
formdata("$kTypeMultipart/$kSubTypeFormData");
const ContentType(this.header);
final String header;
}
const JsonEncoder kJsonEncoder = JsonEncoder.withIndent(' ');
const JsonDecoder kJsonDecoder = JsonDecoder();
const LineSplitter kSplitter = LineSplitter();
const kCodeCharsPerLineLimit = 200;
const kHeaderContentType = "Content-Type";
const kMsgRequestCancelled = 'Request Cancelled';

View File

@ -1,2 +1 @@
export 'string_extensions.dart';
export 'map_extensions.dart';

View File

@ -1,32 +0,0 @@
import 'dart:io';
extension MapExtension on Map {
bool hasKeyContentType() {
return keys.any((k) => (k is String)
? k.toLowerCase() == HttpHeaders.contentTypeHeader
: false);
}
String? getKeyContentType() {
if (isEmpty) {
return null;
}
bool present = hasKeyContentType();
if (present) {
return keys.firstWhere((e) => (e is String)
? e.toLowerCase() == HttpHeaders.contentTypeHeader
: false);
}
return null;
}
String? getValueContentType() {
return this[getKeyContentType()];
}
Map removeKeyContentType() {
removeWhere(
(key, value) => key.toLowerCase() == HttpHeaders.contentTypeHeader);
return this;
}
}

View File

@ -1,7 +1,5 @@
import 'package:better_networking/better_networking.dart';
import 'package:curl_parser/curl_parser.dart';
import '../consts.dart';
import '../models/models.dart';
import '../utils/utils.dart';
class CurlIO {
List<HttpRequestModel>? getHttpRequestModelList(String content) {

View File

@ -1,9 +1,9 @@
import 'package:better_networking/better_networking.dart';
import 'package:flutter/material.dart';
import 'package:insomnia_collection/insomnia_collection.dart';
import 'package:seed/seed.dart';
import '../consts.dart';
import '../models/models.dart';
import '../utils/utils.dart';
class InsomniaIO {
List<(String?, HttpRequestModel)>? getHttpRequestModelList(String content) {

View File

@ -1,8 +1,5 @@
import 'package:better_networking/better_networking.dart';
import 'package:postman/postman.dart' as pm;
import 'package:seed/seed.dart';
import '../consts.dart';
import '../models/models.dart';
import '../utils/utils.dart';
class PostmanIO {
List<(String?, HttpRequestModel)>? getHttpRequestModelList(String content) {

View File

@ -1,71 +0,0 @@
import 'dart:convert';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:seed/seed.dart';
import '../extensions/extensions.dart';
import '../utils/utils.dart'
show rowsToFormDataMapList, rowsToMap, getEnabledRows;
import '../consts.dart';
part 'http_request_model.freezed.dart';
part 'http_request_model.g.dart';
@freezed
class HttpRequestModel with _$HttpRequestModel {
const HttpRequestModel._();
@JsonSerializable(
explicitToJson: true,
anyMap: true,
)
const factory HttpRequestModel({
@Default(HTTPVerb.get) HTTPVerb method,
@Default("") String url,
List<NameValueModel>? headers,
List<NameValueModel>? params,
List<bool>? isHeaderEnabledList,
List<bool>? isParamEnabledList,
@Default(ContentType.json) ContentType bodyContentType,
String? body,
String? query,
List<FormDataModel>? formData,
}) = _HttpRequestModel;
factory HttpRequestModel.fromJson(Map<String, Object?> json) =>
_$HttpRequestModelFromJson(json);
Map<String, String> get headersMap => rowsToMap(headers) ?? {};
Map<String, String> get paramsMap => rowsToMap(params) ?? {};
List<NameValueModel>? get enabledHeaders =>
getEnabledRows(headers, isHeaderEnabledList);
List<NameValueModel>? get enabledParams =>
getEnabledRows(params, isParamEnabledList);
Map<String, String> get enabledHeadersMap => rowsToMap(enabledHeaders) ?? {};
Map<String, String> get enabledParamsMap => rowsToMap(enabledParams) ?? {};
bool get hasContentTypeHeader => enabledHeadersMap.hasKeyContentType();
bool get hasFormDataContentType => bodyContentType == ContentType.formdata;
bool get hasJsonContentType => bodyContentType == ContentType.json;
bool get hasTextContentType => bodyContentType == ContentType.text;
int get contentLength => utf8.encode(body ?? "").length;
bool get hasBody => hasJsonData || hasTextData || hasFormData;
bool get hasJsonData =>
kMethodsWithBody.contains(method) &&
hasJsonContentType &&
contentLength > 0;
bool get hasTextData =>
kMethodsWithBody.contains(method) &&
hasTextContentType &&
contentLength > 0;
bool get hasFormData =>
kMethodsWithBody.contains(method) &&
hasFormDataContentType &&
formDataMapList.isNotEmpty;
bool get hasQuery => query?.isNotEmpty ?? false;
List<FormDataModel> get formDataList => formData ?? <FormDataModel>[];
List<Map<String, String>> get formDataMapList =>
rowsToFormDataMapList(formDataList) ?? [];
bool get hasFileInFormData => formDataList
.map((e) => e.type == FormDataType.file)
.any((element) => element);
}

View File

@ -1,415 +0,0 @@
// 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 'http_request_model.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');
HttpRequestModel _$HttpRequestModelFromJson(Map<String, dynamic> json) {
return _HttpRequestModel.fromJson(json);
}
/// @nodoc
mixin _$HttpRequestModel {
HTTPVerb get method => throw _privateConstructorUsedError;
String get url => throw _privateConstructorUsedError;
List<NameValueModel>? get headers => throw _privateConstructorUsedError;
List<NameValueModel>? get params => throw _privateConstructorUsedError;
List<bool>? get isHeaderEnabledList => throw _privateConstructorUsedError;
List<bool>? get isParamEnabledList => throw _privateConstructorUsedError;
ContentType get bodyContentType => throw _privateConstructorUsedError;
String? get body => throw _privateConstructorUsedError;
String? get query => throw _privateConstructorUsedError;
List<FormDataModel>? get formData => throw _privateConstructorUsedError;
/// Serializes this HttpRequestModel to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of HttpRequestModel
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$HttpRequestModelCopyWith<HttpRequestModel> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $HttpRequestModelCopyWith<$Res> {
factory $HttpRequestModelCopyWith(
HttpRequestModel value, $Res Function(HttpRequestModel) then) =
_$HttpRequestModelCopyWithImpl<$Res, HttpRequestModel>;
@useResult
$Res call(
{HTTPVerb method,
String url,
List<NameValueModel>? headers,
List<NameValueModel>? params,
List<bool>? isHeaderEnabledList,
List<bool>? isParamEnabledList,
ContentType bodyContentType,
String? body,
String? query,
List<FormDataModel>? formData});
}
/// @nodoc
class _$HttpRequestModelCopyWithImpl<$Res, $Val extends HttpRequestModel>
implements $HttpRequestModelCopyWith<$Res> {
_$HttpRequestModelCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of HttpRequestModel
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? method = null,
Object? url = null,
Object? headers = freezed,
Object? params = freezed,
Object? isHeaderEnabledList = freezed,
Object? isParamEnabledList = freezed,
Object? bodyContentType = null,
Object? body = freezed,
Object? query = freezed,
Object? formData = freezed,
}) {
return _then(_value.copyWith(
method: null == method
? _value.method
: method // ignore: cast_nullable_to_non_nullable
as HTTPVerb,
url: null == url
? _value.url
: url // ignore: cast_nullable_to_non_nullable
as String,
headers: freezed == headers
? _value.headers
: headers // ignore: cast_nullable_to_non_nullable
as List<NameValueModel>?,
params: freezed == params
? _value.params
: params // ignore: cast_nullable_to_non_nullable
as List<NameValueModel>?,
isHeaderEnabledList: freezed == isHeaderEnabledList
? _value.isHeaderEnabledList
: isHeaderEnabledList // ignore: cast_nullable_to_non_nullable
as List<bool>?,
isParamEnabledList: freezed == isParamEnabledList
? _value.isParamEnabledList
: isParamEnabledList // ignore: cast_nullable_to_non_nullable
as List<bool>?,
bodyContentType: null == bodyContentType
? _value.bodyContentType
: bodyContentType // ignore: cast_nullable_to_non_nullable
as ContentType,
body: freezed == body
? _value.body
: body // ignore: cast_nullable_to_non_nullable
as String?,
query: freezed == query
? _value.query
: query // ignore: cast_nullable_to_non_nullable
as String?,
formData: freezed == formData
? _value.formData
: formData // ignore: cast_nullable_to_non_nullable
as List<FormDataModel>?,
) as $Val);
}
}
/// @nodoc
abstract class _$$HttpRequestModelImplCopyWith<$Res>
implements $HttpRequestModelCopyWith<$Res> {
factory _$$HttpRequestModelImplCopyWith(_$HttpRequestModelImpl value,
$Res Function(_$HttpRequestModelImpl) then) =
__$$HttpRequestModelImplCopyWithImpl<$Res>;
@override
@useResult
$Res call(
{HTTPVerb method,
String url,
List<NameValueModel>? headers,
List<NameValueModel>? params,
List<bool>? isHeaderEnabledList,
List<bool>? isParamEnabledList,
ContentType bodyContentType,
String? body,
String? query,
List<FormDataModel>? formData});
}
/// @nodoc
class __$$HttpRequestModelImplCopyWithImpl<$Res>
extends _$HttpRequestModelCopyWithImpl<$Res, _$HttpRequestModelImpl>
implements _$$HttpRequestModelImplCopyWith<$Res> {
__$$HttpRequestModelImplCopyWithImpl(_$HttpRequestModelImpl _value,
$Res Function(_$HttpRequestModelImpl) _then)
: super(_value, _then);
/// Create a copy of HttpRequestModel
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? method = null,
Object? url = null,
Object? headers = freezed,
Object? params = freezed,
Object? isHeaderEnabledList = freezed,
Object? isParamEnabledList = freezed,
Object? bodyContentType = null,
Object? body = freezed,
Object? query = freezed,
Object? formData = freezed,
}) {
return _then(_$HttpRequestModelImpl(
method: null == method
? _value.method
: method // ignore: cast_nullable_to_non_nullable
as HTTPVerb,
url: null == url
? _value.url
: url // ignore: cast_nullable_to_non_nullable
as String,
headers: freezed == headers
? _value._headers
: headers // ignore: cast_nullable_to_non_nullable
as List<NameValueModel>?,
params: freezed == params
? _value._params
: params // ignore: cast_nullable_to_non_nullable
as List<NameValueModel>?,
isHeaderEnabledList: freezed == isHeaderEnabledList
? _value._isHeaderEnabledList
: isHeaderEnabledList // ignore: cast_nullable_to_non_nullable
as List<bool>?,
isParamEnabledList: freezed == isParamEnabledList
? _value._isParamEnabledList
: isParamEnabledList // ignore: cast_nullable_to_non_nullable
as List<bool>?,
bodyContentType: null == bodyContentType
? _value.bodyContentType
: bodyContentType // ignore: cast_nullable_to_non_nullable
as ContentType,
body: freezed == body
? _value.body
: body // ignore: cast_nullable_to_non_nullable
as String?,
query: freezed == query
? _value.query
: query // ignore: cast_nullable_to_non_nullable
as String?,
formData: freezed == formData
? _value._formData
: formData // ignore: cast_nullable_to_non_nullable
as List<FormDataModel>?,
));
}
}
/// @nodoc
@JsonSerializable(explicitToJson: true, anyMap: true)
class _$HttpRequestModelImpl extends _HttpRequestModel {
const _$HttpRequestModelImpl(
{this.method = HTTPVerb.get,
this.url = "",
final List<NameValueModel>? headers,
final List<NameValueModel>? params,
final List<bool>? isHeaderEnabledList,
final List<bool>? isParamEnabledList,
this.bodyContentType = ContentType.json,
this.body,
this.query,
final List<FormDataModel>? formData})
: _headers = headers,
_params = params,
_isHeaderEnabledList = isHeaderEnabledList,
_isParamEnabledList = isParamEnabledList,
_formData = formData,
super._();
factory _$HttpRequestModelImpl.fromJson(Map<String, dynamic> json) =>
_$$HttpRequestModelImplFromJson(json);
@override
@JsonKey()
final HTTPVerb method;
@override
@JsonKey()
final String url;
final List<NameValueModel>? _headers;
@override
List<NameValueModel>? 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<NameValueModel>? _params;
@override
List<NameValueModel>? get params {
final value = _params;
if (value == null) return null;
if (_params is EqualUnmodifiableListView) return _params;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
final List<bool>? _isHeaderEnabledList;
@override
List<bool>? get isHeaderEnabledList {
final value = _isHeaderEnabledList;
if (value == null) return null;
if (_isHeaderEnabledList is EqualUnmodifiableListView)
return _isHeaderEnabledList;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
final List<bool>? _isParamEnabledList;
@override
List<bool>? get isParamEnabledList {
final value = _isParamEnabledList;
if (value == null) return null;
if (_isParamEnabledList is EqualUnmodifiableListView)
return _isParamEnabledList;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
@override
@JsonKey()
final ContentType bodyContentType;
@override
final String? body;
@override
final String? query;
final List<FormDataModel>? _formData;
@override
List<FormDataModel>? get formData {
final value = _formData;
if (value == null) return null;
if (_formData is EqualUnmodifiableListView) return _formData;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
@override
String toString() {
return 'HttpRequestModel(method: $method, url: $url, headers: $headers, params: $params, isHeaderEnabledList: $isHeaderEnabledList, isParamEnabledList: $isParamEnabledList, bodyContentType: $bodyContentType, body: $body, query: $query, formData: $formData)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$HttpRequestModelImpl &&
(identical(other.method, method) || other.method == method) &&
(identical(other.url, url) || other.url == url) &&
const DeepCollectionEquality().equals(other._headers, _headers) &&
const DeepCollectionEquality().equals(other._params, _params) &&
const DeepCollectionEquality()
.equals(other._isHeaderEnabledList, _isHeaderEnabledList) &&
const DeepCollectionEquality()
.equals(other._isParamEnabledList, _isParamEnabledList) &&
(identical(other.bodyContentType, bodyContentType) ||
other.bodyContentType == bodyContentType) &&
(identical(other.body, body) || other.body == body) &&
(identical(other.query, query) || other.query == query) &&
const DeepCollectionEquality().equals(other._formData, _formData));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(
runtimeType,
method,
url,
const DeepCollectionEquality().hash(_headers),
const DeepCollectionEquality().hash(_params),
const DeepCollectionEquality().hash(_isHeaderEnabledList),
const DeepCollectionEquality().hash(_isParamEnabledList),
bodyContentType,
body,
query,
const DeepCollectionEquality().hash(_formData));
/// Create a copy of HttpRequestModel
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$HttpRequestModelImplCopyWith<_$HttpRequestModelImpl> get copyWith =>
__$$HttpRequestModelImplCopyWithImpl<_$HttpRequestModelImpl>(
this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$HttpRequestModelImplToJson(
this,
);
}
}
abstract class _HttpRequestModel extends HttpRequestModel {
const factory _HttpRequestModel(
{final HTTPVerb method,
final String url,
final List<NameValueModel>? headers,
final List<NameValueModel>? params,
final List<bool>? isHeaderEnabledList,
final List<bool>? isParamEnabledList,
final ContentType bodyContentType,
final String? body,
final String? query,
final List<FormDataModel>? formData}) = _$HttpRequestModelImpl;
const _HttpRequestModel._() : super._();
factory _HttpRequestModel.fromJson(Map<String, dynamic> json) =
_$HttpRequestModelImpl.fromJson;
@override
HTTPVerb get method;
@override
String get url;
@override
List<NameValueModel>? get headers;
@override
List<NameValueModel>? get params;
@override
List<bool>? get isHeaderEnabledList;
@override
List<bool>? get isParamEnabledList;
@override
ContentType get bodyContentType;
@override
String? get body;
@override
String? get query;
@override
List<FormDataModel>? get formData;
/// Create a copy of HttpRequestModel
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$HttpRequestModelImplCopyWith<_$HttpRequestModelImpl> get copyWith =>
throw _privateConstructorUsedError;
}

View File

@ -1,68 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'http_request_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_$HttpRequestModelImpl _$$HttpRequestModelImplFromJson(Map json) =>
_$HttpRequestModelImpl(
method: $enumDecodeNullable(_$HTTPVerbEnumMap, json['method']) ??
HTTPVerb.get,
url: json['url'] as String? ?? "",
headers: (json['headers'] as List<dynamic>?)
?.map((e) =>
NameValueModel.fromJson(Map<String, Object?>.from(e as Map)))
.toList(),
params: (json['params'] as List<dynamic>?)
?.map((e) =>
NameValueModel.fromJson(Map<String, Object?>.from(e as Map)))
.toList(),
isHeaderEnabledList: (json['isHeaderEnabledList'] as List<dynamic>?)
?.map((e) => e as bool)
.toList(),
isParamEnabledList: (json['isParamEnabledList'] as List<dynamic>?)
?.map((e) => e as bool)
.toList(),
bodyContentType:
$enumDecodeNullable(_$ContentTypeEnumMap, json['bodyContentType']) ??
ContentType.json,
body: json['body'] as String?,
query: json['query'] as String?,
formData: (json['formData'] as List<dynamic>?)
?.map((e) =>
FormDataModel.fromJson(Map<String, Object?>.from(e as Map)))
.toList(),
);
Map<String, dynamic> _$$HttpRequestModelImplToJson(
_$HttpRequestModelImpl instance) =>
<String, dynamic>{
'method': _$HTTPVerbEnumMap[instance.method]!,
'url': instance.url,
'headers': instance.headers?.map((e) => e.toJson()).toList(),
'params': instance.params?.map((e) => e.toJson()).toList(),
'isHeaderEnabledList': instance.isHeaderEnabledList,
'isParamEnabledList': instance.isParamEnabledList,
'bodyContentType': _$ContentTypeEnumMap[instance.bodyContentType]!,
'body': instance.body,
'query': instance.query,
'formData': instance.formData?.map((e) => e.toJson()).toList(),
};
const _$HTTPVerbEnumMap = {
HTTPVerb.get: 'get',
HTTPVerb.head: 'head',
HTTPVerb.post: 'post',
HTTPVerb.put: 'put',
HTTPVerb.patch: 'patch',
HTTPVerb.delete: 'delete',
HTTPVerb.options: 'options',
};
const _$ContentTypeEnumMap = {
ContentType.json: 'json',
ContentType.text: 'text',
ContentType.formdata: 'formdata',
};

View File

@ -1,88 +0,0 @@
import 'dart:io';
import 'dart:convert';
import 'dart:typed_data';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:collection/collection.dart' show mergeMaps;
import 'package:http/http.dart';
import 'package:http_parser/http_parser.dart';
import '../extensions/extensions.dart';
import '../utils/utils.dart';
import '../consts.dart';
part 'http_response_model.freezed.dart';
part 'http_response_model.g.dart';
class Uint8ListConverter implements JsonConverter<Uint8List?, List<int>?> {
const Uint8ListConverter();
@override
Uint8List? fromJson(List<int>? json) {
return json == null ? null : Uint8List.fromList(json);
}
@override
List<int>? toJson(Uint8List? object) {
return object?.toList();
}
}
class DurationConverter implements JsonConverter<Duration?, int?> {
const DurationConverter();
@override
Duration? fromJson(int? json) {
return json == null ? null : Duration(microseconds: json);
}
@override
int? toJson(Duration? object) {
return object?.inMicroseconds;
}
}
@freezed
class HttpResponseModel with _$HttpResponseModel {
const HttpResponseModel._();
@JsonSerializable(
explicitToJson: true,
anyMap: true,
)
const factory HttpResponseModel({
int? statusCode,
Map<String, String>? headers,
Map<String, String>? requestHeaders,
String? body,
String? formattedBody,
@Uint8ListConverter() Uint8List? bodyBytes,
@DurationConverter() Duration? time,
}) = _HttpResponseModel;
factory HttpResponseModel.fromJson(Map<String, Object?> json) =>
_$HttpResponseModelFromJson(json);
String? get contentType => headers?.getValueContentType();
MediaType? get mediaType => getMediaTypeFromHeaders(headers);
HttpResponseModel fromResponse({
required Response response,
Duration? time,
}) {
final responseHeaders = mergeMaps(
{HttpHeaders.contentLengthHeader: response.contentLength.toString()},
response.headers);
MediaType? mediaType = getMediaTypeFromHeaders(responseHeaders);
final body = (mediaType?.subtype == kSubTypeJson)
? utf8.decode(response.bodyBytes)
: response.body;
return HttpResponseModel(
statusCode: response.statusCode,
headers: responseHeaders,
requestHeaders: response.request?.headers,
body: body,
formattedBody: formatBody(body, mediaType),
bodyBytes: response.bodyBytes,
time: time,
);
}
}

View File

@ -1,327 +0,0 @@
// 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 'http_response_model.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');
HttpResponseModel _$HttpResponseModelFromJson(Map<String, dynamic> json) {
return _HttpResponseModel.fromJson(json);
}
/// @nodoc
mixin _$HttpResponseModel {
int? get statusCode => throw _privateConstructorUsedError;
Map<String, String>? get headers => throw _privateConstructorUsedError;
Map<String, String>? get requestHeaders => throw _privateConstructorUsedError;
String? get body => throw _privateConstructorUsedError;
String? get formattedBody => throw _privateConstructorUsedError;
@Uint8ListConverter()
Uint8List? get bodyBytes => throw _privateConstructorUsedError;
@DurationConverter()
Duration? get time => throw _privateConstructorUsedError;
/// Serializes this HttpResponseModel to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of HttpResponseModel
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$HttpResponseModelCopyWith<HttpResponseModel> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $HttpResponseModelCopyWith<$Res> {
factory $HttpResponseModelCopyWith(
HttpResponseModel value, $Res Function(HttpResponseModel) then) =
_$HttpResponseModelCopyWithImpl<$Res, HttpResponseModel>;
@useResult
$Res call(
{int? statusCode,
Map<String, String>? headers,
Map<String, String>? requestHeaders,
String? body,
String? formattedBody,
@Uint8ListConverter() Uint8List? bodyBytes,
@DurationConverter() Duration? time});
}
/// @nodoc
class _$HttpResponseModelCopyWithImpl<$Res, $Val extends HttpResponseModel>
implements $HttpResponseModelCopyWith<$Res> {
_$HttpResponseModelCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of HttpResponseModel
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? statusCode = freezed,
Object? headers = freezed,
Object? requestHeaders = freezed,
Object? body = freezed,
Object? formattedBody = freezed,
Object? bodyBytes = freezed,
Object? time = freezed,
}) {
return _then(_value.copyWith(
statusCode: freezed == statusCode
? _value.statusCode
: statusCode // ignore: cast_nullable_to_non_nullable
as int?,
headers: freezed == headers
? _value.headers
: headers // ignore: cast_nullable_to_non_nullable
as Map<String, String>?,
requestHeaders: freezed == requestHeaders
? _value.requestHeaders
: requestHeaders // ignore: cast_nullable_to_non_nullable
as Map<String, String>?,
body: freezed == body
? _value.body
: body // ignore: cast_nullable_to_non_nullable
as String?,
formattedBody: freezed == formattedBody
? _value.formattedBody
: formattedBody // ignore: cast_nullable_to_non_nullable
as String?,
bodyBytes: freezed == bodyBytes
? _value.bodyBytes
: bodyBytes // ignore: cast_nullable_to_non_nullable
as Uint8List?,
time: freezed == time
? _value.time
: time // ignore: cast_nullable_to_non_nullable
as Duration?,
) as $Val);
}
}
/// @nodoc
abstract class _$$HttpResponseModelImplCopyWith<$Res>
implements $HttpResponseModelCopyWith<$Res> {
factory _$$HttpResponseModelImplCopyWith(_$HttpResponseModelImpl value,
$Res Function(_$HttpResponseModelImpl) then) =
__$$HttpResponseModelImplCopyWithImpl<$Res>;
@override
@useResult
$Res call(
{int? statusCode,
Map<String, String>? headers,
Map<String, String>? requestHeaders,
String? body,
String? formattedBody,
@Uint8ListConverter() Uint8List? bodyBytes,
@DurationConverter() Duration? time});
}
/// @nodoc
class __$$HttpResponseModelImplCopyWithImpl<$Res>
extends _$HttpResponseModelCopyWithImpl<$Res, _$HttpResponseModelImpl>
implements _$$HttpResponseModelImplCopyWith<$Res> {
__$$HttpResponseModelImplCopyWithImpl(_$HttpResponseModelImpl _value,
$Res Function(_$HttpResponseModelImpl) _then)
: super(_value, _then);
/// Create a copy of HttpResponseModel
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? statusCode = freezed,
Object? headers = freezed,
Object? requestHeaders = freezed,
Object? body = freezed,
Object? formattedBody = freezed,
Object? bodyBytes = freezed,
Object? time = freezed,
}) {
return _then(_$HttpResponseModelImpl(
statusCode: freezed == statusCode
? _value.statusCode
: statusCode // ignore: cast_nullable_to_non_nullable
as int?,
headers: freezed == headers
? _value._headers
: headers // ignore: cast_nullable_to_non_nullable
as Map<String, String>?,
requestHeaders: freezed == requestHeaders
? _value._requestHeaders
: requestHeaders // ignore: cast_nullable_to_non_nullable
as Map<String, String>?,
body: freezed == body
? _value.body
: body // ignore: cast_nullable_to_non_nullable
as String?,
formattedBody: freezed == formattedBody
? _value.formattedBody
: formattedBody // ignore: cast_nullable_to_non_nullable
as String?,
bodyBytes: freezed == bodyBytes
? _value.bodyBytes
: bodyBytes // ignore: cast_nullable_to_non_nullable
as Uint8List?,
time: freezed == time
? _value.time
: time // ignore: cast_nullable_to_non_nullable
as Duration?,
));
}
}
/// @nodoc
@JsonSerializable(explicitToJson: true, anyMap: true)
class _$HttpResponseModelImpl extends _HttpResponseModel {
const _$HttpResponseModelImpl(
{this.statusCode,
final Map<String, String>? headers,
final Map<String, String>? requestHeaders,
this.body,
this.formattedBody,
@Uint8ListConverter() this.bodyBytes,
@DurationConverter() this.time})
: _headers = headers,
_requestHeaders = requestHeaders,
super._();
factory _$HttpResponseModelImpl.fromJson(Map<String, dynamic> json) =>
_$$HttpResponseModelImplFromJson(json);
@override
final int? statusCode;
final Map<String, String>? _headers;
@override
Map<String, String>? get headers {
final value = _headers;
if (value == null) return null;
if (_headers is EqualUnmodifiableMapView) return _headers;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(value);
}
final Map<String, String>? _requestHeaders;
@override
Map<String, String>? get requestHeaders {
final value = _requestHeaders;
if (value == null) return null;
if (_requestHeaders is EqualUnmodifiableMapView) return _requestHeaders;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(value);
}
@override
final String? body;
@override
final String? formattedBody;
@override
@Uint8ListConverter()
final Uint8List? bodyBytes;
@override
@DurationConverter()
final Duration? time;
@override
String toString() {
return 'HttpResponseModel(statusCode: $statusCode, headers: $headers, requestHeaders: $requestHeaders, body: $body, formattedBody: $formattedBody, bodyBytes: $bodyBytes, time: $time)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$HttpResponseModelImpl &&
(identical(other.statusCode, statusCode) ||
other.statusCode == statusCode) &&
const DeepCollectionEquality().equals(other._headers, _headers) &&
const DeepCollectionEquality()
.equals(other._requestHeaders, _requestHeaders) &&
(identical(other.body, body) || other.body == body) &&
(identical(other.formattedBody, formattedBody) ||
other.formattedBody == formattedBody) &&
const DeepCollectionEquality().equals(other.bodyBytes, bodyBytes) &&
(identical(other.time, time) || other.time == time));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(
runtimeType,
statusCode,
const DeepCollectionEquality().hash(_headers),
const DeepCollectionEquality().hash(_requestHeaders),
body,
formattedBody,
const DeepCollectionEquality().hash(bodyBytes),
time);
/// Create a copy of HttpResponseModel
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$HttpResponseModelImplCopyWith<_$HttpResponseModelImpl> get copyWith =>
__$$HttpResponseModelImplCopyWithImpl<_$HttpResponseModelImpl>(
this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$HttpResponseModelImplToJson(
this,
);
}
}
abstract class _HttpResponseModel extends HttpResponseModel {
const factory _HttpResponseModel(
{final int? statusCode,
final Map<String, String>? headers,
final Map<String, String>? requestHeaders,
final String? body,
final String? formattedBody,
@Uint8ListConverter() final Uint8List? bodyBytes,
@DurationConverter() final Duration? time}) = _$HttpResponseModelImpl;
const _HttpResponseModel._() : super._();
factory _HttpResponseModel.fromJson(Map<String, dynamic> json) =
_$HttpResponseModelImpl.fromJson;
@override
int? get statusCode;
@override
Map<String, String>? get headers;
@override
Map<String, String>? get requestHeaders;
@override
String? get body;
@override
String? get formattedBody;
@override
@Uint8ListConverter()
Uint8List? get bodyBytes;
@override
@DurationConverter()
Duration? get time;
/// Create a copy of HttpResponseModel
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$HttpResponseModelImplCopyWith<_$HttpResponseModelImpl> get copyWith =>
throw _privateConstructorUsedError;
}

View File

@ -1,35 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'http_response_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_$HttpResponseModelImpl _$$HttpResponseModelImplFromJson(Map json) =>
_$HttpResponseModelImpl(
statusCode: (json['statusCode'] as num?)?.toInt(),
headers: (json['headers'] as Map?)?.map(
(k, e) => MapEntry(k as String, e as String),
),
requestHeaders: (json['requestHeaders'] as Map?)?.map(
(k, e) => MapEntry(k as String, e as String),
),
body: json['body'] as String?,
formattedBody: json['formattedBody'] as String?,
bodyBytes:
const Uint8ListConverter().fromJson(json['bodyBytes'] as List<int>?),
time: const DurationConverter().fromJson((json['time'] as num?)?.toInt()),
);
Map<String, dynamic> _$$HttpResponseModelImplToJson(
_$HttpResponseModelImpl instance) =>
<String, dynamic>{
'statusCode': instance.statusCode,
'headers': instance.headers,
'requestHeaders': instance.requestHeaders,
'body': instance.body,
'formattedBody': instance.formattedBody,
'bodyBytes': const Uint8ListConverter().toJson(instance.bodyBytes),
'time': const DurationConverter().toJson(instance.time),
};

View File

@ -1,3 +1 @@
export 'environment_model.dart';
export 'http_request_model.dart';
export 'http_response_model.dart';

View File

@ -1,65 +0,0 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
import 'package:http/io_client.dart';
http.Client createHttpClientWithNoSSL() {
var ioClient = HttpClient()
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
return IOClient(ioClient);
}
class HttpClientManager {
static final HttpClientManager _instance = HttpClientManager._internal();
static const int _maxCancelledRequests = 100;
final Map<String, http.Client> _clients = {};
final Set<String> _cancelledRequests = {};
factory HttpClientManager() {
return _instance;
}
HttpClientManager._internal();
http.Client createClient(
String requestId, {
bool noSSL = false,
}) {
final client =
(noSSL && !kIsWeb) ? createHttpClientWithNoSSL() : http.Client();
_clients[requestId] = client;
return client;
}
void cancelRequest(String? requestId) {
if (requestId != null && _clients.containsKey(requestId)) {
_clients[requestId]?.close();
_clients.remove(requestId);
_cancelledRequests.add(requestId);
if (_cancelledRequests.length > _maxCancelledRequests) {
_cancelledRequests.remove(_cancelledRequests.first);
}
}
}
bool wasRequestCancelled(String requestId) {
return _cancelledRequests.contains(requestId);
}
void removeCancelledRequest(String requestId) {
_cancelledRequests.remove(requestId);
}
void closeClient(String requestId) {
if (_clients.containsKey(requestId)) {
_clients[requestId]?.close();
_clients.remove(requestId);
}
}
bool hasActiveClient(String requestId) {
return _clients.containsKey(requestId);
}
}

View File

@ -1,169 +0,0 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:seed/seed.dart';
import '../consts.dart';
import '../extensions/extensions.dart';
import '../models/models.dart';
import '../utils/utils.dart';
import 'http_client_manager.dart';
typedef HttpResponse = http.Response;
final httpClientManager = HttpClientManager();
Future<(HttpResponse?, Duration?, String?)> sendHttpRequest(
String requestId,
APIType apiType,
HttpRequestModel requestModel, {
SupportedUriSchemes defaultUriScheme = kDefaultUriScheme,
bool noSSL = false,
}) async {
if (httpClientManager.wasRequestCancelled(requestId)) {
httpClientManager.removeCancelledRequest(requestId);
}
final client = httpClientManager.createClient(requestId, noSSL: noSSL);
(Uri?, String?) uriRec = getValidRequestUri(
requestModel.url,
requestModel.enabledParams,
defaultUriScheme: defaultUriScheme,
);
if (uriRec.$1 != null) {
Uri requestUrl = uriRec.$1!;
Map<String, String> headers = requestModel.enabledHeadersMap;
bool overrideContentType = false;
HttpResponse? response;
String? body;
try {
Stopwatch stopwatch = Stopwatch()..start();
if (apiType == APIType.rest) {
var isMultiPartRequest =
requestModel.bodyContentType == ContentType.formdata;
if (kMethodsWithBody.contains(requestModel.method)) {
var requestBody = requestModel.body;
if (requestBody != null &&
!isMultiPartRequest &&
requestBody.isNotEmpty) {
body = requestBody;
if (requestModel.hasContentTypeHeader) {
overrideContentType = true;
} else {
headers[HttpHeaders.contentTypeHeader] =
requestModel.bodyContentType.header;
}
}
if (isMultiPartRequest) {
var multiPartRequest = http.MultipartRequest(
requestModel.method.name.toUpperCase(),
requestUrl,
);
multiPartRequest.headers.addAll(headers);
for (var formData in requestModel.formDataList) {
if (formData.type == FormDataType.text) {
multiPartRequest.fields.addAll({formData.name: formData.value});
} else {
multiPartRequest.files.add(
await http.MultipartFile.fromPath(
formData.name,
formData.value,
),
);
}
}
http.StreamedResponse multiPartResponse =
await client.send(multiPartRequest);
stopwatch.stop();
http.Response convertedMultiPartResponse =
await convertStreamedResponse(multiPartResponse);
return (convertedMultiPartResponse, stopwatch.elapsed, null);
}
}
switch (requestModel.method) {
case HTTPVerb.get:
response = await client.get(requestUrl, headers: headers);
break;
case HTTPVerb.head:
response = await client.head(requestUrl, headers: headers);
break;
case HTTPVerb.post:
case HTTPVerb.put:
case HTTPVerb.patch:
case HTTPVerb.delete:
case HTTPVerb.options:
final request = prepareHttpRequest(
url: requestUrl,
method: requestModel.method.name.toUpperCase(),
headers: headers,
body: body,
overrideContentType: overrideContentType,
);
final streamed = await client.send(request);
response = await http.Response.fromStream(streamed);
break;
}
}
if (apiType == APIType.graphql) {
var requestBody = getGraphQLBody(requestModel);
if (requestBody != null) {
var contentLength = utf8.encode(requestBody).length;
if (contentLength > 0) {
body = requestBody;
headers[HttpHeaders.contentLengthHeader] = contentLength.toString();
if (!requestModel.hasContentTypeHeader) {
headers[HttpHeaders.contentTypeHeader] = ContentType.json.header;
}
}
}
response = await client.post(
requestUrl,
headers: headers,
body: body,
);
}
stopwatch.stop();
return (response, stopwatch.elapsed, null);
} catch (e) {
if (httpClientManager.wasRequestCancelled(requestId)) {
return (null, null, kMsgRequestCancelled);
}
return (null, null, e.toString());
} finally {
httpClientManager.closeClient(requestId);
}
} else {
return (null, null, uriRec.$2);
}
}
void cancelHttpRequest(String? requestId) {
httpClientManager.cancelRequest(requestId);
}
http.Request prepareHttpRequest({
required Uri url,
required String method,
required Map<String, String> headers,
required String? body,
bool overrideContentType = false,
}) {
var request = http.Request(method, url);
if (headers.getValueContentType() != null) {
request.headers[HttpHeaders.contentTypeHeader] =
headers.getValueContentType()!;
if (!overrideContentType) {
headers.removeKeyContentType();
}
}
if (body != null) {
request.body = body;
headers[HttpHeaders.contentLengthHeader] =
request.bodyBytes.length.toString();
}
request.headers.addAll(headers);
return request;
}

View File

@ -1,2 +0,0 @@
export 'http_client_manager.dart';
export 'http_service.dart';

View File

@ -1,54 +0,0 @@
import 'package:http_parser/http_parser.dart';
import '../consts.dart';
import '../extensions/extensions.dart';
ContentType? getContentTypeFromHeadersMap(
Map<String, String>? kvMap,
) {
if (kvMap != null && kvMap.hasKeyContentType()) {
var val = getMediaTypeFromHeaders(kvMap);
return getContentTypeFromMediaType(val);
}
return null;
}
MediaType? getMediaTypeFromHeaders(Map? headers) {
var contentType = headers?.getValueContentType();
MediaType? mediaType = getMediaTypeFromContentType(contentType);
return mediaType;
}
MediaType? getMediaTypeFromContentType(String? contentType) {
if (contentType != null) {
try {
MediaType mediaType = MediaType.parse(contentType);
return mediaType;
} catch (e) {
return null;
}
}
return null;
}
ContentType? getContentTypeFromMediaType(MediaType? mediaType) {
if (mediaType != null) {
if (mediaType.subtype.contains(kSubTypeJson)) {
return ContentType.json;
} else if (mediaType.type == kTypeMultipart &&
mediaType.subtype == kSubTypeFormData) {
return ContentType.formdata;
}
return ContentType.text;
}
return null;
}
ContentType? getContentTypeFromContentTypeStr(
String? contentType,
) {
if (contentType != null) {
var val = getMediaTypeFromContentType(contentType);
return getContentTypeFromMediaType(val);
}
return null;
}

View File

@ -1,11 +0,0 @@
import '../consts.dart';
import '../models/models.dart';
String? getGraphQLBody(HttpRequestModel httpRequestModel) {
if (httpRequestModel.hasQuery) {
return kJsonEncoder.convert({
"query": httpRequestModel.query,
});
}
return null;
}

View File

@ -1,114 +0,0 @@
import 'package:apidash_core/consts.dart';
import 'package:seed/seed.dart';
import '../models/models.dart';
import 'graphql_utils.dart';
import 'package:json5/json5.dart' as json5;
Map<String, String>? rowsToMap(
List<NameValueModel>? kvRows, {
bool isHeader = false,
}) {
if (kvRows == null) {
return null;
}
Map<String, String> finalMap = {};
for (var row in kvRows) {
if (row.name.trim() != "") {
String key = row.name;
if (isHeader) {
key = key.toLowerCase();
}
finalMap[key] = row.value.toString();
}
}
return finalMap;
}
List<NameValueModel>? mapToRows(
Map<String, String>? kvMap,
) {
if (kvMap == null) {
return null;
}
List<NameValueModel> finalRows = [];
for (var k in kvMap.keys) {
finalRows.add(NameValueModel(name: k, value: kvMap[k]));
}
return finalRows;
}
List<Map<String, String>>? rowsToFormDataMapList(
List<FormDataModel>? kvRows,
) {
if (kvRows == null) {
return null;
}
List<Map<String, String>> finalMap = kvRows
.map((FormDataModel formData) =>
(formData.name.trim().isEmpty && formData.value.trim().isEmpty)
? null
: {
"name": formData.name,
"value": formData.value,
"type": formData.type.name,
})
.nonNulls
.toList();
return finalMap;
}
List<FormDataModel>? mapListToFormDataModelRows(
List<Map>? kvMap,
) {
if (kvMap == null) {
return null;
}
List<FormDataModel> finalRows = kvMap.map(
(formData) {
return FormDataModel(
name: formData["name"],
value: formData["value"],
type: getFormDataType(formData["type"]),
);
},
).toList();
return finalRows;
}
FormDataType getFormDataType(String? type) {
return FormDataType.values.firstWhere((element) => element.name == type,
orElse: () => FormDataType.text);
}
List<NameValueModel>? getEnabledRows(
List<NameValueModel>? rows,
List<bool>? isRowEnabledList,
) {
if (rows == null || isRowEnabledList == null) {
return rows;
}
List<NameValueModel> finalRows =
rows.where((element) => isRowEnabledList[rows.indexOf(element)]).toList();
return finalRows == [] ? null : finalRows;
}
String? getRequestBody(APIType type, HttpRequestModel httpRequestModel) {
return switch (type) {
APIType.rest =>
(httpRequestModel.hasJsonData || httpRequestModel.hasTextData)
? httpRequestModel.body
: null,
APIType.graphql => getGraphQLBody(httpRequestModel),
};
}
// TODO: Expose this function to remove JSON comments
String? removeJsonComments(String? json) {
try {
if (json == null) return null;
var parsed = json5.json5Decode(json);
return kJsonEncoder.convert(parsed);
} catch (e) {
return json;
}
}

View File

@ -1,52 +0,0 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';
import 'package:xml/xml.dart';
import '../consts.dart';
String? formatBody(String? body, MediaType? mediaType) {
if (mediaType != null && body != null) {
var subtype = mediaType.subtype;
try {
if (subtype.contains(kSubTypeJson)) {
final tmp = jsonDecode(body);
String result = kJsonEncoder.convert(tmp);
return result;
}
if (subtype.contains(kSubTypeXml)) {
final document = XmlDocument.parse(body);
String result = document.toXmlString(pretty: true, indent: ' ');
return result;
}
if (subtype == kSubTypeHtml) {
var len = body.length;
var lines = kSplitter.convert(body);
var numOfLines = lines.length;
if (numOfLines != 0 && len / numOfLines <= kCodeCharsPerLineLimit) {
return body;
}
}
} catch (e) {
return null;
}
}
return null;
}
Future<http.Response> convertStreamedResponse(
http.StreamedResponse streamedResponse,
) async {
Uint8List bodyBytes = await streamedResponse.stream.toBytes();
http.Response response = http.Response.bytes(
bodyBytes,
streamedResponse.statusCode,
headers: streamedResponse.headers,
persistentConnection: streamedResponse.persistentConnection,
reasonPhrase: streamedResponse.reasonPhrase,
request: streamedResponse.request,
);
return response;
}

View File

@ -1,65 +0,0 @@
import 'package:collection/collection.dart' show mergeMaps;
import 'package:seed/seed.dart';
import '../consts.dart';
import 'http_request_utils.dart';
(String?, bool) getUriScheme(Uri uri) {
if (uri.hasScheme) {
if (kSupportedUriSchemes.contains(uri.scheme.toLowerCase())) {
return (uri.scheme, true);
}
return (uri.scheme, false);
}
return (null, false);
}
String stripUriParams(Uri uri) {
return "${uri.scheme}://${uri.authority}${uri.path}";
}
String stripUrlParams(String url) {
var idx = url.indexOf("?");
return idx > 0 ? url.substring(0, idx) : url;
}
(Uri?, String?) getValidRequestUri(
String? url, List<NameValueModel>? requestParams,
{SupportedUriSchemes defaultUriScheme = kDefaultUriScheme}) {
url = url?.trim();
if (url == null || url == "") {
return (null, "URL is missing!");
}
if (kLocalhostRegex.hasMatch(url) || kIPHostRegex.hasMatch(url)) {
url = '${SupportedUriSchemes.http.name}://$url';
}
Uri? uri = Uri.tryParse(url);
if (uri == null) {
return (null, "Check URL (malformed)");
}
(String?, bool) urlScheme = getUriScheme(uri);
if (urlScheme.$1 != null) {
if (!urlScheme.$2) {
return (null, "Unsupported URL Scheme (${urlScheme.$1})");
}
} else {
url = "${defaultUriScheme.name}://$url";
}
uri = Uri.parse(url);
if (uri.hasFragment) {
uri = uri.removeFragment();
}
Map<String, String>? queryParams = rowsToMap(requestParams);
if (queryParams != null && queryParams.isNotEmpty) {
if (uri.hasQuery) {
Map<String, String> urlQueryParams = uri.queryParameters;
queryParams = mergeMaps(urlQueryParams, queryParams);
}
uri = uri.replace(queryParameters: queryParams);
}
return (uri, null);
}

View File

@ -1,6 +1 @@
export 'content_type_utils.dart';
export 'graphql_utils.dart';
export 'http_request_utils.dart';
export 'http_response_utils.dart';
export 'string_utils.dart';
export 'uri_utils.dart';

View File

@ -24,6 +24,8 @@ dependencies:
path: ../postman
seed: ^0.0.3
xml: ^6.3.0
better_networking:
path: ../better_networking
dev_dependencies:
flutter_test:

View File

@ -2,6 +2,6 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
void main() {}

View File

@ -1,129 +0,0 @@
import 'package:apidash_core/apidash_core.dart';
import 'package:test/test.dart';
void main() {
group('Testing MapExtensions', () {
group('Testing hasKeyContentType()', () {
test('Content-Type present should return true', () {
Map<String, String> mapEx = {"Content-Type": "x", "Agent": "Test"};
expect(mapEx.hasKeyContentType(), true);
});
test('content-Type present should return true', () {
Map<String, String> mapEx = {"content-Type": "x", "Agent": "Test"};
expect(mapEx.hasKeyContentType(), true);
});
test('empty should return false', () {
Map<String, String> mapEx = {};
expect(mapEx.hasKeyContentType(), false);
});
test('No content-type present should return false', () {
Map<String, String> mapEx = {"Agent": "Test"};
expect(mapEx.hasKeyContentType(), false);
});
test('Different datatype should return false', () {
Map mapEx = {1: "Test"};
expect(mapEx.hasKeyContentType(), false);
});
test('Mixed datatype but should return true', () {
Map mapEx = {1: "Test", "content-type": "x"};
expect(mapEx.hasKeyContentType(), true);
});
});
group('Testing getKeyContentType()', () {
test('Content-Type present', () {
Map<String, String> mapEx = {"Agent": "Test", "Content-Type": "x"};
expect(mapEx.getKeyContentType(), "Content-Type");
});
test('content-Type present', () {
Map<String, String> mapEx = {"Agent": "Test", "content-Type": "x"};
expect(mapEx.getKeyContentType(), "content-Type");
});
test('empty should return null', () {
Map<String, String> mapEx = {};
expect(mapEx.getKeyContentType(), null);
});
test('No content-type present should return null', () {
Map<String, String> mapEx = {"Agent": "Test"};
expect(mapEx.getKeyContentType(), null);
});
test('Different datatype should return null', () {
Map mapEx = {1: "Test"};
expect(mapEx.getKeyContentType(), null);
});
test('Mixed datatype but should return content-type', () {
Map mapEx = {1: "Test", "content-type": "x"};
expect(mapEx.getKeyContentType(), "content-type");
});
test('Multiple occurence should return first', () {
Map mapEx = {1: "Test", "content-Type": "y", "content-type": "x"};
expect(mapEx.getKeyContentType(), "content-Type");
});
});
});
group('Testing getValueContentType()', () {
test('Content-Type present', () {
Map<String, String> mapEx = {"Agent": "Test", "Content-Type": "x"};
expect(mapEx.getValueContentType(), "x");
});
test('content-Type present', () {
Map<String, String> mapEx = {"Agent": "Test", "content-Type": "x"};
expect(mapEx.getValueContentType(), "x");
});
test('empty should return null', () {
Map<String, String> mapEx = {};
expect(mapEx.getValueContentType(), null);
});
test('No content-type present should return null', () {
Map<String, String> mapEx = {"Agent": "Test"};
expect(mapEx.getValueContentType(), null);
});
test('Different datatype should return null', () {
Map mapEx = {1: "Test"};
expect(mapEx.getValueContentType(), null);
});
test('Mixed datatype but should return x', () {
Map mapEx = {1: "Test", "content-type": "x"};
expect(mapEx.getValueContentType(), "x");
});
test('Multiple occurence should return first', () {
Map mapEx = {1: "Test", "content-Type": "y", "content-type": "x"};
expect(mapEx.getValueContentType(), "y");
});
});
group("Testing ?.getValueContentType() function", () {
test('Testing ?.getValueContentType() for header1', () {
Map<String, String> header1 = {
"content-type": "application/json",
};
String contentType1Expected = "application/json";
expect(header1.getValueContentType(), contentType1Expected);
});
test('Testing ?.getValueContentType() when header keys are in header case',
() {
Map<String, String> header2 = {
"Content-Type": "application/json",
};
expect(header2.getValueContentType(), "application/json");
});
});
}

View File

@ -1,5 +1,6 @@
import 'package:test/test.dart';
import 'package:apidash_core/apidash_core.dart';
import 'package:better_networking/better_networking.dart';
import 'package:test/test.dart';
void main() {
group('CurlFileImport Tests', () {

View File

@ -1,74 +0,0 @@
import 'package:apidash_core/utils/http_request_utils.dart';
import 'package:test/test.dart';
void main() {
group('Testing RemoveJsonComments', () {
test('Removes single-line comments', () {
String input = '''
{
// This is a single-line comment
"key": "value"
}
''';
String expected = '''{
"key": "value"
}''';
expect(removeJsonComments(input), expected);
});
test('Removes multi-line comments', () {
String input = '''
{
/*
This is a multi-line comment
*/
"key": "value"
}
''';
String expected = '''{
"key": "value"
}''';
expect(removeJsonComments(input), expected);
});
test('Handles valid JSON without comments', () {
String input = '{"key":"value"}';
String expected = '''{
"key": "value"
}''';
expect(removeJsonComments(input), expected);
});
test('Returns original string if invalid JSON', () {
String input = '{key: value}';
String expected = '{key: value}';
expect(removeJsonComments(input), expected);
});
test('Removes trailing commas', () {
String input = '''
{
"key1": "value1",
"key2": "value2", // trailing comma
}
''';
String expected = '''{
"key1": "value1",
"key2": "value2"
}''';
expect(removeJsonComments(input), expected);
});
test('Test blank json', () {
String input = '''
{}
''';
String expected = '{}';
expect(removeJsonComments(input), expected);
});
});
}

Some files were not shown because too many files have changed in this diff Show More