实现代理服务器



我试图实现一个代理服务器与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.close()request.response.write(contents)完成执行之前正在执行,因此在它完成写入内容之前发送响应。

有没有办法解决这个问题,只发送响应一旦内容已经写好?谢谢。

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

相关内容

  • 没有找到相关文章

最新更新