- Dart SDK Version (
dart --version
)
Dart VM version: 2.5.0-dev.1.0 (Unknown timestamp) on “linux_x64” - OS: Ubuntu 18.04
- Issue: flutter pub get error, reproduced by the following sample code.
Hi, Dart team,
I get an error when updating flutter sdk using flutter pub get. same issue as flutter/flutter#12301. I think the root cause may related to the dart:io package.
Here’s my analyze:
- I set up a Dart Command line app and reproduced the error:
`
import “dart:io”;
void main() {
var google = “https://www.google.com/“;
var client2 = HttpClient();
// same crash
// client2.findProxy = (uri) {
// return “PROXY 127.0.0.1:45653”;
// };
// same crash
client2.findProxy = (url) {
return HttpClient.findProxyFromEnvironment(
url, environment: {“http_proxy”: “127.0.0.1:45653”, “https_proxy”: “127.0.0.1:45653”});
};
// no respond.
// client2.findProxy = HttpClient.findProxyFromEnvironment;
// no respond.
// client2.findProxy = null;
client2.getUrl(
Uri.parse(google))
.then((HttpClientRequest request) {
print(request.headers);
return request.close();
}).then((HttpClientResponse response) {
// Process the response.
print(response.headers);
});
}
`
- Error message is:
Unhandled exception: NoSuchMethodError: The setter 'readEventsEnabled=' was called on null. Receiver: null Tried calling: readEventsEnabled=false #0 _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1112:29) #1 _microtaskLoop (dart:async/schedule_microtask.dart:41:21) #2 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5) #3 _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:116:13) #4 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:173:5)
- VPN settings:
I think this may related to my VPN environment settings. The following parameters are set automatically by Lantern VPN software. https://github.com/getlantern/lantern
`lixiang@lixiang-TM1701:~$ env | grep proxy
https_proxy=http://127.0.0.1:45653/
http_proxy=http://127.0.0.1:45653/
no_proxy=localhost,127.0.0.0/8,::1
`
- curl is working.
curl https://www.google.com
- JAVA is working with proxy
`
package com.tony.builder;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.ParseException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
String result = sendGet("http://www.google.com");
System.out.println(result);
}
public static String sendGet(String url) {
HttpHost proxy = new HttpHost("127.0.0.1", 45653, "http");
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setProxy(proxy)
.build();
CloseableHttpClient httpclient = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();
HttpGet httpget = new HttpGet(url);
CloseableHttpResponse response = null;
try {
response = httpclient.execute(httpget);
} catch (IOException e1) {
e1.printStackTrace();
}
String result = null;
try {
HttpEntity entity = response.getEntity();
if (entity != null) {
result = EntityUtils.toString(entity);
}
} catch (ParseException | IOException e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
}
`
Any ideas or suggestion will be helpful, thanks.
@sgjesse https://github.com/sgjesse Maybe you have more ideas? thanks.
Status update:
Hi Dart team,
I re-checked the issue and found that when _HttpParser received a lantern’s HttpRespond with empty body, it closed the HttpIncoming buffer, which I think it is reasonable behavior. But after that, the call back funtion located in _HttpClientConnection.send closed the socket, which is unconsiderable.
I think at this point, I should check if it is a “CONNECT”‘s response and return directly if success.
So I modified the code, only change 1 line in http_impl.dart. And in this way, HttpClient will behave the same using tinyproxy or lantern.
Please check the patch atached.
Thanks.
0001-fix-crash-issue-when-HttpClient-using-lantern-proxy.patch.txt
I can confirm the problem does have. I’m able to have a repro locally. Work on the fix now.
I’ve just started getting this issue in a Flutter project, due to an update to the Proxyman app on OSX.
My Dart/Flutter details: