Реализация прокси-сервера

Я пытаюсь реализовать прокси-сервер с Dart: веб-приложение, работающее в браузере, делает запрос к моему приложению сервера dart (прокси-серверу), работающему локально, а затем прокси-сервер делает запрос на внешний сервер. Затем я добавляю заголовки CORS к ответу, который будет отправлен обратно клиенту (веб-приложению).

Вот как я реализовал прокси-сервер:

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

main() async {
  var server = await HttpServer.bind(InternetAddress.ANY_IP_V6, 8080);
  print('Server listening on port ${server.port}...');

  var client = 0;
  HttpClient proxy;
  await for (HttpRequest request in server) {
    print('Request received from client ${++client}.');

    // Adds CORS headers.
    request.response.headers.add('Access-Control-Allow-Origin', '*');

    proxy = new HttpClient()
      ..getUrl(Uri.parse('http://example.com/'))
          // Makes a request to the external server.
          .then((HttpClientRequest proxyRequest) => proxyRequest.close())

          // Sends the response to the web client.
          .then((HttpClientResponse proxyResponse) =>
              proxyResponse.transform(UTF8.decoder).listen((contents) =>
                request.response
                  ..write(contents)
                  ..close()
          ));

    print('Response sent to client $client.');
  }
}

В большинстве случаев это работает нормально, но иногда клиент получает только часть ответа. Я думаю, что иногда request.response.close() выполняется до завершения выполнения request.response.write(contents), поэтому ответ отправляется до того, как он закончит запись содержимого.

Есть ли способ решить эту проблему и отправить ответ только после того, как содержимое будет написано? Спасибо.


person Rafael    schedule 11.07.2015    source источник


Ответы (1)


Вы закрываете ответ после получения первого фрагмента данных (..close()). Вы должны удалить close() оттуда и прослушать событие закрытия потока proxyResponse и закрыть ответ оттуда.

person Günter Zöchbauer    schedule 11.07.2015