2015-07-11 11 views
2

Я пытаюсь внедрить прокси-сервер с 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), поэтому ответ отправляется до того, как он закончит запись содержимого.

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

ответ

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^