Kawe Mazidjatari b3a68ed095 Add EABase, EAThread and DirtySDK to R5sdk
DirtySDK (EA's Dirty Sockets library) will be used for the LiveAPI implementation, and depends on: EABase, EAThread.
2024-04-05 18:29:03 +02:00

177 lines
10 KiB
C

/*H********************************************************************************/
/*!
\File protohttputil.h
\Description
This module implements HTTP support routines such as URL processing, header
parsing, etc.
\Copyright
Copyright (c) Electronic Arts 2000-2012.
\Version 1.0 12/18/2012 (jbrookes) Refactored into separate module from protohttp.
*/
/********************************************************************************H*/
#ifndef _protohttputil_h
#define _protohttputil_h
/*!
\Moduledef ProtoHttpUtil ProtoHttpUtil
\Modulemember Proto
*/
//@{
/*** Include files ****************************************************************/
#include "DirtySDK/platform.h"
/*** Defines **********************************************************************/
//! max supported protocol scheme length
#define PROTOHTTPUTIL_SCHEME_MAX (32)
/*** Macros ***********************************************************************/
//! get class of response code
#define PROTOHTTP_GetResponseClass(_eError) (((_eError)/100) * 100)
/*** Type Definitions *************************************************************/
//! request types
typedef enum ProtoHttpRequestTypeE
{
PROTOHTTP_REQUESTTYPE_HEAD = 0, //!< HEAD request - does not return any data
PROTOHTTP_REQUESTTYPE_GET, //!< GET request - get data from a server
PROTOHTTP_REQUESTTYPE_POST, //!< POST request - post data to a server
PROTOHTTP_REQUESTTYPE_PUT, //!< PUT request - put data on a server
PROTOHTTP_REQUESTTYPE_DELETE, //!< DELETE request - delete resource from a server
PROTOHTTP_REQUESTTYPE_OPTIONS, //!< OPTIONS request - get server options for specified resource
PROTOHTTP_REQUESTTYPE_PATCH, //!< PATCH request - like PUT but updates the ressource instead of overwriting
PROTOHTTP_REQUESTTYPE_CONNECT, //!< CONNECT request - connect to a proxy that can tunnel (internal use only)
PROTOHTTP_NUMREQUESTTYPES
} ProtoHttpRequestTypeE;
/*! HTTP response codes - see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10
for more detailed information. These response codes may be retrieved from ProtoHttp
by calling ProtoHttpStatus('code'). Note that response codes are not available until
a response has been received from the server and parsed by ProtoHttp. If a response
code is not yet available, -1 will be returned. */
typedef enum ProtoHttpResponseE
{
PROTOHTTP_RESPONSE_PENDING = -1, //!< response has not yet been received
// 1xx - informational reponse
PROTOHTTP_RESPONSE_INFORMATIONAL = 100, //!< generic name for a 1xx class response
PROTOHTTP_RESPONSE_CONTINUE = 100, //!< continue with request, generally ignored
PROTOHTTP_RESPONSE_SWITCHPROTO, //!< 101 - OK response to client switch protocol request
// 2xx - success response
PROTOHTTP_RESPONSE_SUCCESSFUL = 200, //!< generic name for a 2xx class response
PROTOHTTP_RESPONSE_OK = 200, //!< client's request was successfully received, understood, and accepted
PROTOHTTP_RESPONSE_CREATED, //!< new resource has been created
PROTOHTTP_RESPONSE_ACCEPTED, //!< request accepted but not complete
PROTOHTTP_RESPONSE_NONAUTH, //!< non-authoritative info (ok)
PROTOHTTP_RESPONSE_NOCONTENT, //!< request fulfilled, no message body
PROTOHTTP_RESPONSE_RESETCONTENT, //!< request success, reset document view
PROTOHTTP_RESPONSE_PARTIALCONTENT, //!< server has fulfilled partial GET request
// 3xx - redirection response
PROTOHTTP_RESPONSE_REDIRECTION = 300, //!< generic name for a 3xx class response
PROTOHTTP_RESPONSE_MULTIPLECHOICES = 300, //!< requested resource corresponds to a set of representations
PROTOHTTP_RESPONSE_MOVEDPERMANENTLY, //!< requested resource has been moved permanently to new URI
PROTOHTTP_RESPONSE_FOUND, //!< requested resources has been moved temporarily to a new URI
PROTOHTTP_RESPONSE_SEEOTHER, //!< response can be found under a different URI
PROTOHTTP_RESPONSE_NOTMODIFIED, //!< response to conditional get when document has not changed
PROTOHTTP_RESPONSE_USEPROXY, //!< requested resource must be accessed through proxy
PROTOHTTP_RESPONSE_RESERVED, //!< old response code - reserved
PROTOHTTP_RESPONSE_TEMPREDIRECT, //!< requested resource resides temporarily under a different URI
// 4xx - client error response
PROTOHTTP_RESPONSE_CLIENTERROR = 400, //!< generic name for a 4xx class response
PROTOHTTP_RESPONSE_BADREQUEST = 400, //!< request could not be understood by server due to malformed syntax
PROTOHTTP_RESPONSE_UNAUTHORIZED, //!< request requires user authorization
PROTOHTTP_RESPONSE_PAYMENTREQUIRED, //!< reserved for future user
PROTOHTTP_RESPONSE_FORBIDDEN, //!< request understood, but server will not fulfill it
PROTOHTTP_RESPONSE_NOTFOUND, //!< Request-URI not found
PROTOHTTP_RESPONSE_METHODNOTALLOWED, //!< method specified in the Request-Line is not allowed
PROTOHTTP_RESPONSE_NOTACCEPTABLE, //!< resource incapable of generating content acceptable according to accept headers in request
PROTOHTTP_RESPONSE_PROXYAUTHREQ, //!< client must first authenticate with proxy
PROTOHTTP_RESPONSE_REQUESTTIMEOUT, //!< client did not produce response within server timeout
PROTOHTTP_RESPONSE_CONFLICT, //!< request could not be completed due to a conflict with current state of the resource
PROTOHTTP_RESPONSE_GONE, //!< requested resource is no longer available and no forwarding address is known
PROTOHTTP_RESPONSE_LENGTHREQUIRED, //!< a Content-Length header was not specified and is required
PROTOHTTP_RESPONSE_PRECONFAILED, //!< precondition given in request-header field(s) failed
PROTOHTTP_RESPONSE_REQENTITYTOOLARGE, //!< request entity is larger than the server is able or willing to process
PROTOHTTP_RESPONSE_REQURITOOLONG, //!< Request-URI is longer than the server is willing to interpret
PROTOHTTP_RESPONSE_UNSUPPORTEDMEDIA, //!< request entity is in unsupported format
PROTOHTTP_RESPONSE_REQUESTRANGE, //!< invalid range in Range request header
PROTOHTTP_RESPONSE_EXPECTATIONFAILED, //!< expectation in Expect request-header field could not be met by server
// 5xx - server error response
PROTOHTTP_RESPONSE_SERVERERROR = 500, //!< generic name for a 5xx class response
PROTOHTTP_RESPONSE_INTERNALSERVERERROR = 500, //!< an unexpected condition prevented the server from fulfilling the request
PROTOHTTP_RESPONSE_NOTIMPLEMENTED, //!< the server does not support the functionality required to fulfill the request
PROTOHTTP_RESPONSE_BADGATEWAY, //!< invalid response from gateway server
PROTOHTTP_RESPONSE_SERVICEUNAVAILABLE, //!< unable to handle request due to a temporary overloading or maintainance
PROTOHTTP_RESPONSE_GATEWAYTIMEOUT, //!< gateway or DNS server timeout
PROTOHTTP_RESPONSE_HTTPVERSUNSUPPORTED //!< the server does not support the HTTP protocol version that was used in the request
} ProtoHttpResponseE;
/*** Variables ********************************************************************/
/*** Functions ********************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
// parse HTTP request line from the format as sent on the wire
DIRTYCODE_API const char *ProtoHttpUtilParseRequest(const char *pStrHeader, char *pStrMethod, int32_t iMethodLen, char *pStrUri, int32_t iUriLen, char *pStrQuery, int32_t iQueryLen, ProtoHttpRequestTypeE *pRequestType, uint8_t *pHttp1_0);
// finds the header field value for the specified header field
DIRTYCODE_API const char *ProtoHttpFindHeaderValue(const char *pHdrBuf, const char *pHeaderText);
// extracts the header field value for the specified header field entry
DIRTYCODE_API int32_t ProtoHttpExtractHeaderValue(const char *pHdrField, char *pOutBuf, int32_t iOutLen, const char **ppHdrEnd);
// parse header response code from HTTP header
DIRTYCODE_API int32_t ProtoHttpParseHeaderCode(const char *pHdrBuf);
// extract a header value from the specified header text
DIRTYCODE_API int32_t ProtoHttpGetHeaderValue(void *pState, const char *pHdrBuf, const char *pName, char *pBuffer, int32_t iBufSize, const char **pHdrEnd);
// get next header name and value from header buffer
DIRTYCODE_API int32_t ProtoHttpGetNextHeader(void *pState, const char *pHdrBuf, char *pName, int32_t iNameSize, char *pValue, int32_t iValSize, const char **pHdrEnd);
// url-encode a integer parameter
DIRTYCODE_API int32_t ProtoHttpUrlEncodeIntParm(char *pBuffer, int32_t iLength, const char *pParm, int32_t iValue);
// url-encode a string parameter
DIRTYCODE_API int32_t ProtoHttpUrlEncodeStrParm(char *pBuffer, int32_t iLength, const char *pParm, const char *pData);
// url-encode a string parameter with custom safe table
DIRTYCODE_API int32_t ProtoHttpUrlEncodeStrParm2(char *pBuffer, int32_t iLength, const char *pParm, const char *pData, const char *pStrSafe);
// url-decode a string parameter
DIRTYCODE_API int32_t ProtoHttpUrlDecodeStrParm(const char *pBuffer, char *pData, int32_t iDataSize);
// parse a url into component parts
DIRTYCODE_API const char *ProtoHttpUrlParse(const char *pUrl, char *pKind, int32_t iKindSize, char *pHost, int32_t iHostSize, int32_t *pPort, int32_t *pSecure);
// parse a url into component parts
DIRTYCODE_API const char *ProtoHttpUrlParse2(const char *pUrl, char *pKind, int32_t iKindSize, char *pHost, int32_t iHostSize, int32_t *pPort, int32_t *pSecure, uint8_t *bPortSpecified);
// get next param name and value from URI buffer
DIRTYCODE_API int32_t ProtoHttpGetNextParam(void *pState, const char *pUriBuf, char *pName, int32_t iNameSize, char *pValue, int32_t iValSize, const char **pUriEnd);
#ifdef __cplusplus
}
#endif
//@}
#endif // _protohttp_h