315 lines
12 KiB
SourcePawn
315 lines
12 KiB
SourcePawn
#if defined _webcon_included
|
|
#endinput
|
|
#endif
|
|
#define _webcon_included
|
|
|
|
#define WEB_CLIENT_ADDRESS_LENGTH 46
|
|
|
|
//const char WebMethod_Connect[] = "CONNECT";
|
|
//const char WebMethod_Delete[] = "DELETE";
|
|
//const char WebMethod_Get[] = "GET";
|
|
//const char WebMethod_Head[] = "HEAD";
|
|
//const char WebMethod_Options[] = "OPTIONS";
|
|
//const char WebMethod_Post[] = "POST";
|
|
//const char WebMethod_Put[] = "PUT";
|
|
//const char WebMethod_Patch[] = "PATCH";
|
|
//const char WebMethod_Trace[] = "TRACE";
|
|
|
|
#define WebMethod_Connect "CONNECT"
|
|
#define WebMethod_Delete "DELETE"
|
|
#define WebMethod_Get "GET"
|
|
#define WebMethod_Head "HEAD"
|
|
#define WebMethod_Options "OPTIONS"
|
|
#define WebMethod_Post "POST"
|
|
#define WebMethod_Put "PUT"
|
|
#define WebMethod_Patch "PATCH"
|
|
#define WebMethod_Trace "TRACE"
|
|
|
|
enum WebStatus
|
|
{
|
|
WebStatus_Continue = 100,
|
|
WebStatus_SwitchingProtocols = 101,
|
|
WebStatus_Processing = 102,
|
|
|
|
WebStatus_OK = 200,
|
|
WebStatus_Created = 201,
|
|
WebStatus_Accepted = 202,
|
|
WebStatus_NonAuthoritativeInformation = 203,
|
|
WebStatus_NoContent = 204,
|
|
WebStatus_ResetContent = 205,
|
|
WebStatus_PartialContent = 206,
|
|
WebStatus_MultiStatus = 207,
|
|
|
|
WebStatus_MultipleChoices = 300,
|
|
WebStatus_MovedPermanently = 301,
|
|
WebStatus_Found = 302,
|
|
WebStatus_SeeOther = 303,
|
|
WebStatus_NotModified = 304,
|
|
WebStatus_UseProxy = 305,
|
|
WebStatus_SwitchProxy = 306,
|
|
WebStatus_TemporaryRedirect = 307,
|
|
|
|
WebStatus_BadRequest = 400,
|
|
WebStatus_Unauthorized = 401,
|
|
WebStatus_PaymentRequired = 402,
|
|
WebStatus_Forbidden = 403,
|
|
WebStatus_NotFound = 404,
|
|
WebStatus_MethodNotAllowed = 405,
|
|
WebStatus_NotAcceptable = 406,
|
|
WebStatus_ProxyAuthenticationRequired = 407,
|
|
WebStatus_RequestTimeout = 408,
|
|
WebStatus_Conflict = 409,
|
|
WebStatus_Gone = 410,
|
|
WebStatus_LengthRequired = 411,
|
|
WebStatus_PreconditionFailed = 412,
|
|
WebStatus_RequestEntityTooLarge = 413,
|
|
WebStatus_RequestUriTooLong = 414,
|
|
WebStatus_UnsupportedMediaType = 415,
|
|
WebStatus_RequestedRangeNotSatisfiable = 416,
|
|
WebStatus_ExpectationFailed = 417,
|
|
WebStatus_UnprocessableEntity = 422,
|
|
WebStatus_Locked = 423,
|
|
WebStatus_FailedDependency = 424,
|
|
WebStatus_UnorderedCollection = 425,
|
|
WebStatus_UpgradeRequired = 426,
|
|
WebStatus_NoResponse = 444,
|
|
WebStatus_RetryWith = 449,
|
|
WebStatus_BlockedByWindowsParentalControls = 450,
|
|
WebStatus_UnavailableForLegalReasons = 451,
|
|
|
|
WebStatus_InternalServerError = 500,
|
|
WebStatus_NotImplemented = 501,
|
|
WebStatus_BadGateway = 502,
|
|
WebStatus_ServiceUnavailable = 503,
|
|
WebStatus_GatewayTimeout = 504,
|
|
WebStatus_HttpVersionNotSupported = 505,
|
|
WebStatus_VariantAlsoNegotiates = 506,
|
|
WebStatus_InsufficientStorage = 507,
|
|
WebStatus_BandwidthLimitExceeded = 509,
|
|
WebStatus_NotExtended = 510,
|
|
}
|
|
|
|
#define WebHeader_Accept "Accept"
|
|
#define WebHeader_AcceptCharset "Accept-Charset"
|
|
#define WebHeader_AcceptEncoding "Accept-Encoding"
|
|
#define WebHeader_AcceptLanguage "Accept-Language"
|
|
#define WebHeader_AcceptRanges "Accept-Ranges"
|
|
#define WebHeader_Age "Age"
|
|
#define WebHeader_Allow "Allow"
|
|
#define WebHeader_Authorization "Authorization"
|
|
#define WebHeader_CacheControl "Cache-Control"
|
|
#define WebHeader_Connection "Connection"
|
|
#define WebHeader_ContentEncoding "Content-Encoding"
|
|
#define WebHeader_ContentLanguage "Content-Language"
|
|
#define WebHeader_ContentLength "Content-Length"
|
|
#define WebHeader_ContentLocation "Content-Location"
|
|
#define WebHeader_ContentMD5 "Content-MD5"
|
|
#define WebHeader_ContentRange "Content-Range"
|
|
#define WebHeader_ContentType "Content-Type"
|
|
#define WebHeader_Cookie "Cookie"
|
|
#define WebHeader_Date "Date"
|
|
#define WebHeader_ETag "ETag"
|
|
#define WebHeader_Expect "Expect"
|
|
#define WebHeader_Expires "Expires"
|
|
#define WebHeader_From "From"
|
|
#define WebHeader_Host "Host"
|
|
#define WebHeader_IfMatch "If-Match"
|
|
#define WebHeader_IfModifiedSince "If-Modified-Since"
|
|
#define WebHeader_IfNoneMatch "If-None-Match"
|
|
#define WebHeader_IfRange "If-Range"
|
|
#define WebHeader_IfUnmodifiedSince "If-Unmodified-Since"
|
|
#define WebHeader_LastModified "Last-Modified"
|
|
#define WebHeader_Location "Location"
|
|
#define WebHeader_MaxForwards "Max-Forwards"
|
|
#define WebHeader_Pragma "Pragma"
|
|
#define WebHeader_ProxyAuthenticate "Proxy-Authenticate"
|
|
#define WebHeader_ProxyAuthorization "Proxy-Authorization"
|
|
#define WebHeader_Range "Range"
|
|
#define WebHeader_Referer "Referer"
|
|
#define WebHeader_RetryAfter "Retry-After"
|
|
#define WebHeader_Server "Server"
|
|
#define WebHeader_SetCookie "Set-Cookie"
|
|
#define WebHeader_SetCookie2 "Set-Cookie2"
|
|
#define WebHeader_TE "TE"
|
|
#define WebHeader_Trailer "Trailer"
|
|
#define WebHeader_TransferEncoding "Transfer-Encoding"
|
|
#define WebHeader_Upgrade "Upgrade"
|
|
#define WebHeader_UserAgent "User-Agent"
|
|
#define WebHeader_Vary "Vary"
|
|
#define WebHeader_Via "Via"
|
|
#define WebHeader_Warning "Warning"
|
|
#define WebHeader_WWWAuthenticate "WWW-Authenticate"
|
|
#define WebHeader_AccessControlAllowOrigin "Access-Control-Allow-Origin"
|
|
|
|
enum WebRequestDataType
|
|
{
|
|
WebRequestDataType_Get,
|
|
WebRequestDataType_Post,
|
|
WebRequestDataType_Cookie,
|
|
WebRequestDataType_Header,
|
|
}
|
|
|
|
methodmap WebResponse < Handle
|
|
{
|
|
/// Add a HTTP header to a response.
|
|
///
|
|
/// Multiple instances of the same header can be added to a response with different values.
|
|
/// This is only valid if the header is specified as a list, but the restriction is not enforced.
|
|
///
|
|
/// @param header Name of HTTP header to add. `WebHeader_*` constants exist for standard headers.
|
|
/// @param content Value to send in response for this header.
|
|
/// @return `true` if the header was sucessfully added, `false` otherwise.
|
|
public native bool AddHeader(const char[] header, const char[] content);
|
|
|
|
/// Remove an added HTTP header from a response.
|
|
///
|
|
/// @param header Name of HTTP header to remove. `WebHeader_*` constants exist for standard headers.
|
|
/// @param content If specified, only remove a header matching this value.
|
|
/// @return `true` if any headers were removed, `false` otherwise.
|
|
public native bool RemoveHeader(const char[] header, const char[] content = NULL_STRING);
|
|
};
|
|
|
|
methodmap WebStringResponse < WebResponse
|
|
{
|
|
/// Create a WebResponse from a character string.
|
|
///
|
|
/// The response length is determined automatically and thus is not binary-safe.
|
|
/// Use `WebBinaryResponse` for binary data.
|
|
///
|
|
/// @param content Content to use for response.
|
|
/// @return A new WebResponse instance with the specified content as the body.
|
|
public native WebStringResponse(const char[] content);
|
|
};
|
|
|
|
methodmap WebBinaryResponse < WebResponse
|
|
{
|
|
/// Create a WebResponse from binary data.
|
|
///
|
|
/// @param content Content to use for response.
|
|
/// @param length Length of content.
|
|
/// @return A new WebResponse instance with the specified content as the body.
|
|
public native WebBinaryResponse(const char[] content, int length);
|
|
};
|
|
|
|
methodmap WebFileResponse < WebResponse
|
|
{
|
|
/// Create a WebResponse from a file path.
|
|
///
|
|
/// This uses efficient kernel data transfer mechanisms where available, and avoids
|
|
/// reading the entire file into memory at once (or when not being sent to a client).
|
|
///
|
|
/// @param path Path to response file. Should be constructed using `BuildPath`.
|
|
/// @return A new WebResponse instance with the specified file content as the body.
|
|
/// @error Unable to open file path for reading.
|
|
public native WebFileResponse(const char[] path);
|
|
};
|
|
|
|
typeset WebBodyDataReceived
|
|
{
|
|
/// Callback for request body.
|
|
///
|
|
/// @param connection WebConnection handle for the request. Must not be deleted.
|
|
/// @param data Raw request body data OR "" if `data_in_cb` = false.
|
|
/// @param length Size of `data`.
|
|
/// @param data1 Optional user data 1.
|
|
/// @param data2 Optional user data 2.
|
|
/// @return `true` if the request was handled, `false` will terminate the connection.
|
|
function bool(WebConnection connection, char[] data, int length);
|
|
function bool(WebConnection connection, char[] data, int length, any data1);
|
|
function bool(WebConnection connection, char[] data, int length, any data1, any data2);
|
|
};
|
|
|
|
methodmap WebConnection < Handle
|
|
{
|
|
/// Get the remote client IP address.
|
|
///
|
|
/// @param buffer Buffer to store the address in. Should be `WEB_CLIENT_ADDRESS_LENGTH` bytes in size.
|
|
/// @param length Size of `buffer`.
|
|
/// @return `true` if the client address was stored in `buffer`, `false` otherwise.
|
|
public native bool GetClientAddress(char[] buffer, int length);
|
|
|
|
/// Get the length of the string that would be returned by GetRequestData().
|
|
///
|
|
/// @param key Paramater (GET or POST), Cookie, or Header to get data from.
|
|
/// @return int the size in bytes.
|
|
/// @error ParseRequestBody was not called for POST data.
|
|
public native int GetRequestDataLength(WebRequestDataType type, const char[] key);
|
|
|
|
/// Get data sent by the client in the request.
|
|
/// Retrieving data from the body (aka. POST) will only work after ParseRequestBody() has been run.
|
|
///
|
|
/// @param type Source of data. See `WebRequestDataType` for details.
|
|
/// @param key Paramater (GET or POST), Cookie, or Header to get data from.
|
|
/// @param buffer Buffer to store the data value in.
|
|
/// @param length Size of `buffer`.
|
|
/// @return `true` if the data exists in the request and was stored in `buffer`, `false` otherwise.
|
|
/// @error ParseRequestBody was not called for POST data.
|
|
public native bool GetRequestData(WebRequestDataType type, const char[] key, char[] buffer, int length);
|
|
|
|
/// Load full request body into memory and call `callback` when done.
|
|
///
|
|
/// @param callback WebBodyDataReceived callback that will be called when request body has been loaded.
|
|
/// @param data1 Optional user data 1.
|
|
/// @param data2 Optional user data 2.
|
|
/// @param data_in_cb Pass body through callback if true.
|
|
/// @return `true` on success
|
|
/// @error Function called more than once.
|
|
public native bool ReadRequestBody(WebBodyDataReceived callback, any data1 = 0, any data2 = 0, bool data_in_cb = true);
|
|
|
|
/// Get request body, or part of, into buffer.
|
|
///
|
|
/// @param start Start index in request body.
|
|
/// @param buffer Target buffer.
|
|
/// @param length Target buffer size.
|
|
/// @return `true` on success
|
|
/// @error Start exceeds data size.
|
|
public native bool GetRequestBody(int start, char[] buffer, int length);
|
|
|
|
/// Detect endcoding of request body and parse into hashtable for use with GetRequestData.
|
|
/// Supports: "application/x-www-form-urlencoded", "multipart/form-data"
|
|
///
|
|
/// @return `true` on success
|
|
/// @error ReadRequestBody() not called first. Function called twice.
|
|
public native bool ParseRequestBody();
|
|
|
|
/// Queue a response to send to the client.
|
|
///
|
|
/// @param status HTTP status code to use for response. See `WebStatus`.
|
|
/// @param response WebResonse to queue. You are responsible for deleting the response.
|
|
/// @return `true` if the response was successfully queued, `false` otherwise.
|
|
/// @error Invalid response handle.
|
|
public native bool QueueResponse(WebStatus status, WebResponse response);
|
|
};
|
|
|
|
/// Callback for incoming requests.
|
|
///
|
|
/// @param connection WebConnection handle for the request. Must not be deleted.
|
|
/// @param method HTTP method used for request. `WebMethod_*` constants exist for standard methods.
|
|
/// @param url URL requested by client.
|
|
/// @return `true` if the request was handled, `false` will terminate the connection.
|
|
typedef WebRequestHandler = function bool (WebConnection connection, const char[] method, const char[] url);
|
|
|
|
/// Register a request handler.
|
|
///
|
|
/// @param id Unique identifier for request handler. Used for virtual hosting.
|
|
/// @param handler WebRequestHandler callback for incoming requests.
|
|
/// @param name Optional name for handler on index page.
|
|
/// @param description Optional description for handler on index page.
|
|
/// @return `true` if the handler was sucessfully registered, `false` otherwise.
|
|
native bool Web_RegisterRequestHandler(const char[] id, WebRequestHandler handler, const char[] name = "", const char[] description = "");
|
|
|
|
public Extension __ext_Webcon =
|
|
{
|
|
name = "Webcon",
|
|
file = "webcon.ext",
|
|
#if defined AUTOLOAD_EXTENSIONS
|
|
autoload = 1,
|
|
#else
|
|
autoload = 0,
|
|
#endif
|
|
#if defined REQUIRE_EXTENSIONS
|
|
required = 1,
|
|
#else
|
|
required = 0,
|
|
#endif
|
|
} |