From 948cf90e65a8ddc10fa42934f9b5ad3018ba9e6d Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Sun, 25 May 2025 14:10:14 +0530 Subject: [PATCH] Bug fix curl_parser --- packages/curl_parser/CHANGELOG.md | 4 ++++ packages/curl_parser/lib/models/curl.dart | 9 +++++-- packages/curl_parser/pubspec.yaml | 2 +- .../curl_parser/test/curl_parser_test.dart | 24 +++++++++++++++++++ packages/curl_parser/test/utility_test.dart | 24 +++++++++++++++++++ 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/packages/curl_parser/CHANGELOG.md b/packages/curl_parser/CHANGELOG.md index a1e45ef0..e597aa60 100644 --- a/packages/curl_parser/CHANGELOG.md +++ b/packages/curl_parser/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.3 + +- Bugfix: Header with `:` in value gets parsed properly + ## 0.1.2 - Bump dependencies. diff --git a/packages/curl_parser/lib/models/curl.dart b/packages/curl_parser/lib/models/curl.dart index f51d9d05..ea809e30 100644 --- a/packages/curl_parser/lib/models/curl.dart +++ b/packages/curl_parser/lib/models/curl.dart @@ -130,10 +130,15 @@ class Curl extends Equatable { headers = {}; for (var headerString in headersList) { final splittedHeaderString = headerString.split(RegExp(r':\s*')); - if (splittedHeaderString.length != 2) { + if (splittedHeaderString.length > 2) { + headers.addAll({ + splittedHeaderString[0]: splittedHeaderString.sublist(1).join(":") + }); + } else if (splittedHeaderString.length < 2) { throw Exception('Failed to split the `$headerString` header'); + } else { + headers.addAll({splittedHeaderString[0]: splittedHeaderString[1]}); } - headers.addAll({splittedHeaderString[0]: splittedHeaderString[1]}); } } } diff --git a/packages/curl_parser/pubspec.yaml b/packages/curl_parser/pubspec.yaml index 82e795ca..26f7fdbd 100644 --- a/packages/curl_parser/pubspec.yaml +++ b/packages/curl_parser/pubspec.yaml @@ -1,6 +1,6 @@ name: curl_parser description: Parse cURL command to Dart object and convert Dart object to cURL command. -version: 0.1.2 +version: 0.1.3 homepage: https://github.com/foss42/apidash/tree/main/packages/curl_parser repository: https://github.com/foss42/apidash/tree/main/packages/curl_parser issue_tracker: https://github.com/foss42/apidash/issues diff --git a/packages/curl_parser/test/curl_parser_test.dart b/packages/curl_parser/test/curl_parser_test.dart index 53570dc8..c41a222d 100644 --- a/packages/curl_parser/test/curl_parser_test.dart +++ b/packages/curl_parser/test/curl_parser_test.dart @@ -19,6 +19,30 @@ void main() { }, ); + test( + 'parse another easy cURL', + () async { + expect( + Curl.parse( + r"""curl --location --request GET 'https://dummyimage.com/150/92c952' \ +--header 'user-agent: Dart/3.8 (dart:io)' \ +--header 'accept-encoding: gzip' \ +--header 'content-length: 0' \ +--header 'host: dummyimage.com'"""), + Curl( + method: 'GET', + uri: Uri.parse('https://dummyimage.com/150/92c952'), + headers: { + 'user-agent': 'Dart/3.8 (dart:io)', + 'accept-encoding': 'gzip', + 'content-length': '0', + 'host': 'dummyimage.com' + }, + location: true), + ); + }, + ); + test('parse POST request with multipart/form-data', () { const curl = r'''curl -X POST 'https://api.apidash.dev/io/img' \ -H 'Content-Type: multipart/form-data' \ diff --git a/packages/curl_parser/test/utility_test.dart b/packages/curl_parser/test/utility_test.dart index 124ea150..dc4ae96e 100644 --- a/packages/curl_parser/test/utility_test.dart +++ b/packages/curl_parser/test/utility_test.dart @@ -32,6 +32,30 @@ void main() { ); }, timeout: defaultTimeout); + test('parse cURL DevTools', () async { + expect( + splitAsCommandLineArgs( + r"""--request GET 'https://dummyimage.com/150/92c952' \ +--header 'user-agent: Dart/3.8 (dart:io)' \ +--header 'accept-encoding: gzip' \ +--header 'content-length: 0' \ +--header 'host: dummyimage.com'"""), + [ + '--request', + 'GET', + 'https://dummyimage.com/150/92c952', + '--header', + 'user-agent: Dart/3.8 (dart:io)', + '--header', + 'accept-encoding: gzip', + '--header', + 'content-length: 0', + '--header', + 'host: dummyimage.com' + ], + ); + }, timeout: defaultTimeout); + test('parse cURL with body', () async { expect( splitAsCommandLineArgs(r"""--request POST \