2015-07-11 181 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流的關閉事件並關閉從那裏的響應。