diff options
author | Don Kjer <don@lindenlab.com> | 2013-03-13 06:26:25 +0000 |
---|---|---|
committer | Don Kjer <don@lindenlab.com> | 2013-03-13 06:26:25 +0000 |
commit | f945415210f0e18c2c6d941fda6b7d45cb0f06f1 (patch) | |
tree | cf93ca0d9596a82a8fc7a4d1b1f0ee263ea5549e /indra/llmessage/llhttpconstants.h | |
parent | 54cdc322b8f2bd35b289cacf3493622e7cc51194 (diff) |
Large changes to the LLCurl::Responder API, as well as pulling in some changes to common libraries from the server codebase:
* Additional error checking in http handlers.
* Uniform log spam for http errors.
* Switch to using constants for http heads and status codes.
* Fixed bugs in incorrectly checking if parsing LLSD xml resulted in an error.
* Reduced spam regarding LLSD parsing errors in the default completedRaw http handler. It should not longer be necessary to short-circuit completedRaw to avoid spam.
* Ported over a few bug fixes from the server code.
* Switch mode http status codes to use S32 instead of U32.
* Ported LLSD::asStringRef from server code; avoids copying strings all over the place.
* Ported server change to LLSD::asBinary; this always returns a reference now instead of copying the entire binary blob.
* Ported server pretty notation format (and pretty binary format) to llsd serialization.
* The new LLCurl::Responder API no longer has two error handlers to choose from. Overriding the following methods have been deprecated:
** error - use httpFailure
** errorWithContent - use httpFailure
** result - use httpSuccess
** completed - use httpCompleted
** completedHeader - no longer necessary; call getResponseHeaders() from a completion method to obtain these headers.
* In order to 'catch' a completed http request, override one of these methods:
** httpSuccess - Called for any 2xx status code.
** httpFailure - Called for any non-2xx status code.
** httpComplete - Called for all status codes. Default implementation is to call either httpSuccess or httpFailure.
* It is recommended to keep these methods protected/private in order to avoid triggering of these methods without using a 'push' method (see below).
* Uniform error handling should followed whenever possible by calling a variant of this during httpFailure:
** llwarns << dumpResponse() << llendl;
* Be sure to include LOG_CLASS(your_class_name) in your class in order for the log entry to give more context.
* In order to 'push' a result into the responder, you should no longer call error, errorWithContent, result, or completed.
* Nor should you directly call httpSuccess/Failure/Completed (unless passing a message up to a parent class).
* Instead, you can set the internal content of a responder and trigger a corresponding method using the following methods:
** successResult - Sets results and calls httpSuccess
** failureResult - Sets results and calls httpFailure
** completedResult - Sets results and calls httpCompleted
* To obtain information about a the response from a reponder method, use the following getters:
** getStatus - HTTP status code
** getReason - Reason string
** getContent - Content (Parsed body LLSD)
** getResponseHeaders - Response Headers (LLSD map)
** getHTTPMethod - HTTP method of the request
** getURL - URL of the request
* It is still possible to override completeRaw if you want to manipulate data directly out of LLPumpIO.
* See indra/llmessage/llcurl.h for more information.
Diffstat (limited to 'indra/llmessage/llhttpconstants.h')
-rw-r--r-- | indra/llmessage/llhttpconstants.h | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/indra/llmessage/llhttpconstants.h b/indra/llmessage/llhttpconstants.h new file mode 100644 index 0000000000..34263e17c8 --- /dev/null +++ b/indra/llmessage/llhttpconstants.h @@ -0,0 +1,220 @@ +/** + * @file llhttpconstants.h + * @brief Constants for HTTP requests and responses + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2013, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_HTTP_CONSTANTS_H +#define LL_HTTP_CONSTANTS_H + +#include "stdtypes.h" + +/////// HTTP STATUS CODES /////// + +// Standard errors from HTTP spec: +// http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1 +const S32 HTTP_CONTINUE = 100; +const S32 HTTP_SWITCHING_PROTOCOLS = 101; + +// Success +const S32 HTTP_OK = 200; +const S32 HTTP_CREATED = 201; +const S32 HTTP_ACCEPTED = 202; +const S32 HTTP_NON_AUTHORITATIVE_INFORMATION = 203; +const S32 HTTP_NO_CONTENT = 204; +const S32 HTTP_RESET_CONTENT = 205; +const S32 HTTP_PARTIAL_CONTENT = 206; + +// Redirection +const S32 HTTP_MULTIPLE_CHOICES = 300; +const S32 HTTP_MOVED_PERMANENTLY = 301; +const S32 HTTP_FOUND = 302; +const S32 HTTP_SEE_OTHER = 303; +const S32 HTTP_NOT_MODIFIED = 304; +const S32 HTTP_USE_PROXY = 305; +const S32 HTTP_TEMPORARY_REDIRECT = 307; + +// Client Error +const S32 HTTP_BAD_REQUEST = 400; +const S32 HTTP_UNAUTHORIZED = 401; +const S32 HTTP_PAYMENT_REQUIRED = 402; +const S32 HTTP_FORBIDDEN = 403; +const S32 HTTP_NOT_FOUND = 404; +const S32 HTTP_METHOD_NOT_ALLOWED = 405; +const S32 HTTP_NOT_ACCEPTABLE = 406; +const S32 HTTP_PROXY_AUTHENTICATION_REQUIRED = 407; +const S32 HTTP_REQUEST_TIME_OUT = 408; +const S32 HTTP_CONFLICT = 409; +const S32 HTTP_GONE = 410; +const S32 HTTP_LENGTH_REQUIRED = 411; +const S32 HTTP_PRECONDITION_FAILED = 412; +const S32 HTTP_REQUEST_ENTITY_TOO_LARGE = 413; +const S32 HTTP_REQUEST_URI_TOO_LARGE = 414; +const S32 HTTP_UNSUPPORTED_MEDIA_TYPE = 415; +const S32 HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416; +const S32 HTTP_EXPECTATION_FAILED = 417; + +// Server Error +const S32 HTTP_INTERNAL_SERVER_ERROR = 500; +const S32 HTTP_NOT_IMPLEMENTED = 501; +const S32 HTTP_BAD_GATEWAY = 502; +const S32 HTTP_SERVICE_UNAVAILABLE = 503; +const S32 HTTP_GATEWAY_TIME_OUT = 504; +const S32 HTTP_VERSION_NOT_SUPPORTED = 505; + +// We combine internal process errors with status codes +// These status codes should not be sent over the wire +// and indicate something went wrong internally. +// If you get these they are not normal. +const S32 HTTP_INTERNAL_CURL_ERROR = 498; +const S32 HTTP_INTERNAL_ERROR = 499; + + +////// HTTP Methods ////// + +extern const std::string HTTP_VERB_INVALID; +extern const std::string HTTP_VERB_HEAD; +extern const std::string HTTP_VERB_GET; +extern const std::string HTTP_VERB_PUT; +extern const std::string HTTP_VERB_POST; +extern const std::string HTTP_VERB_DELETE; +extern const std::string HTTP_VERB_MOVE; +extern const std::string HTTP_VERB_OPTIONS; + +enum EHTTPMethod +{ + HTTP_INVALID = 0, + HTTP_HEAD, + HTTP_GET, + HTTP_PUT, + HTTP_POST, + HTTP_DELETE, + HTTP_MOVE, // Caller will need to set 'Destination' header + HTTP_OPTIONS, + HTTP_METHOD_COUNT +}; + +const std::string& httpMethodAsVerb(EHTTPMethod method); +bool isHttpInformationalStatus(S32 status); +bool isHttpGoodStatus(S32 status); +bool isHttpRedirectStatus(S32 status); +bool isHttpClientErrorStatus(S32 status); +bool isHttpServerErrorStatus(S32 status); + +// Parses 'Retry-After' header contents and returns seconds until retry should occur. +bool getSecondsUntilRetryAfter(const std::string& retry_after, F32& seconds_to_wait); + +//// HTTP Headers ///// + +extern const std::string HTTP_HEADER_ACCEPT; +extern const std::string HTTP_HEADER_ACCEPT_CHARSET; +extern const std::string HTTP_HEADER_ACCEPT_ENCODING; +extern const std::string HTTP_HEADER_ACCEPT_LANGUAGE; +extern const std::string HTTP_HEADER_ACCEPT_RANGES; +extern const std::string HTTP_HEADER_AGE; +extern const std::string HTTP_HEADER_ALLOW; +extern const std::string HTTP_HEADER_AUTHORIZATION; +extern const std::string HTTP_HEADER_CACHE_CONTROL; +extern const std::string HTTP_HEADER_CONNECTION; +extern const std::string HTTP_HEADER_CONTENT_DESCRIPTION; +extern const std::string HTTP_HEADER_CONTENT_ENCODING; +extern const std::string HTTP_HEADER_CONTENT_ID; +extern const std::string HTTP_HEADER_CONTENT_LANGUAGE; +extern const std::string HTTP_HEADER_CONTENT_LENGTH; +extern const std::string HTTP_HEADER_CONTENT_LOCATION; +extern const std::string HTTP_HEADER_CONTENT_MD5; +extern const std::string HTTP_HEADER_CONTENT_RANGE; +extern const std::string HTTP_HEADER_CONTENT_TRANSFER_ENCODING; +extern const std::string HTTP_HEADER_CONTENT_TYPE; +extern const std::string HTTP_HEADER_COOKIE; +extern const std::string HTTP_HEADER_DATE; +extern const std::string HTTP_HEADER_DESTINATION; +extern const std::string HTTP_HEADER_ETAG; +extern const std::string HTTP_HEADER_EXPECT; +extern const std::string HTTP_HEADER_EXPIRES; +extern const std::string HTTP_HEADER_FROM; +extern const std::string HTTP_HEADER_HOST; +extern const std::string HTTP_HEADER_IF_MATCH; +extern const std::string HTTP_HEADER_IF_MODIFIED_SINCE; +extern const std::string HTTP_HEADER_IF_NONE_MATCH; +extern const std::string HTTP_HEADER_IF_RANGE; +extern const std::string HTTP_HEADER_IF_UNMODIFIED_SINCE; +extern const std::string HTTP_HEADER_KEEP_ALIVE; +extern const std::string HTTP_HEADER_LAST_MODIFIED; +extern const std::string HTTP_HEADER_LOCATION; +extern const std::string HTTP_HEADER_MAX_FORWARDS; +extern const std::string HTTP_HEADER_MIME_VERSION; +extern const std::string HTTP_HEADER_PRAGMA; +extern const std::string HTTP_HEADER_PROXY_AUTHENTICATE; +extern const std::string HTTP_HEADER_PROXY_AUTHORIZATION; +extern const std::string HTTP_HEADER_RANGE; +extern const std::string HTTP_HEADER_REFERER; +extern const std::string HTTP_HEADER_RETRY_AFTER; +extern const std::string HTTP_HEADER_SERVER; +extern const std::string HTTP_HEADER_SET_COOKIE; +extern const std::string HTTP_HEADER_TE; +extern const std::string HTTP_HEADER_TRAILER; +extern const std::string HTTP_HEADER_TRANSFER_ENCODING; +extern const std::string HTTP_HEADER_UPGRADE; +extern const std::string HTTP_HEADER_USER_AGENT; +extern const std::string HTTP_HEADER_VARY; +extern const std::string HTTP_HEADER_VIA; +extern const std::string HTTP_HEADER_WARNING; +extern const std::string HTTP_HEADER_WWW_AUTHENTICATE; + +// Sadly, our proxied headers do not follow http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html +// We need to deal with lowercase headers +extern const std::string HTTP_HEADER_LOWER_ACCEPT_LANGUAGE; +extern const std::string HTTP_HEADER_LOWER_CACHE_CONTROL; +extern const std::string HTTP_HEADER_LOWER_CONTENT_LENGTH; +extern const std::string HTTP_HEADER_LOWER_CONTENT_TYPE; +extern const std::string HTTP_HEADER_LOWER_HOST; +extern const std::string HTTP_HEADER_LOWER_USER_AGENT; +extern const std::string HTTP_HEADER_LOWER_X_FORWARDED_FOR; + +//// HTTP Content Types //// + +extern const std::string HTTP_CONTENT_LLSD_XML; +extern const std::string HTTP_CONTENT_OCTET_STREAM; +extern const std::string HTTP_CONTENT_XML; +extern const std::string HTTP_CONTENT_JSON; +extern const std::string HTTP_CONTENT_TEXT_HTML; +extern const std::string HTTP_CONTENT_TEXT_HTML_UTF8; +extern const std::string HTTP_CONTENT_TEXT_PLAIN_UTF8; +extern const std::string HTTP_CONTENT_TEXT_LLSD; +extern const std::string HTTP_CONTENT_TEXT_XML; +extern const std::string HTTP_CONTENT_TEXT_LSL; +extern const std::string HTTP_CONTENT_TEXT_PLAIN; +extern const std::string HTTP_CONTENT_IMAGE_X_J2C; +extern const std::string HTTP_CONTENT_IMAGE_J2C; +extern const std::string HTTP_CONTENT_IMAGE_JPEG; +extern const std::string HTTP_CONTENT_IMAGE_PNG; +extern const std::string HTTP_CONTENT_IMAGE_BMP; + +#endif |