From 778346b0b04bc52c89529668b37c1086bebe1674 Mon Sep 17 00:00:00 2001 From: Frédéric Guillot Date: Sun, 14 Oct 2018 21:43:48 -0700 Subject: Simplify feed fetcher - Add browser package to handle HTTP errors - Reduce code duplication --- reader/browser/browser.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 reader/browser/browser.go (limited to 'reader/browser') diff --git a/reader/browser/browser.go b/reader/browser/browser.go new file mode 100644 index 0000000..733d5f5 --- /dev/null +++ b/reader/browser/browser.go @@ -0,0 +1,55 @@ +// Copyright 2018 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package browser // import "miniflux.app/reader/browser" + +import ( + "miniflux.app/errors" + "miniflux.app/http/client" +) + +var ( + errRequestFailed = "Unable to open this link: %v" + errServerFailure = "Unable to fetch this resource (Status Code = %d)" + errEncoding = "Unable to normalize encoding: %q" + errEmptyFeed = "This feed is empty" + errResourceNotFound = "Resource not found (404), this feed doesn't exists anymore, check the feed URL" + errNotAuthorized = "You are not authorized to access this resource (invalid username/password)" +) + +// Exec executes a HTTP request and handles errors. +func Exec(request *client.Client) (*client.Response, *errors.LocalizedError) { + response, err := request.Get() + if err != nil { + if e, ok := err.(*errors.LocalizedError); ok { + return nil, e + } + return nil, errors.NewLocalizedError(errRequestFailed, err) + } + + if response.IsNotFound() { + return nil, errors.NewLocalizedError(errResourceNotFound) + } + + if response.IsNotAuthorized() { + return nil, errors.NewLocalizedError(errNotAuthorized) + } + + if response.HasServerFailure() { + return nil, errors.NewLocalizedError(errServerFailure, response.StatusCode) + } + + if response.StatusCode != 304 { + // Content-Length = -1 when no Content-Length header is sent. + if response.ContentLength == 0 { + return nil, errors.NewLocalizedError(errEmptyFeed) + } + + if err := response.EnsureUnicodeBody(); err != nil { + return nil, errors.NewLocalizedError(errEncoding, err) + } + } + + return response, nil +} -- cgit v1.2.3