diff --git a/chopper/CHANGELOG.md b/chopper/CHANGELOG.md index fd922ce4..747c42a6 100644 --- a/chopper/CHANGELOG.md +++ b/chopper/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 8.0.2 + +- Properly escape single quote in cURL interceptor output ([#635](https://github.com/lejard-h/chopper/pull/635)) + ## 8.0.1+1 - Re-remove internal `qs.ListFormat` wrapper diff --git a/chopper/lib/src/interceptors/curl_interceptor.dart b/chopper/lib/src/interceptors/curl_interceptor.dart index 9eb4256c..ef850e92 100644 --- a/chopper/lib/src/interceptors/curl_interceptor.dart +++ b/chopper/lib/src/interceptors/curl_interceptor.dart @@ -25,7 +25,7 @@ class CurlInterceptor implements Interceptor { if (baseRequest is http.Request) { final String body = baseRequest.body; if (body.isNotEmpty) { - curlParts.add("-d '$body'"); + curlParts.add("-d '${body.replaceAll("'", r"'\''")}'"); } } if (baseRequest is http.MultipartRequest) { @@ -36,7 +36,7 @@ class CurlInterceptor implements Interceptor { curlParts.add("-f '${file.field}: ${file.filename ?? ''}'"); } } - curlParts.add('"${baseRequest.url}"'); + curlParts.add("'${baseRequest.url}'"); chopperLogger.info(curlParts.join(' ')); return chain.proceed(chain.request); diff --git a/chopper/pubspec.yaml b/chopper/pubspec.yaml index 21ec2806..9405209d 100644 --- a/chopper/pubspec.yaml +++ b/chopper/pubspec.yaml @@ -1,6 +1,6 @@ name: chopper description: Chopper is an http client generator using source_gen, inspired by Retrofit -version: 8.0.1+1 +version: 8.0.2 documentation: https://hadrien-lejard.gitbook.io/chopper repository: https://github.com/lejard-h/chopper @@ -12,7 +12,7 @@ dependencies: http: ^1.1.0 logging: ^1.2.0 meta: ^1.9.1 - qs_dart: ^1.2.0 + qs_dart: ^1.2.3 dev_dependencies: build_runner: ^2.4.9 @@ -26,7 +26,7 @@ dev_dependencies: lints: ^4.0.0 test: ^1.25.5 transparent_image: ^2.0.1 - chopper_generator: ^8.0.0 + chopper_generator: ^8.0.1 dependency_overrides: chopper_generator: diff --git a/chopper/test/interceptors_test.dart b/chopper/test/interceptors_test.dart index a1d1a2ac..87567951 100644 --- a/chopper/test/interceptors_test.dart +++ b/chopper/test/interceptors_test.dart @@ -91,15 +91,15 @@ void main() { ); }); - final fakeRequest = Request( - 'POST', - Uri.parse('/'), - Uri.parse('base'), - body: 'test', - headers: {'foo': 'bar'}, - ); - test('Curl interceptors', () async { + final fakeRequest = Request( + 'POST', + Uri.parse('/'), + Uri.parse('base'), + body: 'test', + headers: {'foo': 'bar'}, + ); + final curl = CurlInterceptor(); var log = ''; chopperLogger.onRecord.listen((r) => log = r.message); @@ -108,27 +108,48 @@ void main() { expect( log, equals( - "curl -v -X POST -H 'foo: bar' -H 'content-type: text/plain; charset=utf-8' -d 'test' \"base/\"", + r"curl -v -X POST -H 'foo: bar' -H 'content-type: text/plain; charset=utf-8' -d 'test' 'base/'", ), ); }); - final fakeRequestMultipart = Request( - 'POST', - Uri.parse('/'), - Uri.parse('base'), - headers: {'foo': 'bar'}, - parts: [ - PartValue('p1', 123), - PartValueFile( - 'p2', - http.MultipartFile.fromBytes('file', [0], filename: 'filename'), + test('Curl interceptor with escaped text', () async { + final fakeRequest = Request( + 'POST', + Uri.parse('/'), + Uri.parse('base'), + body: r"""Lorem's ipsum "dolor" sit amet""", + ); + + final curl = CurlInterceptor(); + var log = ''; + chopperLogger.onRecord.listen((r) => log = r.message); + await curl.intercept(FakeChain(fakeRequest)); + + expect( + log, + equals( + r"""curl -v -X POST -H 'content-type: text/plain; charset=utf-8' -d 'Lorem'\''s ipsum "dolor" sit amet' 'base/'""", ), - ], - multipart: true, - ); + ); + }); test('Curl interceptors Multipart', () async { + final fakeRequestMultipart = Request( + 'POST', + Uri.parse('/'), + Uri.parse('base'), + headers: {'foo': 'bar'}, + parts: [ + PartValue('p1', 123), + PartValueFile( + 'p2', + http.MultipartFile.fromBytes('file', [0], filename: 'filename'), + ), + ], + multipart: true, + ); + final curl = CurlInterceptor(); var log = ''; chopperLogger.onRecord.listen((r) => log = r.message); @@ -137,7 +158,7 @@ void main() { expect( log, equals( - "curl -v -X POST -H 'foo: bar' -f 'p1: 123' -f 'file: filename' \"base/\"", + r"curl -v -X POST -H 'foo: bar' -f 'p1: 123' -f 'file: filename' 'base/'", ), ); }); diff --git a/chopper_generator/CHANGELOG.md b/chopper_generator/CHANGELOG.md index 23025dac..35e3c091 100644 --- a/chopper_generator/CHANGELOG.md +++ b/chopper_generator/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 8.0.2 + +- Remove duplicate null-coalescing `responseTypeReference` ([#634](https://github.com/lejard-h/chopper/pull/634)) + ## 8.0.1 - Directly export `qs.ListFormat` instead of internal wrapper ([#624](https://github.com/lejard-h/chopper/pull/624)) diff --git a/chopper_generator/lib/src/generator.dart b/chopper_generator/lib/src/generator.dart index ce3efadf..3a4f697c 100644 --- a/chopper_generator/lib/src/generator.dart +++ b/chopper_generator/lib/src/generator.dart @@ -193,9 +193,8 @@ final class ChopperGenerator // Set Response with generic types final Reference responseTypeReference = refer( - responseType?.getDisplayString(withNullability: false) ?? - responseType?.getDisplayString(withNullability: false) ?? - 'dynamic'); + responseType?.getDisplayString(withNullability: false) ?? 'dynamic', + ); // Set the return type final returnType = isResponseObject ? refer(m.returnType.getDisplayString(withNullability: false)) diff --git a/chopper_generator/pubspec.yaml b/chopper_generator/pubspec.yaml index dc582979..a2c29f63 100644 --- a/chopper_generator/pubspec.yaml +++ b/chopper_generator/pubspec.yaml @@ -1,6 +1,6 @@ name: chopper_generator description: Chopper is an http client generator using source_gen, inspired by Retrofit -version: 8.0.1 +version: 8.0.2 documentation: https://hadrien-lejard.gitbook.io/chopper repository: https://github.com/lejard-h/chopper