2015-07-11 211 views
2

我试图用Dart实现代理服务器:在浏览器上运行的Web应用程序向本地运行的我的Dart服务器应用程序(代理服务器)发出请求,然后代理服务器向外部服务器。然后,我将CORS头添加到要发回客户端(Web应用程序)的响应中。实现代理服务器

这里是我是如何实现的代理服务器:

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.write(contents)完成执行之前执行,因此在写完内容之前发送响应。

有没有办法解决这个问题,只有在内容写入后才发送回应?谢谢。

回答

1

在收到第一个数据块(..close())后关闭响应。您应该从那里删除close()并监听proxyResponse流的关闭事件并关闭从那里的响应。