2

.html ファイルを gzip してから、.html ファイルにパイプしようとしていHttpResponseます。

import 'dart:io';

void main() {
  File f = new File('some_template.html');
  HttpServer.bind('localhost', 8080)
    .then((HttpServer server) {
      server.listen((HttpRequest request) {
        HttpResponse response = request.response;
        f.openRead()
          .transform(GZIP.encoder)
          .pipe(response);
      });
    });
}

エラーは発生しませんが、ブラウザーは HTML ページを提供する代わりに、圧縮された HTML ページをダウンロードします。ヒントをくれませんか?

4

3 に答える 3

5

クライアントが圧縮されたデータを受け入れ、その他の要件が満たされている場合、HttpServer は自動的にデータを GZIP として圧縮します (以下を参照)。たとえそうでなかったとしても、単にデータを zip 圧縮して、ブラウザーがそれを理解することを期待することはできませんでした。ブラウザーは純粋なテキスト (HTML) を想定しており、おそらくバイナリ データをディスクにダウンロードするだけです。ヘッダーの content-encoding も設定する必要があります。

dart:io次の場合を除いて、データは自動的に圧縮されます。

  • Content-Lengthが設定されています:Content-LengthヘッダーはGZIPのdart:ioの長さでなければならないため、データを圧縮できません。
  • クライアントがそれを受け入れない (で送信Accept-Encoding)、または
  • ヘッダーはContent-Encoding開発者によってすでに設定されています。

Dart の http 実装の関連セクション:

// _writeHeaders (http_impl.dart):
if (acceptEncodings != null &&
    acceptEncodings
        .expand((list) => list.split(","))
        .any((encoding) => encoding.trim().toLowerCase() == "gzip") &&
    contentEncoding == null) {
  headers.set(HttpHeaders.CONTENT_ENCODING, "gzip");
  _asGZip = true;
}

// _addStream (same file):
if (_asGZip) {
  stream = stream.transform(GZIP.encoder);
}
于 2013-09-07T15:13:24.587 に答える
3

前述のように、Content-Lengthヘッダーを設定すると自動圧縮は使用できません。ヘッダーを設定する場合は、圧縮Content-Lengthのコンテンツの長さでなければなりません。

次のコードは、圧縮されたデータのコンテンツの長さを使用して、既に圧縮されているリソースを提供する方法を示しています。

import 'dart:convert';
import 'dart:io';

var page =
r'''
<html>
  <head>
    <title>Hello, world!!!</title>
  </head>
  <body>
    <h1>Hello, world!!!</h1>
  </body>
</html>
''';

void requestHandler(HttpRequest request) {
  List<int> compressed = GZIP.encode(UTF8.encode(page));
  request.response
    ..headers.contentType = ContentType.HTML
    ..headers.set(HttpHeaders.CONTENT_ENCODING, 'gzip')
    ..headers.contentLength = compressed.length
    ..add(compressed)
    ..close();
}

main() async {
  var server = await HttpServer.bind(InternetAddress.ANY_IP_V4, 8080);
  server.autoCompress = true;
  server.defaultResponseHeaders.chunkedTransferEncoding = true;
  server.listen(requestHandler);
}
于 2015-05-02T00:04:03.463 に答える
2

最新の SDK では、HttpServer.autoCompressHttpHeaders.chunkedTransferEncodingを有効にする必要があります。

例、

import "dart:io";

void main() {
  HttpServer
  .bind(InternetAddress.ANY_IP_V4, 8080)
  .then((server) {
    server.autoCompress = true;
    server.listen((HttpRequest request) {
      request.response.write('Hello, world!');
      request.response.close();
    });
  });
}

応答ヘッダーは次のとおりです。

content-encoding:gzip
content-type:text/plain; charset=utf-8
transfer-encoding:chunked
x-content-type-options:nosniff
x-frame-options:SAMEORIGIN
x-xss-protection:1; mode=block

HTTP/1.1 の場合、chunkedTransferEncoding が自動的に設定されることに注意してください。

于 2014-10-21T14:47:19.477 に答える