实施代理服务器
Implementing a proxy server
我正在尝试使用 Dart 实现代理服务器:浏览器上的 Web 应用程序 运行 在本地向我的 dart 服务器应用程序(代理服务器)运行 发出请求,然后代理服务器向外部服务器发出请求。然后,我将 CORS headers 添加到将要发送回客户端(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 流的关闭事件并从那里关闭响应。
我正在尝试使用 Dart 实现代理服务器:浏览器上的 Web 应用程序 运行 在本地向我的 dart 服务器应用程序(代理服务器)运行 发出请求,然后代理服务器向外部服务器发出请求。然后,我将 CORS headers 添加到将要发送回客户端(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 流的关闭事件并从那里关闭响应。