diff --git a/examples/links_scraper.v b/examples/links_scraper.v index afacac41a8..e138206def 100644 --- a/examples/links_scraper.v +++ b/examples/links_scraper.v @@ -5,7 +5,10 @@ import http fn main() { - html := http.get('https://news.ycombinator.com') + html := http.get('https://news.ycombinator.com') or { + println('Failed fetching from URL') + return + } mut pos := 0 for { pos = html.index_after('https://', pos + 1) diff --git a/examples/news_fetcher.v b/examples/news_fetcher.v index 574940d7e6..c355209fd9 100644 --- a/examples/news_fetcher.v +++ b/examples/news_fetcher.v @@ -33,7 +33,10 @@ fn (f mut Fetcher) fetch() { id := f.ids[f.cursor] f.cursor++ f.mu.unlock() - resp := http.get('https://hacker-news.firebaseio.com/v0/item/${id}.json') + resp := http.get('https://hacker-news.firebaseio.com/v0/item/${id}.json') or { + println('failed to fetch data from /v0/item/${id}.json') + exit(1) + } story := json.decode(Story, resp) or { println('failed to decode a story') exit(1) @@ -48,9 +51,12 @@ fn (f mut Fetcher) fetch() { // Fetches top HN stories in 8 coroutines fn main() { - resp := http.get('https://hacker-news.firebaseio.com/v0/topstories.json') + resp := http.get('https://hacker-news.firebaseio.com/v0/topstories.json') or { + println('failed to fetch data from /v0/topstories.json') + return + } ids := json.decode( []int, resp) or { - println('failed to fetch topstories.json') + println('failed to decode topstories.json') return } fetcher := &Fetcher{ids: ids} diff --git a/vlib/http/http.v b/vlib/http/http.v index 5f38259f9e..e5b97b2bcf 100644 --- a/vlib/http/http.v +++ b/vlib/http/http.v @@ -28,23 +28,32 @@ pub: } // embed 'http' -pub fn get(url string) string { - if url == '' { - println('http: empty get url') - return '' +pub fn fetch(typ, url, data string) ?Response { + req := new_request('GET', url, '') or { + return error(err) } - mut req := new_request('GET', url, '') resp := req.do() + return resp +} + +pub fn get(url string) ?string { + resp := fetch('GET', url, '') or { + return error(err) + } return resp.body } -pub fn post(url, data string) string { - req := new_request('POST', url, data) - resp := req.do() +pub fn post(url, data string) ?string { + resp := fetch('POST', url, data) or { + return error(err) + } return resp.body } -pub fn new_request(typ, _url, _data string) *Request { +pub fn new_request(typ, _url, _data string) ?Request { + if _url == '' { + return error('http: empty url') + } mut url := _url mut data := _data // req.headers['User-Agent'] = 'V $VERSION' @@ -54,7 +63,7 @@ pub fn new_request(typ, _url, _data string) *Request { data = '' } // req.headers = new_map(0, sizeof(string))// []string{} - return &Request { + return Request { typ: typ url: url data: data @@ -64,12 +73,6 @@ pub fn new_request(typ, _url, _data string) *Request { } } -/* -fn (req &Request) do() Response { - mut resp := Response{} - return resp -} -*/ fn (req mut Request) free() { req.headers.free() }