# This file is part of NIT ( http://www.nitlanguage.org ). # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Shortcut services for scripts: `http_get` and `http_download` module extra import curl redef class Text # Execute a simple HTTP GET request to the URL `self` # # Set `accept_status_code` to the expected response HTTP code, defaults to 200. # If a different status code is received, the return code is printed to stderr. # # Returns the response body on success and `null` on error. Prints the error # message to stderr. # # For more control, set HTTP request headers, keep the response status code # and much more, use `CurlHTTPRequest`. # # ~~~nitish # assert "http://example.com/".http_get != null # ~~~ fun http_get(accept_status_code: nullable Int): nullable String do var req = new CurlHTTPRequest(self.to_s) var resp = req.execute req.close if resp isa CurlResponseSuccess then if resp.status_code == (accept_status_code or else 200) then return resp.body_str else print_error "HTTP request failed: server returned {resp.status_code}" end else if resp isa CurlResponseFailed then print_error "HTTP request failed: {resp.error_msg}" else abort return null end # Download the file at URL `self` to `output_path` with a simple HTTP request # # If not set, `output_path` defaults to `self.basename`. # # Set `accept_status_code` to the expected response HTTP code, defaults to 200. # If a different status code is received, the return code is printed to stderr. # # Returns the path to the downloaded file on success and `null` on errors. # Prints the error message to stderr. # # For more control, set HTTP request headers, keep the response status code # and much more, use `CurlHTTPRequest`. # # ~~~nitish # assert "http://example.com/".http_download("index.html") == "example.com" # ~~~ fun http_download(output_path: nullable Text, accept_status_code: nullable Int): nullable String do var path = (output_path or else self.basename).to_s var req = new CurlHTTPRequest(self.to_s) var resp = req.download_to_file(path) req.close if resp isa CurlFileResponseSuccess then if resp.status_code == (accept_status_code or else 200) then return path else print_error "HTTP request failed: server returned {resp.status_code}" end else if resp isa CurlResponseFailed then print_error "HTTP request failed: {resp.error_msg}" else abort return null end end