dart-lang / dart-lang/http

Can't use custom encoding

Open
#252 1 comment 3 reactions 0 assignees View on GitHub
Dominant language
Dart
Stars
1.1k
Forks
419
Avg merge
4d 14h
Merged PRs (30d)
8

Description

I need to send post request with `cp1251` encoding
I've extended `Encoding` class with following code
```dart
import 'dart:convert';

class Cp1251 extends Encoding {

@override
Converter, String> get decoder => Cp1251Decoder();

@override
Converter> get encoder => Cp1251Encoder();

@override
String get name => "windows-1251";

}

class Cp1251Encoder extends Converter> {

@override
List convert(String input) {
final result = List();
for (var i = 0; i < input.length; i++) {
final code = input.codeUnitAt(i);
if (code < 0x80)
result.add(code);
else {
final cpCode = _MAP[code];
if (cpCode != null)
result.add(code);
}
}
return result;
}

}

class Cp1251Decoder extends Converter, String> {

@override
String convert(List input) {
var result = "";
final mapKeys = _MAP.keys.toList(growable: false);
for (var i = 0; i < input.length; i++) {
var code = input[i];
if (code < 0x80)
result += String.fromCharCode(code);
else if (code <= 0xff) {
code -= 0x80;
result += String.fromCharCode(mapKeys[code]);
}
}
return result;
}

}
```
`_MAP` is just chars map for this encoding
But using it throws an error

```
Unhandled exception:
FormatException: Unsupported encoding "windows-1251".
#0 requiredEncodingForCharset (package:http/src/utils.dart:56:3)
#1 Request.encoding (package:http/src/request.dart:51:12)
#2 Request.bodyFields= (package:http/src/request.dart:128:46)
#3 BaseClient._sendUnstreamed (package:http/src/base_client.dart:165:17)

#4 BaseClient.post (package:http/src/base_client.dart:56:5)
#5 post. (package:http/http.dart:70:34)
#6 _withClient (package:http/http.dart:167:20)

#7 post (package:http/http.dart:70:3)
#8 main (file:///Users/this/IdeaProjects/untitled3/src/main.dart:47:23)

#9 _startIsolate. (dart:isolate/runtime/libisolate_patch.dart:300:19)
#10 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)
```

I've tried to replace encoding name with `"ascii"`, but it throws as well

```
Unhandled exception:
Invalid argument (string): Contains invalid characters.: "ОАЭ от 490$"
#0 _UnicodeSubsetEncoder.convert (dart:convert/ascii.dart:86:9)
#1 AsciiCodec.encode (dart:convert/ascii.dart:41:46)
#2 _Uri._uriEncode (dart:core/runtime/liburi_patch.dart:62:26)
#3 Uri.encodeQueryComponent (dart:core/uri.dart:1098:17)
#4 mapToQuery. (package:http/src/utils.dart:19:22)
#5 CastMap.forEach. (dart:_internal/cast.dart:286:8)
#6 __InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin.forEach (dart:collection/runtime/libcompact_hash.dart:367:8)
#7 CastMap.forEach (dart:_internal/cast.dart:285:13)
```

How can I use non-default encoding?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.