1

shell パッケージと rpc パッケージの間には互換性がないようです。

rpc [0.4.1] config/api.dart では: handleHttpOptionsRequest は、'access-control-request-method' ヘッダーがリストであることを想定しています。

    Future<HttpApiResponse> handleHttpOptionsRequest(
          ParsedHttpApiRequest request) async {
        var requestedHttpMethods = request.headers['access-control-request-method'];
        List<String> allowed = [];
        assert('OPTIONS'.allMatches(request.methodKey).length == 1);
        if (requestedHttpMethods != null) {
          requestedHttpMethods.forEach((httpMethod) {
            var methodKey =
                request.methodKey.replaceFirst('OPTIONS', httpMethod);
            final List<ApiConfigMethod> methods = _methodMap[methodKey];
            if (methods != null) {
              for (var method in methods) {
                if (method.matches(request)) {
                  allowed.add(httpMethod);
                  break;
               }
              }
            }
          });
        }

シェルフ [0.5.7] パッケージを使用する場合、このメソッドに渡される ParsedHttpApiRequest には、文字列である「access-control-request-method」ヘッダーが含まれます。

これにより例外が生成されます...

dart.io HttpServer で rpc を使用する場合、コードは正常に動作し、ParsedHttpApiRequest には「access-control-request-method」ヘッダーの値として文字列のリスト (要素が 1 つ) があります。

dart rpc + shell をうまく使っている人はいますか? もしそうなら、例外を回避する方法について何か考えはありますか?

=== [更新] rpc の修正後、前述の問題は修正されたようです。ありがとうございます!別の問題が発生しましたが、まだ詳しく調査していません。スタック トレースは次のとおりです。

シェルフ [0.5.7] shell_rpc [0.0.3] rpc [0.4.2]:

     Error thrown by handler.
     type 'List' is not a subtype of type 'String' of 'value'.
     package:collection/src/canonicalized_map.dart 66:30  CanonicalizedMap.[]=
     package:collection/src/canonicalized_map.dart 71:39  CanonicalizedMap.addAll.<fn>
     dart:collection                                      _CompactLinkedHashMap.forEach
     package:collection/src/canonicalized_map.dart 71:18  CanonicalizedMap.addAll
     package:collection/src/canonicalized_map.dart 57:11  CanonicalizedMap.CanonicalizedMap.from
     package:shelf/src/response.dart 215:9                Response.Response
     package:shelf_rpc/shelf_rpc.dart 18:24               createRpcHandler.<fn>.<fn>

=> dart rpc と shell (shelf_rpc を使用) を実行すると、(文字列ではなく) リストであるヘッダーに関連する非互換性が表示されます

4

1 に答える 1