-
Notifications
You must be signed in to change notification settings - Fork 29
Description
I have an iOS app where the user supplies a base URL for a service, and the app makes HTTP requests against the service via Flow's Net module. The app will crash with a RuntimeError while making an HTTP request if a problem occurs such as: the URL contains a host part that does not resolve in DNS, a connection to the service could not be established, etc. There seems to be no way to handle exceptions related to making the HTTP request.
To reproduce:
$ motion create Hello
$ cd Hello
$ echo "gem 'motion-flow'" >> Gemfile
Add the following (which contains a bad host part (i.e., a trailing x) in the base_url_supplied_by_user value) to AppDelegate#application:didFinishLaunchingWithOptions: after @window.makeKeyAndVisible:
base_url_supplied_by_user = 'https://httpbin.orgx'
session = Net.build(base_url_supplied_by_user) {}
begin
session.get("/ip") do |response|
if response.status == 200
UI.alert({title: 'Client IP Address', message: response.body['origin'], default: 'OK'}) {}
else
UI.alert({title: 'HTTP Error', message: response.status_message, default: 'OK'}) {}
end
end
rescue RuntimeError => e
UI.alert({title: 'Error', message: e.message, default: 'OK'}) {}
end
Then run it in a simulator:
$ rake
This results in a crash with the following message:
The operation couldn't be completed. (kCFErrorDomainCFNetwork error 310.) (RuntimeError)
Similarly, if no HTTP server is running on port 80 on the loopback device, changing the value of base_url_supplied_by_user to 'http://127.0.0.1' results in a crash with the following message:
Could not connect to the server. (RuntimeError)