diff --git a/packages/leancode_debug_page/lib/src/core/logging_http_client.dart b/packages/leancode_debug_page/lib/src/core/logging_http_client.dart index 28c07570..96e05209 100644 --- a/packages/leancode_debug_page/lib/src/core/logging_http_client.dart +++ b/packages/leancode_debug_page/lib/src/core/logging_http_client.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:leancode_debug_page/src/models/log_gatherer.dart'; @@ -59,9 +60,10 @@ class LoggingHttpClient extends http.BaseClient return http.StreamedResponse( response.stream.doOnData(responseBodyBytes.addAll).doOnDone(() { - responseBodyCompleter.complete( - http.Response.bytes(responseBodyBytes, response.statusCode).body, - ); + // Decode the response body using UTF-8 encoding to properly handle + // special characters like Polish letters (Ł, Ń, ą, etc.) + final responseBody = utf8.decode(responseBodyBytes, allowMalformed: true); + responseBodyCompleter.complete(responseBody); }), response.statusCode, contentLength: response.contentLength, diff --git a/packages/leancode_debug_page/test/logging_http_client_test.dart b/packages/leancode_debug_page/test/logging_http_client_test.dart index 53801d26..b57ad400 100644 --- a/packages/leancode_debug_page/test/logging_http_client_test.dart +++ b/packages/leancode_debug_page/test/logging_http_client_test.dart @@ -3,6 +3,8 @@ // clearly show all parameters being tested. // ignore_for_file: avoid_redundant_argument_values +import 'dart:convert'; + import 'package:flutter_test/flutter_test.dart'; import 'package:http/http.dart'; import 'package:leancode_debug_page/src/core/logging_http_client.dart'; @@ -96,6 +98,43 @@ void main() { ); }, ); + + test( + 'properly decodes UTF-8 characters including Polish letters', + () async { + const polishText = 'Autoryzacja nie została wykonana. Łódź, Gdańsk, Kraków.'; + final polishBytes = utf8.encode(polishText); + final streamWithPolishText = Stream.fromIterable([polishBytes]); + + when>(() => mockHttpClient.send(any())) + .thenAnswer( + (invocation) async => StreamedResponse( + streamWithPolishText, + statusCode, + contentLength: polishBytes.length, + request: request, + headers: headers, + isRedirect: isRedirect, + persistentConnection: persistentConnection, + reasonPhrase: reasonPhrase, + ), + ); + + await loggingHttpClient.send(request); + + // Wait for the response body to be completed + await Future.delayed(const Duration(milliseconds: 100)); + + expect(loggingHttpClient.logs, hasLength(1)); + final log = loggingHttpClient.logs.first; + final responseBody = await log.responseBodyCompleter.future; + + expect(responseBody, contains('Autoryzacja')); + expect(responseBody, contains('Łódź')); + expect(responseBody, contains('Gdańsk')); + expect(responseBody, contains('Kraków')); + }, + ); }, ); }