From ba8a265c7be2bd3dbaf3569e0d86c09e12c51acd Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 30 May 2018 12:20:49 +0100 Subject: [PATCH] lib/fetcher: Factor out HTTP status code handling from soup and curl Use the same G_IO_ERROR_* values for HTTP status codes in both fetchers. The libsoup fetcher still handles a few more internal error codes than the libcurl one; this could be built on in future. Signed-off-by: Philip Withnall --- src/libostree/ostree-fetcher-curl.c | 14 +------------- src/libostree/ostree-fetcher-soup.c | 15 +++++---------- src/libostree/ostree-fetcher-util.c | 19 +++++++++++++++++++ src/libostree/ostree-fetcher-util.h | 2 ++ 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/libostree/ostree-fetcher-curl.c b/src/libostree/ostree-fetcher-curl.c index c0f3813101..2e090cfa07 100644 --- a/src/libostree/ostree-fetcher-curl.c +++ b/src/libostree/ostree-fetcher-curl.c @@ -337,19 +337,7 @@ check_multi_info (OstreeFetcher *fetcher) curl_easy_getinfo (easy, CURLINFO_RESPONSE_CODE, &response); if (!is_file && !(response >= 200 && response < 300)) { - GIOErrorEnum giocode; - - /* TODO - share with soup */ - switch (response) - { - case 404: - case 403: - case 410: - giocode = G_IO_ERROR_NOT_FOUND; - break; - default: - giocode = G_IO_ERROR_FAILED; - } + GIOErrorEnum giocode = _ostree_fetcher_http_status_code_to_io_error (response); if (req->idx + 1 == req->mirrorlist->len) { diff --git a/src/libostree/ostree-fetcher-soup.c b/src/libostree/ostree-fetcher-soup.c index 43794275d4..89b78584db 100644 --- a/src/libostree/ostree-fetcher-soup.c +++ b/src/libostree/ostree-fetcher-soup.c @@ -1070,19 +1070,13 @@ on_request_sent (GObject *object, soup_uri_to_string (soup_request_get_uri (pending->request), FALSE); GIOErrorEnum code; + switch (msg->status_code) { - case SOUP_STATUS_NOT_FOUND: - case SOUP_STATUS_FORBIDDEN: - case SOUP_STATUS_GONE: - code = G_IO_ERROR_NOT_FOUND; - break; + /* These statuses are internal to libsoup, and not standard HTTP ones: */ case SOUP_STATUS_CANCELLED: code = G_IO_ERROR_CANCELLED; break; - case SOUP_STATUS_REQUEST_TIMEOUT: - code = G_IO_ERROR_TIMED_OUT; - break; case SOUP_STATUS_CANT_RESOLVE: case SOUP_STATUS_CANT_CONNECT: code = G_IO_ERROR_HOST_NOT_FOUND; @@ -1092,10 +1086,11 @@ on_request_sent (GObject *object, code = G_IO_ERROR_BROKEN_PIPE; #else code = G_IO_ERROR_CONNECTION_CLOSED; -#endif break; +#endif default: - code = G_IO_ERROR_FAILED; + code = _ostree_fetcher_http_status_code_to_io_error (msg->status_code); + break; } { diff --git a/src/libostree/ostree-fetcher-util.c b/src/libostree/ostree-fetcher-util.c index 9cdb82c6c1..6f759c86e8 100644 --- a/src/libostree/ostree-fetcher-util.c +++ b/src/libostree/ostree-fetcher-util.c @@ -218,3 +218,22 @@ _ostree_fetcher_should_retry_request (const GError *error, return FALSE; } + +/* Convert a HTTP status code representing an error from libsoup or libcurl to + * a #GIOError. This will return %G_IO_ERROR_FAILED if the status code is + * unknown or otherwise unhandled. */ +GIOError +_ostree_fetcher_http_status_code_to_io_error (guint status_code) +{ + switch (status_code) + { + case 403: /* SOUP_STATUS_FORBIDDEN */ + case 404: /* SOUP_STATUS_NOT_FOUND */ + case 410: /* SOUP_STATUS_GONE */ + return G_IO_ERROR_NOT_FOUND; + case 408: /* SOUP_STATUS_REQUEST_TIMEOUT */ + return G_IO_ERROR_TIMED_OUT; + default: + return G_IO_ERROR_FAILED; + } +} diff --git a/src/libostree/ostree-fetcher-util.h b/src/libostree/ostree-fetcher-util.h index 5f62ad45b7..1cade06860 100644 --- a/src/libostree/ostree-fetcher-util.h +++ b/src/libostree/ostree-fetcher-util.h @@ -78,6 +78,8 @@ void _ostree_fetcher_journal_failure (const char *remote_name, gboolean _ostree_fetcher_should_retry_request (const GError *error, guint n_retries_remaining); +GIOError _ostree_fetcher_http_status_code_to_io_error (guint status_code); + G_END_DECLS #endif