Blame libsoup/soup-status.c

Packit Service ca3877
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
Packit Service ca3877
/*
Packit Service ca3877
 * soup-status.c: Status code descriptions
Packit Service ca3877
 *
Packit Service ca3877
 * Copyright (C) 2001-2003, Ximian, Inc.
Packit Service ca3877
 */
Packit Service ca3877
Packit Service ca3877
#ifdef HAVE_CONFIG_H
Packit Service ca3877
#include <config.h>
Packit Service ca3877
#endif
Packit Service ca3877
Packit Service ca3877
#include "soup-status.h"
Packit Service ca3877
#include "soup.h"
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * SECTION:soup-status
Packit Service ca3877
 * @short_description: HTTP (and libsoup) status codes
Packit Service ca3877
 *
Packit Service ca3877
 **/
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * SOUP_STATUS_IS_TRANSPORT_ERROR:
Packit Service ca3877
 * @status: a status code
Packit Service ca3877
 *
Packit Service ca3877
 * Tests if @status is a libsoup transport error.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: %TRUE or %FALSE
Packit Service ca3877
 **/
Packit Service ca3877
/**
Packit Service ca3877
 * SOUP_STATUS_IS_INFORMATIONAL:
Packit Service ca3877
 * @status: an HTTP status code
Packit Service ca3877
 *
Packit Service ca3877
 * Tests if @status is an Informational (1xx) response.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: %TRUE or %FALSE
Packit Service ca3877
 **/
Packit Service ca3877
/**
Packit Service ca3877
 * SOUP_STATUS_IS_SUCCESSFUL:
Packit Service ca3877
 * @status: an HTTP status code
Packit Service ca3877
 *
Packit Service ca3877
 * Tests if @status is a Successful (2xx) response.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: %TRUE or %FALSE
Packit Service ca3877
 **/
Packit Service ca3877
/**
Packit Service ca3877
 * SOUP_STATUS_IS_REDIRECTION:
Packit Service ca3877
 * @status: an HTTP status code
Packit Service ca3877
 *
Packit Service ca3877
 * Tests if @status is a Redirection (3xx) response.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: %TRUE or %FALSE
Packit Service ca3877
 **/
Packit Service ca3877
/**
Packit Service ca3877
 * SOUP_STATUS_IS_CLIENT_ERROR:
Packit Service ca3877
 * @status: an HTTP status code
Packit Service ca3877
 *
Packit Service ca3877
 * Tests if @status is a Client Error (4xx) response.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: %TRUE or %FALSE
Packit Service ca3877
 **/
Packit Service ca3877
/**
Packit Service ca3877
 * SOUP_STATUS_IS_SERVER_ERROR:
Packit Service ca3877
 * @status: an HTTP status code
Packit Service ca3877
 *
Packit Service ca3877
 * Tests if @status is a Server Error (5xx) response.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: %TRUE or %FALSE
Packit Service ca3877
 **/
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * SoupStatus:
Packit Service ca3877
 * @SOUP_STATUS_NONE: No status available. (Eg, the message has not
Packit Service ca3877
 * been sent yet)
Packit Service ca3877
 * @SOUP_STATUS_CANCELLED: Message was cancelled locally
Packit Service ca3877
 * @SOUP_STATUS_CANT_RESOLVE: Unable to resolve destination host name
Packit Service ca3877
 * @SOUP_STATUS_CANT_RESOLVE_PROXY: Unable to resolve proxy host name
Packit Service ca3877
 * @SOUP_STATUS_CANT_CONNECT: Unable to connect to remote host
Packit Service ca3877
 * @SOUP_STATUS_CANT_CONNECT_PROXY: Unable to connect to proxy
Packit Service ca3877
 * @SOUP_STATUS_SSL_FAILED: SSL/TLS negotiation failed
Packit Service ca3877
 * @SOUP_STATUS_IO_ERROR: A network error occurred, or the other end
Packit Service ca3877
 * closed the connection unexpectedly
Packit Service ca3877
 * @SOUP_STATUS_MALFORMED: Malformed data (usually a programmer error)
Packit Service ca3877
 * @SOUP_STATUS_TRY_AGAIN: Used internally
Packit Service ca3877
 * @SOUP_STATUS_TOO_MANY_REDIRECTS: There were too many redirections
Packit Service ca3877
 * @SOUP_STATUS_TLS_FAILED: Used internally
Packit Service ca3877
 * @SOUP_STATUS_CONTINUE: 100 Continue (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_SWITCHING_PROTOCOLS: 101 Switching Protocols (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_PROCESSING: 102 Processing (WebDAV)
Packit Service ca3877
 * @SOUP_STATUS_OK: 200 Success (HTTP). Also used by many lower-level
Packit Service ca3877
 * soup routines to indicate success.
Packit Service ca3877
 * @SOUP_STATUS_CREATED: 201 Created (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_ACCEPTED: 202 Accepted (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_NON_AUTHORITATIVE: 203 Non-Authoritative Information
Packit Service ca3877
 * (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_NO_CONTENT: 204 No Content (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_RESET_CONTENT: 205 Reset Content (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_PARTIAL_CONTENT: 206 Partial Content (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_MULTI_STATUS: 207 Multi-Status (WebDAV)
Packit Service ca3877
 * @SOUP_STATUS_MULTIPLE_CHOICES: 300 Multiple Choices (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_MOVED_PERMANENTLY: 301 Moved Permanently (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_FOUND: 302 Found (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_MOVED_TEMPORARILY: 302 Moved Temporarily (old name,
Packit Service ca3877
 * RFC 2068)
Packit Service ca3877
 * @SOUP_STATUS_SEE_OTHER: 303 See Other (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_NOT_MODIFIED: 304 Not Modified (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_USE_PROXY: 305 Use Proxy (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_NOT_APPEARING_IN_THIS_PROTOCOL: 306 [Unused] (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_TEMPORARY_REDIRECT: 307 Temporary Redirect (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_BAD_REQUEST: 400 Bad Request (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_UNAUTHORIZED: 401 Unauthorized (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_PAYMENT_REQUIRED: 402 Payment Required (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_FORBIDDEN: 403 Forbidden (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_NOT_FOUND: 404 Not Found (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_METHOD_NOT_ALLOWED: 405 Method Not Allowed (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_NOT_ACCEPTABLE: 406 Not Acceptable (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_PROXY_AUTHENTICATION_REQUIRED: 407 Proxy Authentication
Packit Service ca3877
 * Required (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_PROXY_UNAUTHORIZED: shorter alias for
Packit Service ca3877
 * %SOUP_STATUS_PROXY_AUTHENTICATION_REQUIRED
Packit Service ca3877
 * @SOUP_STATUS_REQUEST_TIMEOUT: 408 Request Timeout (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_CONFLICT: 409 Conflict (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_GONE: 410 Gone (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_LENGTH_REQUIRED: 411 Length Required (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_PRECONDITION_FAILED: 412 Precondition Failed (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_REQUEST_ENTITY_TOO_LARGE: 413 Request Entity Too Large
Packit Service ca3877
 * (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_REQUEST_URI_TOO_LONG: 414 Request-URI Too Long (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_UNSUPPORTED_MEDIA_TYPE: 415 Unsupported Media Type
Packit Service ca3877
 * (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_REQUESTED_RANGE_NOT_SATISFIABLE: 416 Requested Range
Packit Service ca3877
 * Not Satisfiable (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_INVALID_RANGE: shorter alias for
Packit Service ca3877
 * %SOUP_STATUS_REQUESTED_RANGE_NOT_SATISFIABLE
Packit Service ca3877
 * @SOUP_STATUS_EXPECTATION_FAILED: 417 Expectation Failed (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_UNPROCESSABLE_ENTITY: 422 Unprocessable Entity
Packit Service ca3877
 * (WebDAV)
Packit Service ca3877
 * @SOUP_STATUS_LOCKED: 423 Locked (WebDAV)
Packit Service ca3877
 * @SOUP_STATUS_FAILED_DEPENDENCY: 424 Failed Dependency (WebDAV)
Packit Service ca3877
 * @SOUP_STATUS_INTERNAL_SERVER_ERROR: 500 Internal Server Error
Packit Service ca3877
 * (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_NOT_IMPLEMENTED: 501 Not Implemented (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_BAD_GATEWAY: 502 Bad Gateway (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_SERVICE_UNAVAILABLE: 503 Service Unavailable (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_GATEWAY_TIMEOUT: 504 Gateway Timeout (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_HTTP_VERSION_NOT_SUPPORTED: 505 HTTP Version Not
Packit Service ca3877
 * Supported (HTTP)
Packit Service ca3877
 * @SOUP_STATUS_INSUFFICIENT_STORAGE: 507 Insufficient Storage
Packit Service ca3877
 * (WebDAV)
Packit Service ca3877
 * @SOUP_STATUS_NOT_EXTENDED: 510 Not Extended (RFC 2774)
Packit Service ca3877
 * 
Packit Service ca3877
 * These represent the known HTTP status code values, plus various
Packit Service ca3877
 * network and internal errors.
Packit Service ca3877
 *
Packit Service ca3877
 * Note that no libsoup functions take or return this type directly;
Packit Service ca3877
 * any function that works with status codes will accept unrecognized
Packit Service ca3877
 * status codes as well.
Packit Service ca3877
 *
Packit Service ca3877
 * Prior to 2.44 this type was called
Packit Service ca3877
 * <literal>SoupKnownStatusCode</literal>, but the individual values
Packit Service ca3877
 * have always had the names they have now.
Packit Service ca3877
 **/
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * SOUP_HTTP_ERROR:
Packit Service ca3877
 *
Packit Service ca3877
 * A #GError domain representing an HTTP status. Use a #SoupStatus for
Packit Service ca3877
 * the <structfield>code</structfield> value.
Packit Service ca3877
 **/
Packit Service ca3877
Packit Service ca3877
Packit Service ca3877
/* The reason_phrases are not localized because:
Packit Service ca3877
 *
Packit Service ca3877
 * 1. Only ASCII can be used portably in the HTTP Status-Line, so we
Packit Service ca3877
 *    would not be able to return localized reason phrases from
Packit Service ca3877
 *    SoupServer anyway.
Packit Service ca3877
 *
Packit Service ca3877
 * 2. Having a way for clients to get a localized version of a status
Packit Service ca3877
 *    code would just encourage them to present those strings to the
Packit Service ca3877
 *    user, which is bad because many of them are fairly
Packit Service ca3877
 *    incomprehensible anyway.
Packit Service ca3877
 */
Packit Service ca3877
Packit Service ca3877
static const struct {
Packit Service ca3877
	guint code;
Packit Service ca3877
	const char *phrase;
Packit Service ca3877
} reason_phrases [] = {
Packit Service ca3877
	/* Transport errors */
Packit Service ca3877
	{ SOUP_STATUS_CANCELLED,                  "Cancelled" },
Packit Service ca3877
	{ SOUP_STATUS_CANT_RESOLVE,               "Cannot resolve hostname" },
Packit Service ca3877
	{ SOUP_STATUS_CANT_RESOLVE_PROXY,         "Cannot resolve proxy hostname" },
Packit Service ca3877
	{ SOUP_STATUS_CANT_CONNECT,               "Cannot connect to destination" },
Packit Service ca3877
	{ SOUP_STATUS_CANT_CONNECT_PROXY,         "Cannot connect to proxy" },
Packit Service ca3877
	{ SOUP_STATUS_SSL_FAILED,                 "SSL handshake failed" },
Packit Service ca3877
	{ SOUP_STATUS_IO_ERROR,                   "Connection terminated unexpectedly" },
Packit Service ca3877
	{ SOUP_STATUS_MALFORMED,                  "Message Corrupt" },
Packit Service ca3877
	{ SOUP_STATUS_TOO_MANY_REDIRECTS,         "Too many redirects" },
Packit Service ca3877
Packit Service ca3877
	/* Informational */
Packit Service ca3877
	{ SOUP_STATUS_CONTINUE,                   "Continue" },
Packit Service ca3877
	{ SOUP_STATUS_SWITCHING_PROTOCOLS,        "Switching Protocols" },
Packit Service ca3877
	{ SOUP_STATUS_PROCESSING,                 "Processing" },
Packit Service ca3877
Packit Service ca3877
	/* Success */
Packit Service ca3877
	{ SOUP_STATUS_OK,                         "OK" },
Packit Service ca3877
	{ SOUP_STATUS_CREATED,                    "Created" },
Packit Service ca3877
	{ SOUP_STATUS_ACCEPTED,                   "Accepted" },
Packit Service ca3877
	{ SOUP_STATUS_NON_AUTHORITATIVE,          "Non-Authoritative Information" },
Packit Service ca3877
	{ SOUP_STATUS_NO_CONTENT,                 "No Content" },
Packit Service ca3877
	{ SOUP_STATUS_RESET_CONTENT,              "Reset Content" },
Packit Service ca3877
	{ SOUP_STATUS_PARTIAL_CONTENT,            "Partial Content" },
Packit Service ca3877
	{ SOUP_STATUS_MULTI_STATUS,               "Multi-Status" },
Packit Service ca3877
Packit Service ca3877
	/* Redirection */
Packit Service ca3877
	{ SOUP_STATUS_MULTIPLE_CHOICES,           "Multiple Choices" },
Packit Service ca3877
	{ SOUP_STATUS_MOVED_PERMANENTLY,          "Moved Permanently" },
Packit Service ca3877
	{ SOUP_STATUS_FOUND,                      "Found" },
Packit Service ca3877
	{ SOUP_STATUS_SEE_OTHER,                  "See Other" },
Packit Service ca3877
	{ SOUP_STATUS_NOT_MODIFIED,               "Not Modified" },
Packit Service ca3877
	{ SOUP_STATUS_USE_PROXY,                  "Use Proxy" },
Packit Service ca3877
	{ SOUP_STATUS_TEMPORARY_REDIRECT,         "Temporary Redirect" },
Packit Service ca3877
Packit Service ca3877
	/* Client error */
Packit Service ca3877
	{ SOUP_STATUS_BAD_REQUEST,                "Bad Request" },
Packit Service ca3877
	{ SOUP_STATUS_UNAUTHORIZED,               "Unauthorized" },
Packit Service ca3877
	{ SOUP_STATUS_PAYMENT_REQUIRED,           "Payment Required" },
Packit Service ca3877
	{ SOUP_STATUS_FORBIDDEN,                  "Forbidden" },
Packit Service ca3877
	{ SOUP_STATUS_NOT_FOUND,                  "Not Found" },
Packit Service ca3877
	{ SOUP_STATUS_METHOD_NOT_ALLOWED,         "Method Not Allowed" },
Packit Service ca3877
	{ SOUP_STATUS_NOT_ACCEPTABLE,             "Not Acceptable" },
Packit Service ca3877
	{ SOUP_STATUS_PROXY_UNAUTHORIZED,         "Proxy Authentication Required" },
Packit Service ca3877
	{ SOUP_STATUS_REQUEST_TIMEOUT,            "Request Timeout" },
Packit Service ca3877
	{ SOUP_STATUS_CONFLICT,                   "Conflict" },
Packit Service ca3877
	{ SOUP_STATUS_GONE,                       "Gone" },
Packit Service ca3877
	{ SOUP_STATUS_LENGTH_REQUIRED,            "Length Required" },
Packit Service ca3877
	{ SOUP_STATUS_PRECONDITION_FAILED,        "Precondition Failed" },
Packit Service ca3877
	{ SOUP_STATUS_REQUEST_ENTITY_TOO_LARGE,   "Request Entity Too Large" },
Packit Service ca3877
	{ SOUP_STATUS_REQUEST_URI_TOO_LONG,       "Request-URI Too Long" },
Packit Service ca3877
	{ SOUP_STATUS_UNSUPPORTED_MEDIA_TYPE,     "Unsupported Media Type" },
Packit Service ca3877
	{ SOUP_STATUS_INVALID_RANGE,              "Requested Range Not Satisfiable" },
Packit Service ca3877
	{ SOUP_STATUS_EXPECTATION_FAILED,         "Expectation Failed" },
Packit Service ca3877
	{ SOUP_STATUS_UNPROCESSABLE_ENTITY,       "Unprocessable Entity" },
Packit Service ca3877
	{ SOUP_STATUS_LOCKED,                     "Locked" },
Packit Service ca3877
	{ SOUP_STATUS_FAILED_DEPENDENCY,          "Failed Dependency" },
Packit Service ca3877
Packit Service ca3877
	/* Server error */
Packit Service ca3877
	{ SOUP_STATUS_INTERNAL_SERVER_ERROR,      "Internal Server Error" },
Packit Service ca3877
	{ SOUP_STATUS_NOT_IMPLEMENTED,            "Not Implemented" },
Packit Service ca3877
	{ SOUP_STATUS_BAD_GATEWAY,                "Bad Gateway" },
Packit Service ca3877
	{ SOUP_STATUS_SERVICE_UNAVAILABLE,        "Service Unavailable" },
Packit Service ca3877
	{ SOUP_STATUS_GATEWAY_TIMEOUT,            "Gateway Timeout" },
Packit Service ca3877
	{ SOUP_STATUS_HTTP_VERSION_NOT_SUPPORTED, "HTTP Version Not Supported" },
Packit Service ca3877
	{ SOUP_STATUS_INSUFFICIENT_STORAGE,       "Insufficient Storage" },
Packit Service ca3877
	{ SOUP_STATUS_NOT_EXTENDED,               "Not Extended" },
Packit Service ca3877
Packit Service ca3877
	{ 0 }
Packit Service ca3877
};
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * soup_status_get_phrase:
Packit Service ca3877
 * @status_code: an HTTP status code
Packit Service ca3877
 *
Packit Service ca3877
 * Looks up the stock HTTP description of @status_code. This is used
Packit Service ca3877
 * by soup_message_set_status() to get the correct text to go with a
Packit Service ca3877
 * given status code.
Packit Service ca3877
 *
Packit Service ca3877
 * <emphasis>There is no reason for you to ever use this
Packit Service ca3877
 * function.</emphasis> If you wanted the textual description for the
Packit Service ca3877
 * #SoupMessage:status_code of a given #SoupMessage, you should just
Packit Service ca3877
 * look at the message's #SoupMessage:reason_phrase. However, you
Packit Service ca3877
 * should only do that for use in debugging messages; HTTP reason
Packit Service ca3877
 * phrases are not localized, and are not generally very descriptive
Packit Service ca3877
 * anyway, and so they should never be presented to the user directly.
Packit Service ca3877
 * Instead, you should create you own error messages based on the
Packit Service ca3877
 * status code, and on what you were trying to do.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: the (terse, English) description of @status_code
Packit Service ca3877
 **/
Packit Service ca3877
const char *
Packit Service ca3877
soup_status_get_phrase (guint status_code)
Packit Service ca3877
{
Packit Service ca3877
	int i;
Packit Service ca3877
Packit Service ca3877
	for (i = 0; reason_phrases [i].code; i++) {
Packit Service ca3877
		if (reason_phrases [i].code == status_code)
Packit Service ca3877
			return reason_phrases [i].phrase;
Packit Service ca3877
	}
Packit Service ca3877
Packit Service ca3877
	return "Unknown Error";
Packit Service ca3877
}
Packit Service ca3877
Packit Service ca3877
/**
Packit Service ca3877
 * soup_status_proxify:
Packit Service ca3877
 * @status_code: a status code
Packit Service ca3877
 *
Packit Service ca3877
 * Turns %SOUP_STATUS_CANT_RESOLVE into
Packit Service ca3877
 * %SOUP_STATUS_CANT_RESOLVE_PROXY and %SOUP_STATUS_CANT_CONNECT into
Packit Service ca3877
 * %SOUP_STATUS_CANT_CONNECT_PROXY. Other status codes are passed
Packit Service ca3877
 * through unchanged.
Packit Service ca3877
 *
Packit Service ca3877
 * Return value: the "proxified" equivalent of @status_code.
Packit Service ca3877
 *
Packit Service ca3877
 * Since: 2.26
Packit Service ca3877
 **/
Packit Service ca3877
guint
Packit Service ca3877
soup_status_proxify (guint status_code)
Packit Service ca3877
{
Packit Service ca3877
	if (status_code == SOUP_STATUS_CANT_RESOLVE)
Packit Service ca3877
		return SOUP_STATUS_CANT_RESOLVE_PROXY;
Packit Service ca3877
	else if (status_code == SOUP_STATUS_CANT_CONNECT)
Packit Service ca3877
		return SOUP_STATUS_CANT_CONNECT_PROXY;
Packit Service ca3877
	else
Packit Service ca3877
		return status_code;
Packit Service ca3877
}
Packit Service ca3877
Packit Service ca3877
GQuark
Packit Service ca3877
soup_http_error_quark (void)
Packit Service ca3877
{
Packit Service ca3877
	static GQuark error;
Packit Service ca3877
	if (!error)
Packit Service ca3877
		error = g_quark_from_static_string ("soup_http_error_quark");
Packit Service ca3877
	return error;
Packit Service ca3877
}