|
@@ -1,4202 +0,0 @@
|
|
-/*
|
|
|
|
- goahead.h -- GoAhead Web Server Header
|
|
|
|
-
|
|
|
|
- Copyright (c) All Rights Reserved. See details at the end of the file.
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-#ifndef _h_GOAHEAD
|
|
|
|
-#define _h_GOAHEAD 1
|
|
|
|
-
|
|
|
|
-/************************************ Overrides *******************************/
|
|
|
|
-/*
|
|
|
|
- Override osdep defaults
|
|
|
|
- */
|
|
|
|
-#define ME_MAX_IP 64 /**< Maximum IP address size */
|
|
|
|
-
|
|
|
|
-/************************************ Includes ********************************/
|
|
|
|
-
|
|
|
|
-#include "me.h"
|
|
|
|
-#include "osdep.h"
|
|
|
|
-#include "libipmi_struct.h"
|
|
|
|
-
|
|
|
|
-/************************************ Defaults ********************************/
|
|
|
|
-
|
|
|
|
-#ifdef __cplusplus
|
|
|
|
-extern "C" {
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/**************** jimbo modify ****************/
|
|
|
|
-#define IPv4_ADDR0 192
|
|
|
|
-#define IPv4_ADDR1 168
|
|
|
|
-#define IPv4_ADDR2 0
|
|
|
|
-#define IPv4_ADDR3 203
|
|
|
|
-#define ME_COMPILER_HAS_SINGLE_STACK 1
|
|
|
|
-/*************** jimbo end *******************/
|
|
|
|
-
|
|
|
|
-#if (ME_COM_MBEDTLS + ME_COM_MATRIXSSL + ME_COM_NANOSSL + ME_COM_OPENSSL) > 1
|
|
|
|
- #error "Cannot have more than one SSL provider configured"
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#ifndef ME_GOAHEAD_LOGGING
|
|
|
|
- #define ME_GOAHEAD_LOGGING 1 /**< Default for logging is "on" */
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_TRACING
|
|
|
|
- #define ME_GOAHEAD_TRACING 1 /**< Default for tracing "on" */
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_DEBUG
|
|
|
|
- #if ME_DEBUG
|
|
|
|
- #define ME_GOAHEAD_DEBUG 1 /**< Debug logging on in debug builds by default */
|
|
|
|
- #else
|
|
|
|
- #define ME_GOAHEAD_DEBUG 0
|
|
|
|
- #endif
|
|
|
|
-#endif
|
|
|
|
-#if ECOS
|
|
|
|
- #if ME_GOAHEAD_CGI
|
|
|
|
- #error "Ecos does not support CGI. Disable ME_GOAHEAD_CGI"
|
|
|
|
- #endif
|
|
|
|
-#endif /* ECOS */
|
|
|
|
-
|
|
|
|
-#if QNX
|
|
|
|
- typedef long fd_mask;
|
|
|
|
- #define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#if MACOSX
|
|
|
|
- typedef int32_t fd_mask;
|
|
|
|
-#endif
|
|
|
|
-#if WINDOWS
|
|
|
|
- typedef fd_set fd_mask;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#if !LINUX
|
|
|
|
- PUBLIC char *basename(char *name);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#if VXWORKS
|
|
|
|
- PUBLIC int vxchdir(char *dirname);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#if DOXYGEN
|
|
|
|
- typedef int Socket;
|
|
|
|
- typedef int Socklen;
|
|
|
|
- typedef int64 Offset;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- File status structure
|
|
|
|
- */
|
|
|
|
-typedef struct stat WebsStat;
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Copyright. The software license requires that this not be modified or removed.
|
|
|
|
- */
|
|
|
|
-#define EMBEDTHIS_GOAHEAD_COPYRIGHT \
|
|
|
|
- "Copyright (c) Embedthis Software Inc., 1993-2014. All Rights Reserved." \
|
|
|
|
- "Copyright (c) GoAhead Software Inc., 2003. All Rights Reserved."
|
|
|
|
-
|
|
|
|
-/************************************* Main ***********************************/
|
|
|
|
-
|
|
|
|
-#define ME_MAX_ARGC 32
|
|
|
|
-#if VXWORKS
|
|
|
|
- #define MAIN(name, _argc, _argv, _envp) \
|
|
|
|
- static int innerMain(int argc, char **argv, char **envp); \
|
|
|
|
- int name(char *arg0, ...) { \
|
|
|
|
- va_list args; \
|
|
|
|
- char *argp, *largv[ME_MAX_ARGC]; \
|
|
|
|
- int largc = 0; \
|
|
|
|
- va_start(args, arg0); \
|
|
|
|
- largv[largc++] = #name; \
|
|
|
|
- if (arg0) { \
|
|
|
|
- largv[largc++] = arg0; \
|
|
|
|
- } \
|
|
|
|
- for (argp = va_arg(args, char*); argp && largc < ME_MAX_ARGC; argp = va_arg(args, char*)) { \
|
|
|
|
- largv[largc++] = argp; \
|
|
|
|
- } \
|
|
|
|
- return innerMain(largc, largv, NULL); \
|
|
|
|
- } \
|
|
|
|
- static int innerMain(_argc, _argv, _envp)
|
|
|
|
-#elif ME_WIN_LIKE
|
|
|
|
- #define MAIN(name, _argc, _argv, _envp) \
|
|
|
|
- APIENTRY WinMain(HINSTANCE inst, HINSTANCE junk, char *command, int junk2) { \
|
|
|
|
- extern int main(); \
|
|
|
|
- char *largv[ME_MAX_ARGC]; \
|
|
|
|
- int largc; \
|
|
|
|
- largc = websParseArgs(command, &largv[1], ME_MAX_ARGC - 1); \
|
|
|
|
- largv[0] = #name; \
|
|
|
|
- main(largc, largv, NULL); \
|
|
|
|
- } \
|
|
|
|
- int main(_argc, _argv, _envp)
|
|
|
|
-#else
|
|
|
|
- #define MAIN(name, _argc, _argv, _envp) int main(_argc, _argv, _envp)
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-PUBLIC int websParseArgs(char *args, char **argv, int maxArgc);
|
|
|
|
-
|
|
|
|
-#if WINDOWS
|
|
|
|
- PUBLIC void websSetInst(HINSTANCE inst);
|
|
|
|
- PUBLIC HINSTANCE websGetInst();
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/************************************ Tunables ********************************/
|
|
|
|
-
|
|
|
|
-#define WEBS_MAX_LISTEN 8 /**< Maximum number of listen endpoints */
|
|
|
|
-#define WEBS_SMALL_HASH 31 /**< General small hash size */
|
|
|
|
-#define WEBS_MAX_PASSWORD 32 /**< Default maximum password */
|
|
|
|
-
|
|
|
|
-/************************************* Error **********************************/
|
|
|
|
-#if ME_GOAHEAD_LOGGING
|
|
|
|
-
|
|
|
|
-#define WEBS_L __FILE__, __LINE__
|
|
|
|
-#define WEBS_ARGS_DEC char *file, int line
|
|
|
|
-#define WEBS_ARGS file, line
|
|
|
|
-
|
|
|
|
-PUBLIC_DATA int logLevel;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Standard logging trace levels are 0 to 9 with 0 being the most verbose. These are ored with the error source
|
|
|
|
- and type flags. The WEBS_LOG_MASK is used to extract the trace level from a flags word. We expect most apps
|
|
|
|
- to run with level 2 trace enabled.
|
|
|
|
-*/
|
|
|
|
-#define WEBS_ERROR 1 /**< Hard error trace level */
|
|
|
|
-#define WEBS_WARN 2 /**< Soft warning trace level */
|
|
|
|
-#define WEBS_CONFIG 2 /**< Configuration settings trace level. */
|
|
|
|
-#define WEBS_VERBOSE 9 /**< Highest level of trace */
|
|
|
|
-#define WEBS_LEVEL_MASK 0xF /**< Level mask */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Log message flags
|
|
|
|
- */
|
|
|
|
-#define WEBS_ASSERT_MSG 0x10 /**< Originated from assert */
|
|
|
|
-#define WEBS_ERROR_MSG 0x20 /**< Originated from error */
|
|
|
|
-#define WEBS_LOG_MSG 0x100 /**< Originated from logmsg */
|
|
|
|
-#define WEBS_RAW_MSG 0x200 /**< Raw message output */
|
|
|
|
-#define WEBS_TRACE_MSG 0x400 /**< Originated from trace */
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-#if ME_GOAHEAD_TRACING && ME_GOAHEAD_LOGGING
|
|
|
|
- #if ME_COMPILER_HAS_MACRO_VARARGS
|
|
|
|
- #define trace(l, ...) if (((l) & WEBS_LEVEL_MASK) <= websGetLogLevel()) { traceProc(l, __VA_ARGS__); } else {}
|
|
|
|
- #else
|
|
|
|
- inline void trace(int level, cchar *fmt, ...) {
|
|
|
|
- WebsLogHandler logHandler = logGetHandler();
|
|
|
|
- if ((level & WEBS_LEVEL_MASK) <= logLevel && logHandler) {
|
|
|
|
- va_list args; va_start(args, fmt);
|
|
|
|
- char *message = sfmtv((char*) fmt, args);
|
|
|
|
- logHandler(level | WEBS_TRACE_MSG, message);
|
|
|
|
- wfree(message);
|
|
|
|
- va_end(args);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- #endif
|
|
|
|
-#else
|
|
|
|
- #define trace(l, ...) if (1) ; else {}
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#if ME_GOAHEAD_LOGGING
|
|
|
|
- #if ME_COMPILER_HAS_MACRO_VARARGS
|
|
|
|
- #define logmsg(l, ...) if ((l) <= logLevel) { logmsgProc(l, __VA_ARGS__); } else {}
|
|
|
|
- #else
|
|
|
|
- inline void logmsg(int level, cchar *fmt, ...) {
|
|
|
|
- WebsLogHandler logHandler = logGetHandler();
|
|
|
|
- if ((level & WEBS_LEVEL_MASK) <= logLevel && logHandler) {
|
|
|
|
- va_list args; va_start(args, fmt);
|
|
|
|
- char *message = sfmtv((char*) fmt, args);
|
|
|
|
- logHandler(level | WEBS_TRACE_MSG, message);
|
|
|
|
- wfree(message);
|
|
|
|
- va_end(args);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- #endif
|
|
|
|
-#else
|
|
|
|
- #define logmsg(l, ...) if (1) ; else {}
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-#if DOXYGEN
|
|
|
|
-#undef assert
|
|
|
|
-/**
|
|
|
|
- Assure that an assert condition is true
|
|
|
|
- @param cond Boolean result of a conditional test
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-extern void assert(bool cond);
|
|
|
|
-#elif ME_GOAHEAD_DEBUG
|
|
|
|
- #define assert(C) if (C) ; else assertError(WEBS_L, "%s", #C)
|
|
|
|
- PUBLIC void assertError(WEBS_ARGS_DEC, char *fmt, ...);
|
|
|
|
-#else
|
|
|
|
- #define assert(C) if (1) ; else {}
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Callback for emitting trace log output
|
|
|
|
- @param level Integer between 0 and 9. Zero is the lowest trace level used for the most important messages.
|
|
|
|
- @param msg Message to log
|
|
|
|
- @return Zero if successful
|
|
|
|
- @internal
|
|
|
|
- */
|
|
|
|
-typedef void (*WebsLogHandler)(int level, cchar *msg);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Emit an error message
|
|
|
|
- @return Zero if successful
|
|
|
|
- @stability Stable
|
|
|
|
-*/
|
|
|
|
-PUBLIC void error(cchar *fmt, ...);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the log logging module
|
|
|
|
- @return Zero if successful
|
|
|
|
- @internal
|
|
|
|
- */
|
|
|
|
-PUBLIC int logOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close the log logging module
|
|
|
|
- @internal
|
|
|
|
- */
|
|
|
|
-PUBLIC void logClose(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the log callback
|
|
|
|
- @return handler Callback handler function of type WebsLogHandler
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsLogHandler logGetHandler(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set a log callback
|
|
|
|
- @param handler Callback handler function of type WebsLogHandler
|
|
|
|
- @return The previous callback function
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsLogHandler logSetHandler(WebsLogHandler handler);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the current trace log level
|
|
|
|
- @return Number between 0 and 9
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websGetLogLevel(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set the current trace log level
|
|
|
|
- @return Number between 0 and 9
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Prototype
|
|
|
|
- */
|
|
|
|
-void websSetLogLevel(int level);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set the filename to save logging output
|
|
|
|
- @param path Filename path to use
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void logSetPath(cchar *path);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Emit a message to the log
|
|
|
|
- @description This emits a message at the specified level. GoAhead filters logging messages by defining a verbosity
|
|
|
|
- level at startup. Level 0 is the least verbose where only the most important messages will be output. Level 9 is the
|
|
|
|
- Logging support is enabled by the MakeMe setting: "logging: true" which creates the ME_GOAHEAD_LOGGING define in me.h
|
|
|
|
- most verbose. Level 2-4 are the most useful for debugging.
|
|
|
|
- @param level Integer verbosity level (0-9).
|
|
|
|
- @param fmt Printf style format string
|
|
|
|
- @param ... Arguments for the format string
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void logmsgProc(int level, cchar *fmt, ...);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Emit a debug trace message to the log
|
|
|
|
- @description This emits a message at the specified level. GoAhead filters logging messages by defining a verbosity
|
|
|
|
- level at startup. Level 0 is the least verbose where only the most important messages will be output. Level 9 is the
|
|
|
|
- most verbose. Level 2-4 are the most useful for debugging.
|
|
|
|
- Debug trace support is enabled by the MakeMe setting: "tracing: true" which creates the ME_GOAHEAD_TRACING define in
|
|
|
|
- me.h.
|
|
|
|
- @param level Integer verbosity level (0-9).
|
|
|
|
- @param fmt Printf style format string
|
|
|
|
- @param ... Arguments for the format string
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void traceProc(int level, cchar *fmt, ...);
|
|
|
|
-
|
|
|
|
-#else /*! ME_GOAHEAD_LOGGING */
|
|
|
|
- #define assert(C) if (1) ; else {}
|
|
|
|
- #define error(l, ...) if (1) ; else {}
|
|
|
|
- #define trace(l, ...) if (1) ; else {}
|
|
|
|
- #define logOpen() if (1) ; else {}
|
|
|
|
- #define logClose() if (1) ; else {}
|
|
|
|
- #define websGetLogLevel() 0
|
|
|
|
- #define logmsg(l, ...) if (1) ; else {}
|
|
|
|
- #define logSetPath(p) if (1) ; else {}
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/*********************************** HTTP Codes *******************************/
|
|
|
|
-/*
|
|
|
|
- Standard HTTP/1.1 status codes
|
|
|
|
- */
|
|
|
|
-#define HTTP_CODE_CONTINUE 100 /**< Continue with request, only partial content transmitted */
|
|
|
|
-#define HTTP_CODE_OK 200 /**< The request completed successfully */
|
|
|
|
-#define HTTP_CODE_CREATED 201 /**< The request has completed and a new resource was created */
|
|
|
|
-#define HTTP_CODE_ACCEPTED 202 /**< The request has been accepted and processing is continuing */
|
|
|
|
-#define HTTP_CODE_NOT_AUTHORITATIVE 203 /**< The request has completed but content may be from another source */
|
|
|
|
-#define HTTP_CODE_NO_CONTENT 204 /**< The request has completed and there is no response to send */
|
|
|
|
-#define HTTP_CODE_RESET 205 /**< The request has completed with no content. Client must reset view */
|
|
|
|
-#define HTTP_CODE_PARTIAL 206 /**< The request has completed and is returning partial content */
|
|
|
|
-#define HTTP_CODE_MOVED_PERMANENTLY 301 /**< The requested URI has moved permanently to a new location */
|
|
|
|
-#define HTTP_CODE_MOVED_TEMPORARILY 302 /**< The URI has moved temporarily to a new location */
|
|
|
|
-#define HTTP_CODE_SEE_OTHER 303 /**< The requested URI can be found at another URI location */
|
|
|
|
-#define HTTP_CODE_NOT_MODIFIED 304 /**< The requested resource has changed since the last request */
|
|
|
|
-#define HTTP_CODE_USE_PROXY 305 /**< The requested resource must be accessed via the location proxy */
|
|
|
|
-#define HTTP_CODE_TEMPORARY_REDIRECT 307 /**< The request should be repeated at another URI location */
|
|
|
|
-#define HTTP_CODE_BAD_REQUEST 400 /**< The request is malformed */
|
|
|
|
-#define HTTP_CODE_UNAUTHORIZED 401 /**< Authentication for the request has failed */
|
|
|
|
-#define HTTP_CODE_PAYMENT_REQUIRED 402 /**< Reserved for future use */
|
|
|
|
-#define HTTP_CODE_FORBIDDEN 403 /**< The request was legal, but the server refuses to process */
|
|
|
|
-#define HTTP_CODE_NOT_FOUND 404 /**< The requested resource was not found */
|
|
|
|
-#define HTTP_CODE_BAD_METHOD 405 /**< The request HTTP method was not supported by the resource */
|
|
|
|
-#define HTTP_CODE_NOT_ACCEPTABLE 406 /**< The requested resource cannot generate the required content */
|
|
|
|
-#define HTTP_CODE_REQUEST_TIMEOUT 408 /**< The server timed out waiting for the request to complete */
|
|
|
|
-#define HTTP_CODE_CONFLICT 409 /**< The request had a conflict in the request headers and URI */
|
|
|
|
-#define HTTP_CODE_GONE 410 /**< The requested resource is no longer available*/
|
|
|
|
-#define HTTP_CODE_LENGTH_REQUIRED 411 /**< The request did not specify a required content length*/
|
|
|
|
-#define HTTP_CODE_PRECOND_FAILED 412 /**< The server cannot satisfy one of the request preconditions */
|
|
|
|
-#define HTTP_CODE_REQUEST_TOO_LARGE 413 /**< The request is too large for the server to process */
|
|
|
|
-#define HTTP_CODE_REQUEST_URL_TOO_LARGE 414 /**< The request URI is too long for the server to process */
|
|
|
|
-#define HTTP_CODE_UNSUPPORTED_MEDIA_TYPE 415 /**< The request media type is not supported by the server or resource */
|
|
|
|
-#define HTTP_CODE_RANGE_NOT_SATISFIABLE 416 /**< The request content range does not exist for the resource */
|
|
|
|
-#define HTTP_CODE_EXPECTATION_FAILED 417 /**< The server cannot satisfy the Expect header requirements */
|
|
|
|
-#define HTTP_CODE_NO_RESPONSE 444 /**< The connection was closed with no response to the client */
|
|
|
|
-#define HTTP_CODE_INTERNAL_SERVER_ERROR 500 /**< Server processing or configuration error. No response generated */
|
|
|
|
-#define HTTP_CODE_NOT_IMPLEMENTED 501 /**< The server does not recognize the request or method */
|
|
|
|
-#define HTTP_CODE_BAD_GATEWAY 502 /**< The server cannot act as a gateway for the given request */
|
|
|
|
-#define HTTP_CODE_SERVICE_UNAVAILABLE 503 /**< The server is currently unavailable or overloaded */
|
|
|
|
-#define HTTP_CODE_GATEWAY_TIMEOUT 504 /**< The server gateway timed out waiting for the upstream server */
|
|
|
|
-#define HTTP_CODE_BAD_VERSION 505 /**< The server does not support the HTTP protocol version */
|
|
|
|
-#define HTTP_CODE_INSUFFICIENT_STORAGE 507 /**< The server has insufficient storage to complete the request */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Proprietary HTTP status codes
|
|
|
|
- */
|
|
|
|
-#define HTTP_CODE_START_LOCAL_ERRORS 550
|
|
|
|
-#define HTTP_CODE_COMMS_ERROR 550 /**< The server had a communications error responding to the client */
|
|
|
|
-
|
|
|
|
-/************************************* WebsValue ******************************/
|
|
|
|
-
|
|
|
|
-#ifdef WITH_QT
|
|
|
|
-/*
|
|
|
|
- QT creates a global "hex" -- Ugh!
|
|
|
|
- */
|
|
|
|
-#define hex hexvalue
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Value types.
|
|
|
|
- */
|
|
|
|
-typedef enum WebsType {
|
|
|
|
- undefined = 0,
|
|
|
|
- byteint = 1,
|
|
|
|
- shortint = 2,
|
|
|
|
- integer = 3,
|
|
|
|
- hex = 4,
|
|
|
|
- percent = 5,
|
|
|
|
- octal = 6,
|
|
|
|
- big = 7,
|
|
|
|
- flag = 8,
|
|
|
|
- floating = 9,
|
|
|
|
- string = 10,
|
|
|
|
- bytes = 11,
|
|
|
|
- symbol = 12,
|
|
|
|
- errmsg = 13
|
|
|
|
-} WebsType;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- System native time type. This is the time in seconds.
|
|
|
|
- This may be 32 or 64 bits and may be signed or unsigned on some systems.
|
|
|
|
- */
|
|
|
|
-typedef time_t WebsTime;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Value union to store primitive value types
|
|
|
|
- */
|
|
|
|
-typedef struct WebsValue {
|
|
|
|
- union {
|
|
|
|
- char flag;
|
|
|
|
- char byteint;
|
|
|
|
- short shortint;
|
|
|
|
- char percent;
|
|
|
|
- long integer;
|
|
|
|
- long hex;
|
|
|
|
- long octal;
|
|
|
|
- long big[2];
|
|
|
|
-#if ME_FLOAT
|
|
|
|
- double floating;
|
|
|
|
-#endif
|
|
|
|
- char *string;
|
|
|
|
- char *bytes;
|
|
|
|
- char *errmsg;
|
|
|
|
- void *symbol;
|
|
|
|
- } value;
|
|
|
|
- WebsType type;
|
|
|
|
- uint valid : 8;
|
|
|
|
- uint allocated : 8; /* String was allocated */
|
|
|
|
-} WebsValue;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- The value is a numeric type
|
|
|
|
- */
|
|
|
|
-#define value_numeric(t) (t >= byteint && t <= big)
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- The value is a string type
|
|
|
|
- */
|
|
|
|
-#define value_str(t) (t >= string && t <= bytes)
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- The value is valid supported type
|
|
|
|
- */
|
|
|
|
-#define value_ok(t) (t > undefined && t <= symbol)
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Allocate strings using malloc
|
|
|
|
- */
|
|
|
|
-#define VALUE_ALLOCATE 0x1
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Create an integer value
|
|
|
|
- @param value Integer long value
|
|
|
|
- @return Value object containing the integer
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsValue valueInteger(long value);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Create an string value
|
|
|
|
- @param value String long value
|
|
|
|
- @param flags Set to VALUE_ALLOCATE to store a copy of the string reference
|
|
|
|
- @return Value object containing the string
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsValue valueString(cchar *value, int flags);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Create an symbol value containing an object reference
|
|
|
|
- @param value Value reference
|
|
|
|
- @return Value object containing the symbol reference
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsValue valueSymbol(void *value);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Free any allocated string in a value
|
|
|
|
- @param value Value object
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void valueFree(WebsValue *value);
|
|
|
|
-
|
|
|
|
-/************************************* Ringq **********************************/
|
|
|
|
-/**
|
|
|
|
- A WebsBuf (ring queue) allows maximum utilization of memory for data storage and is
|
|
|
|
- ideal for input/output buffering. This module provides a highly efficient
|
|
|
|
- implementation and a vehicle for dynamic strings.
|
|
|
|
- \n\n
|
|
|
|
- WARNING: This is a public implementation and callers have full access to
|
|
|
|
- the queue structure and pointers. Change this module very carefully.
|
|
|
|
- \n\n
|
|
|
|
- This module follows the open/close model.
|
|
|
|
- \n\n
|
|
|
|
- Operation of a WebsBuf where bp is a pointer to a WebsBuf :
|
|
|
|
-
|
|
|
|
- bp->buflen contains the size of the buffer.
|
|
|
|
- bp->buf will point to the start of the buffer.
|
|
|
|
- bp->servp will point to the first (un-consumed) data byte.
|
|
|
|
- bp->endp will point to the next free location to which new data is added
|
|
|
|
- bp->endbuf will point to one past the end of the buffer.
|
|
|
|
- \n\n
|
|
|
|
- Eg. If the WebsBuf contains the data "abcdef", it might look like :
|
|
|
|
- \n\n
|
|
|
|
- +-------------------------------------------------------------------+
|
|
|
|
- | | | | | | | | a | b | c | d | e | f | | | | |
|
|
|
|
- +-------------------------------------------------------------------+
|
|
|
|
- ^ ^ ^ ^
|
|
|
|
- | | | |
|
|
|
|
- bp->buf bp->servp bp->endp bp->enduf
|
|
|
|
- \n\n
|
|
|
|
- The queue is empty when servp == endp. This means that the queue will hold
|
|
|
|
- at most bp->buflen -1 bytes. It is the fillers responsibility to ensure
|
|
|
|
- the WebsBuf is never filled such that servp == endp.
|
|
|
|
- \n\n
|
|
|
|
- It is the fillers responsibility to "wrap" the endp back to point to
|
|
|
|
- bp->buf when the pointer steps past the end. Correspondingly it is the
|
|
|
|
- consumers responsibility to "wrap" the servp when it steps to bp->endbuf.
|
|
|
|
- The bufPutc and bufGetc routines will do this automatically.
|
|
|
|
- @defgroup WebsBuf WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef struct WebsBuf {
|
|
|
|
- char *buf; /**< Holding buffer for data */
|
|
|
|
- char *servp; /**< Pointer to start of data */
|
|
|
|
- char *endp; /**< Pointer to end of data */
|
|
|
|
- char *endbuf; /**< Pointer to end of buffer */
|
|
|
|
- ssize buflen; /**< Length of ring queue */
|
|
|
|
- ssize maxsize; /**< Maximum size */
|
|
|
|
- int increment; /**< Growth increment */
|
|
|
|
-} WebsBuf;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Add a trailing null to the buffer. The end pointer is not changed.
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void bufAddNull(WebsBuf *bp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Adjust the endp pointer by the specified size.
|
|
|
|
- @description This is useful after manually copying data into the buffer and needing to adjust the end pointer.
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @param size Size of adjustment. May be positive or negative value.
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void bufAdjustEnd(WebsBuf *bp, ssize size);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Adjust the start (servp) reference
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @param count Number of bytes to adjust
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void bufAdjustStart(WebsBuf *bp, ssize count);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Compact the data in the buffer and move to the start of the buffer
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void bufCompact(WebsBuf *bp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Create a buffer
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @param increment Incremental size to grow the buffer. This will be increased by a power of two each time
|
|
|
|
- the buffer grows.
|
|
|
|
- @param maxsize Maximum size of the buffer
|
|
|
|
- @return Zero if successful
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int bufCreate(WebsBuf *bp, int increment, int maxsize);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Flush all data in the buffer and reset the pointers.
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void bufFlush(WebsBuf *bp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Free allocated storage for the buffer
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @return Zero if successful
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void bufFree(WebsBuf *bp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Copy a block of from the buffer and adjust the servp.
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @param blk Block into which to place the data
|
|
|
|
- @param len Length of the block
|
|
|
|
- @return Number of bytes copied.
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize bufGetBlk(WebsBuf *bp, char *blk, ssize len);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Return the maximum number of bytes the buffer can provide via a single block copy.
|
|
|
|
- @description Useful if the user is doing their own data retrieval.
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @return Number of bytes available for copying.
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize bufGetBlkMax(WebsBuf *bp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get a character from the buffer and increment the servp
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @return The next character or -1 if the buffer is empty
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int bufGetc(WebsBuf *bp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Grow the buffer by at least the required amount of room
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @param room Available size required after growing the buffer
|
|
|
|
- @return True if the buffer can be grown to have the required amount of room.
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool bufGrow(WebsBuf *bp, ssize room);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the length of available data in the buffer
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @return Size of available data in bytes
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize bufLen(WebsBuf *bp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Insert a character to the buffer before the servp position and decrement the servp
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @param c Character to insert
|
|
|
|
- @return Zero if successful
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int bufInsertc(WebsBuf *bp, char c);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Append a character to the buffer at the endp position and increment the endp
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @param c Character to append
|
|
|
|
- @return Zero if successful
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int bufPutc(WebsBuf *bp, char c);
|
|
|
|
-/**
|
|
|
|
- Put a block to the buffer.
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @param blk Block to append to the buffer
|
|
|
|
- @param len Size of the block
|
|
|
|
- @return Length of data appended. Should equal len.
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize bufPutBlk(WebsBuf *bp, cchar *blk, ssize len);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Append a formatted string to the buffer at the endp position and increment the endp
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @param fmt Printf style format string
|
|
|
|
- @param ... Variable arguments for the format string
|
|
|
|
- @return Count of characters appended. Returns negative if there is an allocation error.
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize bufPut(WebsBuf *bp, cchar *fmt, ...) PRINTF_ATTRIBUTE(2,3);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Append a string to the buffer at the endp position and increment the endp
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @param str String to append
|
|
|
|
- @return Count of characters appended. Returns negative if there is an allocation error.
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize bufPutStr(WebsBuf *bp, cchar *str);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Reset the buffer pointers to the start of the buffer if empty
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void bufReset(WebsBuf *bp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Determine the room available in the buffer.
|
|
|
|
- @description This returns the maximum number of bytes the buffer can absorb in a single block copy.
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @return Number of bytes of available space.
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize bufRoom(WebsBuf *bp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get a reference to the start of buffer data
|
|
|
|
- @param bp Buffer reference
|
|
|
|
- @return A string pointer.
|
|
|
|
- @ingroup WebsBuf
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *bufStart(WebsBuf *bp);
|
|
|
|
-
|
|
|
|
-/******************************* Malloc Replacement ***************************/
|
|
|
|
-#if ME_GOAHEAD_REPLACE_MALLOC
|
|
|
|
-/**
|
|
|
|
- GoAhead allocator memory block
|
|
|
|
- Memory block classes are: 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536.
|
|
|
|
- @defgroup WebsAlloc WebsAlloc
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef struct WebsAlloc {
|
|
|
|
- union {
|
|
|
|
- void *next; /**< Pointer to next in q */
|
|
|
|
- int size; /**< Actual requested size */
|
|
|
|
- } u;
|
|
|
|
- int flags; /**< Per block allocation flags */
|
|
|
|
-} WebsAlloc;
|
|
|
|
-
|
|
|
|
-#define WEBS_DEFAULT_MEM (64 * 1024) /**< Default memory allocation */
|
|
|
|
-#define WEBS_MAX_CLASS 13 /**< Maximum class number + 1 */
|
|
|
|
-#define WEBS_SHIFT 4 /**< Convert size to class */
|
|
|
|
-#define WEBS_ROUND ((1 << (B_SHIFT)) - 1)
|
|
|
|
-#define WEBS_MALLOCED 0x80000000 /* Block was malloced */
|
|
|
|
-#define WEBS_FILL_CHAR (0x77) /* Fill byte for buffers */
|
|
|
|
-#define WEBS_FILL_WORD (0x77777777) /* Fill word for buffers */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Flags. The integrity value is used as an arbitrary value to fill the flags.
|
|
|
|
- */
|
|
|
|
-#define WEBS_USE_MALLOC 0x1 /**< Okay to use malloc if required */
|
|
|
|
-#define WEBS_USER_BUF 0x2 /* User supplied buffer for mem */
|
|
|
|
-#define WEBS_INTEGRITY 0x8124000 /* Integrity value */
|
|
|
|
-#define WEBS_INTEGRITY_MASK 0xFFFF000 /* Integrity mask */
|
|
|
|
-#endif /* ME_GOAHEAD_REPLACE_MALLOC */
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close the GoAhead memory allocator
|
|
|
|
- @ingroup WebsAlloc
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void wcloseAlloc(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Initialize the walloc module.
|
|
|
|
- @description The wopenAlloc function should be called the very first thing after the application starts and wclose
|
|
|
|
- should be called the last thing before exiting. If wopenAlloc is not called, it will be called on the first allocation
|
|
|
|
- with default values. "buf" points to memory to use of size "bufsize". If buf is NULL, memory is allocated using malloc.
|
|
|
|
- flags may be set to WEBS_USE_MALLOC if using malloc is okay. This routine will allocate * an initial buffer of size
|
|
|
|
- bufsize for use by the application.
|
|
|
|
- @param buf Optional user supplied block of memory to use for allocations
|
|
|
|
- @param bufsize Size of buf
|
|
|
|
- @param flags Allocation flags. Set to WEBS_USE_MALLOC to permit the use of malloc() to grow memory.
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup WebsAlloc
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int wopenAlloc(void *buf, int bufsize, int flags);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Allocate a block of the requested size
|
|
|
|
- @param size Memory size required
|
|
|
|
- @return A reference to the allocated block
|
|
|
|
- @ingroup WebsAlloc
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void *walloc(ssize size);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Free an allocated block of memory
|
|
|
|
- @param blk Reference to the memory block to free.
|
|
|
|
- @ingroup WebsAlloc
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void wfree(void *blk);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Reallocate a block of memory and grow its size
|
|
|
|
- @description If the new size is larger than the existing block, a new block will be allocated and the old data
|
|
|
|
- will be copied to the new block.
|
|
|
|
- @param blk Original block reference
|
|
|
|
- @param newsize Size of the new block.
|
|
|
|
- @return Reference to the new memory block
|
|
|
|
- @ingroup WebsAlloc
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void *wrealloc(void *blk, ssize newsize);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Duplicate memory
|
|
|
|
- @param ptr Original block reference
|
|
|
|
- @param usize Size to allocate
|
|
|
|
- @return Reference to the new memory block
|
|
|
|
- @ingroup WebsAlloc
|
|
|
|
- */
|
|
|
|
-PUBLIC void *wdup(cvoid *ptr, size_t usize);
|
|
|
|
-
|
|
|
|
-typedef void (*WebsMemNotifier)(ssize size);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Define a global memory allocation notifier.
|
|
|
|
- @description The notifier is called if any memory allocation fails. It is called with the requested allocation size
|
|
|
|
- as its only parameter.
|
|
|
|
- @param cback Callback function to invoke for allocation failures.
|
|
|
|
- @ingroup WebsAlloc
|
|
|
|
- @stability Evolving
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetMemNotifier(WebsMemNotifier cback);
|
|
|
|
-
|
|
|
|
-#ifndef WEBS_SHIFT
|
|
|
|
- #define WEBS_SHIFT 4
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#if DEPRECATE
|
|
|
|
-/*
|
|
|
|
- Deprecated in 4.0.0
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize mtow(wchar *dest, ssize count, char *src, ssize len);
|
|
|
|
-PUBLIC ssize wtom(char *dest, ssize count, wchar *src, ssize len);
|
|
|
|
-PUBLIC wchar *amtow(char *src, ssize *len);
|
|
|
|
-PUBLIC char *awtom(wchar *src, ssize *len);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/******************************* Hash Table *********************************/
|
|
|
|
-/**
|
|
|
|
- Hash table entry structure.
|
|
|
|
- @description The hash structure supports growable hash tables with high performance, collision resistant hashes.
|
|
|
|
- Each hash entry has a descriptor entry. This is used to manage the hash table link chains.
|
|
|
|
- @see hashCreate hashFree hashLookup hashEnter hashDelete hashWalk hashFirst hashNext
|
|
|
|
- @defgroup WebsHash WebsHash
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef struct WebsKey {
|
|
|
|
- struct WebsKey *forw; /* Pointer to next hash list */
|
|
|
|
- WebsValue name; /* Name of symbol */
|
|
|
|
- WebsValue content; /* Value of symbol */
|
|
|
|
- int arg; /* Parameter value */
|
|
|
|
- int bucket; /* Bucket index */
|
|
|
|
-} WebsKey;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Hash table ID returned by hashCreate
|
|
|
|
- */
|
|
|
|
-typedef int WebsHash; /* Returned by symCreate */
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Create a hash table
|
|
|
|
- @param size Minimum size of the hash index
|
|
|
|
- @return Hash table ID. Negative if the hash cannot be created.
|
|
|
|
- @ingroup WebsHash
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsHash hashCreate(int size);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Free a hash table
|
|
|
|
- @param id Hash table id returned by hashCreate
|
|
|
|
- @ingroup WebsHash
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void hashFree(WebsHash id);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Lookup a name in the hash table
|
|
|
|
- @param id Hash table id returned by hashCreate
|
|
|
|
- @param name Key name to search for
|
|
|
|
- @return Reference to the WebKey object storing the key and value
|
|
|
|
- @ingroup WebsHash
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsKey *hashLookup(WebsHash id, cchar *name);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Lookup a name in the hash table and return a symbol reference
|
|
|
|
- @param sd Hash table id returned by hashCreate
|
|
|
|
- @param name Key name to search for
|
|
|
|
- @return Reference to the symbole
|
|
|
|
- @ingroup WebsHash
|
|
|
|
- @stability Evolving
|
|
|
|
- */
|
|
|
|
-PUBLIC void *hashLookupSymbol(WebsHash sd, cchar *name);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Enter a new key and value into the hash table
|
|
|
|
- @param id Hash table id returned by hashCreate
|
|
|
|
- @param name Key name to create
|
|
|
|
- @param value Key value to enter
|
|
|
|
- @param arg Optional extra argument to store with the value
|
|
|
|
- @return Reference to the WebKey object storing the key and value
|
|
|
|
- @ingroup WebsHash
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsKey *hashEnter(WebsHash id, cchar *name, WebsValue value, int arg);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Delete a key by name
|
|
|
|
- @param id Hash table id returned by hashCreate
|
|
|
|
- @param name Key name to delete
|
|
|
|
- @return Zero if the delete was successful. Otherwise -1 if the key was not found.
|
|
|
|
- @ingroup WebsHash
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int hashDelete(WebsHash id, cchar *name);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Start walking the hash keys by returning the first key entry in the hash
|
|
|
|
- @param id Hash table id returned by hashCreate
|
|
|
|
- @return Reference to the first WebKey object. Return null if there are no keys in the hash.
|
|
|
|
- @ingroup WebsHash
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsKey *hashFirst(WebsHash id);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Continue walking the hash keys by returning the next key entry in the hash
|
|
|
|
- @param id Hash table id returned by hashCreate
|
|
|
|
- @param last Reference to a WebsKey to hold the current traversal key state.
|
|
|
|
- @return Reference to the next WebKey object. Returns null if no more keys exist to be traversed.
|
|
|
|
- @ingroup WebsHash
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsKey *hashNext(WebsHash id, WebsKey *last);
|
|
|
|
-
|
|
|
|
-/************************************ Socket **********************************/
|
|
|
|
-/*
|
|
|
|
- Socket flags
|
|
|
|
- */
|
|
|
|
-#define SOCKET_EOF 0x1 /**< Seen end of file */
|
|
|
|
-#define SOCKET_CONNECTING 0x2 /**< Connect in progress */
|
|
|
|
-#define SOCKET_RESERVICE 0x4 /**< Socket needs re-servicing */
|
|
|
|
-#define SOCKET_ASYNC 0x8 /**< Use async connect */
|
|
|
|
-#define SOCKET_BLOCK 0x10 /**< Use blocking I/O */
|
|
|
|
-#define SOCKET_LISTENING 0x20 /**< Socket is server listener */
|
|
|
|
-#define SOCKET_CLOSING 0x40 /**< Socket is closing */
|
|
|
|
-#define SOCKET_CONNRESET 0x80 /**< Socket connection was reset */
|
|
|
|
-#define SOCKET_HANDSHAKING 0x100 /**< Doing SSL handshake */
|
|
|
|
-#define SOCKET_BUFFERED_READ 0x200 /**< Message pending on this socket */
|
|
|
|
-#define SOCKET_BUFFERED_WRITE 0x400 /**< Message pending on this socket */
|
|
|
|
-#define SOCKET_NODELAY 0x800 /**< Disable Nagle algorithm */
|
|
|
|
-
|
|
|
|
-#define SOCKET_PORT_MAX 0xffff /**< Max Port size */
|
|
|
|
-
|
|
|
|
-#ifndef ME_MAX_IP
|
|
|
|
- #define ME_MAX_IP 64 /**< Maximum IP address size */
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Socket error values
|
|
|
|
- */
|
|
|
|
-#define SOCKET_WOULDBLOCK 1 /**< Socket would block on I/O */
|
|
|
|
-#define SOCKET_RESET 2 /**< Socket has been reset */
|
|
|
|
-#define SOCKET_NETDOWN 3 /**< Network is down */
|
|
|
|
-#define SOCKET_AGAIN 4 /**< Issue the request again */
|
|
|
|
-#define SOCKET_INTR 5 /**< Call was interrupted */
|
|
|
|
-#define SOCKET_INVAL 6 /**< Invalid */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Handler event masks
|
|
|
|
- */
|
|
|
|
-#define SOCKET_READABLE 0x2 /**< Make socket readable */
|
|
|
|
-#define SOCKET_WRITABLE 0x4 /**< Make socket writable */
|
|
|
|
-#define SOCKET_EXCEPTION 0x8 /**< Interested in exceptions */
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Socket I/O callback
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or when a new socket is passed to a SocketAccept
|
|
|
|
- callback..
|
|
|
|
- @param mask Mask of events of interest. Set to SOCKET_READABLE | SOCKET_WRITABLE | SOCKET_EXCEPTION.
|
|
|
|
- @param data Data argument to pass to the callback function.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef void (*SocketHandler)(int sid, int mask, void *data);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Socket accept callback
|
|
|
|
- @param sid Socket ID handle for the newly accepted socket
|
|
|
|
- @param ipaddr IP address of the connecting client.
|
|
|
|
- @param port Port of the connecting client.
|
|
|
|
- @param listenSid Socket ID for the listening socket
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef int (*SocketAccept)(int sid, cchar *ipaddr, int port, int listenSid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Socket control structure
|
|
|
|
- @see socketAddress socketAddressIsV6 socketClose socketCloseConnection socketCreateHandler
|
|
|
|
- socketDeletehandler socketReservice socketEof socketGetPort socketInfo socketIsV6
|
|
|
|
- socketOpen socketListen socketParseAddress socketProcess socketRead socketWrite socketWriteString
|
|
|
|
- socketSelect socketGetHandle socketSetBlock socketGetBlock socketAlloc socketFree socketGetError
|
|
|
|
- socketSetError socketPtr socketWaitForEvent socketRegisterInterest
|
|
|
|
- @defgroup WebsSocket WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef struct WebsSocket {
|
|
|
|
- WebsBuf lineBuf; /**< Line ring queue */
|
|
|
|
- SocketAccept accept; /**< Accept handler */
|
|
|
|
- SocketHandler handler; /**< User I/O handler */
|
|
|
|
- char *ip; /**< Server listen address or remote client address */
|
|
|
|
- void *handler_data; /**< User handler data */
|
|
|
|
- int handlerMask; /**< Handler events of interest */
|
|
|
|
- int sid; /**< Index into socket[] */
|
|
|
|
- int port; /**< Port to listen on */
|
|
|
|
- int flags; /**< Current state flags */
|
|
|
|
- Socket sock; /**< Actual socket handle */
|
|
|
|
- int fileHandle; /**< ID of the file handler */
|
|
|
|
- int interestEvents; /**< Mask of events to watch for */
|
|
|
|
- int currentEvents; /**< Mask of ready events (FD_xx) */
|
|
|
|
- int selectEvents; /**< Events being selected */
|
|
|
|
- int saveMask; /**< saved Mask for socketFlush */
|
|
|
|
- int error; /**< Last error */
|
|
|
|
- int secure; /**< Socket is using SSL */
|
|
|
|
- int handshakes; /**< Number of renegotiations */
|
|
|
|
-} WebsSocket;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Extract the numerical IP address and port for the given socket info
|
|
|
|
- @param addr Reference to the socket address.
|
|
|
|
- @param addrlen Length of the socket address
|
|
|
|
- @param ipbuf Buffer to contain the parsed IP address
|
|
|
|
- @param ipLen Size of ipbuf
|
|
|
|
- @param port Reference to an integer to hold the parsed port.
|
|
|
|
- @return Zero if successful. Otherwise -1 for parse errors.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketAddress(struct sockaddr *addr, int addrlen, char *ipbuf, int ipLen, int *port);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Determine if an IP address is an IPv6 address.
|
|
|
|
- @param ip String IP address.
|
|
|
|
- @return True if the address is an IPv6 address.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool socketAddressIsV6(cchar *ip);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Allocate a socket object
|
|
|
|
- @param host String host IP address.
|
|
|
|
- @param port Socket port
|
|
|
|
- @param accept Optional SocketAccept accept callback function
|
|
|
|
- @param flags Control flags
|
|
|
|
- @return Socket ID handle to use with other APIs.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketAlloc(cchar *host, int port, SocketAccept accept, int flags);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close the socket module
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void socketClose(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close a socket connection
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void socketCloseConnection(int sid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Connect to a server and create a new socket
|
|
|
|
- @param host Host IP address.
|
|
|
|
- @param port Port number to connect to
|
|
|
|
- @param flags Set to SOCKET_BLOCK for blocking I/O. Otherwise non-blocking I/O is used.
|
|
|
|
- @return True if the address is an IPv6 address.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @internal
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketConnect(cchar *host, int port, int flags);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Create a socket handler that will be invoked when I/O events occur.
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @param mask Mask of events of interest. Set to SOCKET_READABLE | SOCKET_WRITABLE | SOCKET_EXCEPTION.
|
|
|
|
- @param handler Socket handler function.
|
|
|
|
- @param arg Arbitrary object reference to pass to the SocketHandler callback function.
|
|
|
|
- @return True if the address is an IPv6 address.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void socketCreateHandler(int sid, int mask, SocketHandler handler, void *arg);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Delete a socket handler created via socketCreateHandler
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void socketDeleteHandler(int sid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Determine if the socket is at end-of-file for input.
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @return True if the address is at EOF
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool socketEof(int sid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Free (and close) the socket
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void socketFree(int sid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the current blocking mode
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @return True if the socket is in blocking mode.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketGetBlock(int sid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the error code for the last socket operation on this thread.
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @return Integer error code. See errno or GetLastError() on windows.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketGetError(int sid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the underlying socket operating system socket/file handle
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @return The socket handle
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC Socket socketGetHandle(int sid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the list of sockets
|
|
|
|
- @return The socket list pointer
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsSocket **socketGetList(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the IP port associated with this socket.
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @return The TCP/IP port for this socket
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketGetPort(int sid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Indicate if the system has a dual IPv4 and IPv6 stack
|
|
|
|
- @return True if IPv4 and IPv6 are supported on a single stack
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool socketHasDualNetworkStack(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Indicate if the system has IPv6 support
|
|
|
|
- @return True if IPv6 is supported on this system
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool socketHasIPv6(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Indicate that the application layer has buffered data for the socket.
|
|
|
|
- @description This is used by SSL and other network stacks that buffer pending data
|
|
|
|
- @param sp Socket object returned from #socketPtr
|
|
|
|
- @param len Length of buffered data in bytes
|
|
|
|
- @param dir Buffer direction. Set to MPR_READABLE for buffered read data and MPR_WRITABLE for buffered write data.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void socketHiddenData(WebsSocket *sp, ssize len, int dir);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get a socket address structure for the specified IP:Port
|
|
|
|
- @description This returns address details in *family, *protocol, *addr, and *addrlen.
|
|
|
|
- @param ip IP address to parse
|
|
|
|
- @param port TCP/IP port number
|
|
|
|
- @param family Reference to an integer to hold the address family
|
|
|
|
- @param protocol Reference to an integer to hold the address protocol
|
|
|
|
- @param addr Reference to an integer to hold the address structure
|
|
|
|
- @param addrlen Reference to an integer to hold the address structure length
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketInfo(cchar *ip, int port, int *family, int *protocol, struct sockaddr_storage *addr, Socklen *addrlen);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Determine if a socket is bound to an IPv6 address.
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @return True if the socket is using IPv6.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool socketIsV6(int sid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open a listening socket
|
|
|
|
- @param host Host IP address on which to listen. Set to NULL to listen on all interfaces.
|
|
|
|
- @param port TCP/IP port on which to listen
|
|
|
|
- @param accept SocketAccept callback function to invoke to receive incoming connections.
|
|
|
|
- @param flags Reserved
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketListen(cchar *host, int port, SocketAccept accept, int flags);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the socket module
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Parse an IP address into its constituent parts.
|
|
|
|
- @description Parse the IP address and return the IP address and port components. Handles ipv4 and ipv6 addresses.
|
|
|
|
- If the IP portion is absent, pip is set to null. If the port portion is absent, port is set to the defaultPort.
|
|
|
|
- If a ":*" port specifier is used, pport is set to -1;
|
|
|
|
- When an address contains an ipv6 port it should be written as
|
|
|
|
- aaaa:bbbb:cccc:dddd:eeee:ffff:gggg:hhhh:iiii
|
|
|
|
- or
|
|
|
|
- [aaaa:bbbb:cccc:dddd:eeee:ffff:gggg:hhhh:iiii]:port
|
|
|
|
- If supplied an IPv6 address, the backets are stripped in the returned IP address.
|
|
|
|
- @param ipAddrPort IP address which may contain an optional ":port" component.
|
|
|
|
- @param pip Returns a reference to an allocated string containing the IP address portion. Caller must free.
|
|
|
|
- @param pport Reference to an integer to hold the port component.
|
|
|
|
- @param secure Reference to an integer to be set to true if the address is using SSL/TLS.
|
|
|
|
- @param defaultPort Default port number to use if no port specifier is included in ipAddrPort.
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketParseAddress(cchar *ipAddrPort, char **pip, int *pport, int *secure, int defaultPort);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Process pending socket I/O events.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- @internal
|
|
|
|
- */
|
|
|
|
-PUBLIC void socketProcess(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Read data from a socket
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @param buf Buffer to hold read data
|
|
|
|
- @param len Size of the buffer
|
|
|
|
- @return Count of bytes actually read. Returns -1 for errors and EOF. Distinguish between errors and EOF
|
|
|
|
- via socketEof().
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize socketRead(int sid, void *buf, ssize len);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Register interest in socket I/OEvents
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @param mask Mask of events of interest. Set to SOCKET_READABLE | SOCKET_WRITABLE | SOCKET_EXCEPTION.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void socketRegisterInterest(int sid, int mask);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Request that the socket be reserviced.
|
|
|
|
- @description This routine is useful when upper layers have unprocessed, buffered data for the socket.
|
|
|
|
- This routine will cause the socket I/O callback handler to be invoked soon in the future.
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void socketReservice(int sid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Wait for I/O on a socket
|
|
|
|
- @description This call uses the mask of events of interest defined by socketRegisterInterest. It blocks the caller
|
|
|
|
- until a suitable I/O event or timeout occurs.
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @param timeout Timeout in milliseconds.
|
|
|
|
- @return Number of I/O events.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketSelect(int sid, int timeout);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set the socket blocking mode
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @param on Set to 1 to enable blocking
|
|
|
|
- @return The previous blocking mode
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketSetBlock(int sid, int on);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set the error code for the last socket operation on this thread.
|
|
|
|
- @param error Integer error code. See errno or GetLastError() on windows.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void socketSetError(int error);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set the socket delay mode
|
|
|
|
- @description This is used to enable or disable the TCP Nagle algorithm
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @param on Set to 1 to disable the Nagle algorithm
|
|
|
|
- @return The previous blocking mode
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketSetNoDelay(int sid, bool on);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Wait for a socket I/O event
|
|
|
|
- @param sp Socket object
|
|
|
|
- @param mask Mask of events of interest. Set to SOCKET_READABLE | SOCKET_WRITABLE | SOCKET_EXCEPTION.
|
|
|
|
- @return Zero if successful in waiting for the desired event, otherwise return -1.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int socketWaitForEvent(WebsSocket *sp, int mask);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Write data to the socket
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @param buf Buffer containing data to write
|
|
|
|
- @param len Size of buf
|
|
|
|
- @return Count of bytes written. May be less than len if the socket is in non-blocking mode.
|
|
|
|
- Returns -1 for errors and if the socket cannot absorb any more data. If the transport is saturated,
|
|
|
|
- will return a negative error and errno will be set to EAGAIN or EWOULDBLOCK.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize socketWrite(int sid, void *buf, ssize len);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Return the socket object for the socket ID.
|
|
|
|
- @param sid Socket ID handle returned from socketConnect or socketAccept.
|
|
|
|
- @return Corresponding socket object.
|
|
|
|
- @ingroup WebsSocket
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsSocket *socketPtr(int sid);
|
|
|
|
-
|
|
|
|
-/*********************************** Runtime **********************************/
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- GoAhead Web Server Runtime
|
|
|
|
- @description GoAhead provides a secure runtime environment for safe string manipulation and to
|
|
|
|
- help prevent buffer overflows and other potential security traps.
|
|
|
|
- @defgroup WebsRuntime WebsRuntime
|
|
|
|
- @see fmt wallocHandle wallocObject wfreeHandle hextoi itosbuf scaselesscmp scaselessmatch
|
|
|
|
- sclone scmp scopy sfmt sfmtv slen slower smatch sstarts sncaselesscmp sncmp sncopy stok strim supper
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Format a string into a static buffer.
|
|
|
|
- @description This call format a string using printf style formatting arguments. A trailing null will
|
|
|
|
- always be appended. The call returns the size of the allocated string excluding the null.
|
|
|
|
- @param buf Pointer to the buffer.
|
|
|
|
- @param maxSize Size of the buffer.
|
|
|
|
- @param format Printf style format string
|
|
|
|
- @param ... Variable arguments to format
|
|
|
|
- @return Returns the buffer.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *fmt(char *buf, ssize maxSize, cchar *format, ...);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Allocate a handle from a map
|
|
|
|
- @param map Reference to a location holding the map reference. On the first call, the map is allocated.
|
|
|
|
- @return Integer handle index. Otherwise return -1 on allocation errors.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int wallocHandle(void *map);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Allocate an object in a halloc map
|
|
|
|
- @param map Reference to a location holding the map reference. On the first call, the map is allocated.
|
|
|
|
- @param max Reference to an integer that holds the maximum handle in the map.
|
|
|
|
- @param size Size of the object to allocate.
|
|
|
|
- @return Integer handle index. Otherwise return -1 on allocation errors.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int wallocObject(void *map, int *max, int size);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Free a handle in the map
|
|
|
|
- @param map Reference to a location to hold the map reference.
|
|
|
|
- @param handle Handle to free in the map.
|
|
|
|
- @return Integer handle index. Otherwise return -1 on allocation errors.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int wfreeHandle(void *map, int handle);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Convert a hex string to an integer
|
|
|
|
- @description This call converts the supplied string to an integer using base 16.
|
|
|
|
- @param str Pointer to the string to parse.
|
|
|
|
- @return Returns the integer equivalent value of the string.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC uint hextoi(cchar *str);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Convert an integer to a string buffer.
|
|
|
|
- @description This call converts the supplied 64 bit integer into a string formatted into the supplied buffer according
|
|
|
|
- to the specified radix.
|
|
|
|
- @param buf Pointer to the buffer that will hold the string.
|
|
|
|
- @param size Size of the buffer.
|
|
|
|
- @param value Integer value to convert
|
|
|
|
- @param radix The base radix to use when encoding the number
|
|
|
|
- @return Returns a reference to the string.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *itosbuf(char *buf, ssize size, int64 value, int radix);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Compare strings ignoring case. This is a safe replacement for strcasecmp. It can handle NULL args.
|
|
|
|
- @description Compare two strings ignoring case differences. This call operates similarly to strcmp.
|
|
|
|
- @param s1 First string to compare.
|
|
|
|
- @param s2 Second string to compare.
|
|
|
|
- @return Returns zero if the strings are equivalent, < 0 if s1 sorts lower than s2 in the collating sequence
|
|
|
|
- or > 0 if it sorts higher.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int scaselesscmp(cchar *s1, cchar *s2);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Compare strings ignoring case. This is similar to scaselesscmp but it returns a boolean.
|
|
|
|
- @description Compare two strings ignoring case differences.
|
|
|
|
- @param s1 First string to compare.
|
|
|
|
- @param s2 Second string to compare.
|
|
|
|
- @return Returns true if the strings are equivalent, otherwise false.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool scaselessmatch(cchar *s1, cchar *s2);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Clone a string
|
|
|
|
- @description Copy a string into a newly allocated block.
|
|
|
|
- @param str Pointer to the block to duplicate.
|
|
|
|
- @return Returns a newly allocated string.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *sclone(cchar *str);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Clone a substring.
|
|
|
|
- @description Copy a substring into a newly allocated block.
|
|
|
|
- @param str Pointer to the block to duplicate.
|
|
|
|
- @param len Number of bytes to copy. The actual length copied is the minimum of the given length and the length of
|
|
|
|
- the supplied string. The result is null terminated.
|
|
|
|
- @return Returns a newly allocated string.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *snclone(cchar *str, ssize len);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Compare strings.
|
|
|
|
- @description Compare two strings. This is a safe replacement for strcmp. It can handle null args.
|
|
|
|
- @param s1 First string to compare.
|
|
|
|
- @param s2 Second string to compare.
|
|
|
|
- @return Returns zero if the strings are identical. Return -1 if the first string is less than the second. Return 1
|
|
|
|
- if the first string is greater than the second.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int scmp(cchar *s1, cchar *s2);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Copy a string.
|
|
|
|
- @description Safe replacement for strcpy. Copy a string and ensure the destination buffer is not overflowed.
|
|
|
|
- The call returns the length of the resultant string or an error code if it will not fit into the target
|
|
|
|
- string. This is similar to strcpy, but it will enforce a maximum size for the copied string and will
|
|
|
|
- ensure it is always terminated with a null.
|
|
|
|
- @param dest Pointer to a pointer that will hold the address of the allocated block.
|
|
|
|
- @param destMax Maximum size of the target string in characters.
|
|
|
|
- @param src String to copy
|
|
|
|
- @return Returns the number of characters in the target string.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize scopy(char *dest, ssize destMax, cchar *src);
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- String trim flags
|
|
|
|
- */
|
|
|
|
-#define WEBS_TRIM_START 0x1 /**< Flag for strim to trim from the start of the string */
|
|
|
|
-#define WEBS_TRIM_END 0x2 /**< Flag for strim to trim from the end of the string */
|
|
|
|
-#define WEBS_TRIM_BOTH 0x3 /**< Flag for strim to trim from both the start and the end of the string */
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Format a string. This is a secure version of printf that can handle null args.
|
|
|
|
- @description Format the given arguments according to the printf style format. See fmt() for a full list of the
|
|
|
|
- format specifies. This is a secure replacement for sprintf, it can handle null arguments without crashes.
|
|
|
|
- @param format Printf style format string
|
|
|
|
- @param ... Variable arguments for the format string
|
|
|
|
- @return Returns a newly allocated string
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *sfmt(cchar *format, ...);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Format a string with varargs. This is a secure version of printf that can handle null args.
|
|
|
|
- @description Format the given arguments according to the printf style format. See fmt() for a full list of the
|
|
|
|
- format specifies. This is a secure replacement for sprintf, it can handle null arguments without crashes.
|
|
|
|
- @param format Printf style format string
|
|
|
|
- @param args Varargs argument obtained from va_start.
|
|
|
|
- @return Returns a newly allocated string
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *sfmtv(cchar *format, va_list args);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Return the length of a string.
|
|
|
|
- @description Safe replacement for strlen. This call returns the length of a string and tests if the length is
|
|
|
|
- less than a given maximum. It will return zero for NULL args.
|
|
|
|
- @param str String to measure.
|
|
|
|
- @return Returns the length of the string
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize slen(cchar *str);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Convert a string to lower case.
|
|
|
|
- @description Convert a string to its lower case equivalent.
|
|
|
|
- @param str String to convert. This string is modified.
|
|
|
|
- @return Reference to the supplied str. Caller must not free.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *slower(char *str);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Compare strings
|
|
|
|
- @description Compare two strings. This is similar to #scmp but it returns a boolean.
|
|
|
|
- @param s1 First string to compare.
|
|
|
|
- @param s2 Second string to compare.
|
|
|
|
- @return Returns true if the strings are equivalent, otherwise false.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool smatch(cchar *s1, cchar *s2);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Compare strings ignoring case.
|
|
|
|
- @description Compare two strings ignoring case differences for a given string length. This call operates
|
|
|
|
- similarly to strncasecmp.
|
|
|
|
- @param s1 First string to compare.
|
|
|
|
- @param s2 Second string to compare.
|
|
|
|
- @param len Length of characters to compare.
|
|
|
|
- @return Returns zero if the strings are equivalent, < 0 if s1 sorts lower than s2 in the collating sequence
|
|
|
|
- or > 0 if it sorts higher.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int sncaselesscmp(cchar *s1, cchar *s2, ssize len);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Compare strings.
|
|
|
|
- @description Compare two strings for a given string length. This call operates similarly to strncmp.
|
|
|
|
- @param s1 First string to compare.
|
|
|
|
- @param s2 Second string to compare.
|
|
|
|
- @param len Length of characters to compare.
|
|
|
|
- @return Returns zero if the strings are equivalent, < 0 if s1 sorts lower than s2 in the collating sequence
|
|
|
|
- or > 0 if it sorts higher.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int sncmp(cchar *s1, cchar *s2, ssize len);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Copy characters from a string.
|
|
|
|
- @description Safe replacement for strncpy. Copy bytes from a string and ensure the target string is not overflowed.
|
|
|
|
- The call returns the length of the resultant string or an error code if it will not fit into the target
|
|
|
|
- string. This is similar to strcpy, but it will enforce a maximum size for the copied string and will
|
|
|
|
- ensure it is terminated with a null.
|
|
|
|
- @param dest Pointer to a pointer that will hold the address of the allocated block.
|
|
|
|
- @param destMax Maximum size of the target string in characters.
|
|
|
|
- @param src String to copy
|
|
|
|
- @param count Maximum count of characters to copy
|
|
|
|
- @return Returns a reference to the destination if successful or NULL if the string won't fit.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize sncopy(char *dest, ssize destMax, cchar *src, ssize count);
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Test if a string is a radix 10 number.
|
|
|
|
- @description The supported format is: [(+|-)][DIGITS]
|
|
|
|
- @return true if all characters are digits or '+' or '-'
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool snumber(cchar *s);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Split a string at a delimiter
|
|
|
|
- @description Split a string and return parts. The string is modified.
|
|
|
|
- This routiner never returns null. If there are leading delimiters, the empty string will be returned
|
|
|
|
- and *last will be set to the portion after the delimiters.
|
|
|
|
- If str is null, an empty string will be returned.
|
|
|
|
- If there are no characters after the delimiter, then *last will be set to the empty string.
|
|
|
|
- @param str String to tokenize.
|
|
|
|
- @param delim Set of characters that are used as token separators.
|
|
|
|
- @param last Reference to the portion after the delimiters. Will return an empty string if is not trailing portion.
|
|
|
|
- @return Returns a pointer to the first part before the delimiters. If the string begins with delimiters, the empty
|
|
|
|
- string will be returned.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Evolving
|
|
|
|
- */
|
|
|
|
-PUBLIC char *ssplit(char *str, cchar *delim, char **last);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Test if the string starts with a given pattern.
|
|
|
|
- @param str String to examine
|
|
|
|
- @param prefix Pattern to search for
|
|
|
|
- @return Returns TRUE if the pattern was found. Otherwise returns zero.
|
|
|
|
- @ingroup MprString
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool sstarts(cchar *str, cchar *prefix);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Tokenize a string
|
|
|
|
- @description Split a string into tokens.
|
|
|
|
- @param str String to tokenize.
|
|
|
|
- @param delim String of characters to use as token separators.
|
|
|
|
- @param last Last token pointer.
|
|
|
|
- @return Returns a pointer to the next token.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *stok(char *str, cchar *delim, char **last);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Trim a string.
|
|
|
|
- @description Trim leading and trailing characters off a string.
|
|
|
|
- @param str String to trim.
|
|
|
|
- @param set String of characters to remove.
|
|
|
|
- @param where Flags to indicate trim from the start, end or both. Use WEBS_TRIM_START, WEBS_TRIM_END, WEBS_TRIM_BOTH.
|
|
|
|
- @return Returns a pointer to the trimmed string. May not equal \a str.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *strim(char *str, cchar *set, int where);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Convert a string to upper case.
|
|
|
|
- @description Convert a string to its upper case equivalent.
|
|
|
|
- @param str String to convert. This string is modified.
|
|
|
|
- @return Returns a pointer to the converted string. Will always equal str. Caller must not free.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *supper(char *str);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Callback function for events
|
|
|
|
- @param data Opaque data argument
|
|
|
|
- @param id Event ID
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef void (*WebsEventProc)(void *data, int id);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Start a callback event
|
|
|
|
- @description This schedules an event to run once. The event can be rescheduled in the callback by invoking
|
|
|
|
- websRestartEvent.
|
|
|
|
- @param delay Delay in milliseconds in which to run the callback
|
|
|
|
- @param proc Callback procedure function. Signature is: void (*fn)(void *data, int id)
|
|
|
|
- @param data Data reference to pass to the callback
|
|
|
|
- @return A positive integer event ID
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websStartEvent(int delay, WebsEventProc proc, void *data);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Stop an event
|
|
|
|
- @param id Event id allocated by websStartEvent
|
|
|
|
- @return Integer handle index. Otherwise return -1 on allocation errors.
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websStopEvent(int id);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Restart an event
|
|
|
|
- @param id Event id allocated by websStartEvent
|
|
|
|
- @param delay Delay in milliseconds till the event next runs
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websRestartEvent(int id, int delay);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Run due events
|
|
|
|
- @ingroup WebsRuntime
|
|
|
|
- @return Time delay till the next event
|
|
|
|
- @internal
|
|
|
|
- */
|
|
|
|
-PUBLIC int websRunEvents(void);
|
|
|
|
-
|
|
|
|
-/* Forward declare */
|
|
|
|
-struct WebsRoute;
|
|
|
|
-struct WebsUser;
|
|
|
|
-struct WebsSession;
|
|
|
|
-struct Webs;
|
|
|
|
-
|
|
|
|
-/********************************** Upload ************************************/
|
|
|
|
-#if ME_GOAHEAD_UPLOAD
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- File upload structure
|
|
|
|
- @see websUploadOpen websLookupUpload websGetUpload
|
|
|
|
- @defgroup WebsUpload WebsUpload
|
|
|
|
- */
|
|
|
|
-typedef struct WebsUpload {
|
|
|
|
- char *filename; /**< Local (temp) name of the file */
|
|
|
|
- char *clientFilename; /**< Client side name of the file */
|
|
|
|
- char *contentType; /**< Content type */
|
|
|
|
- ssize size; /**< Uploaded file size */
|
|
|
|
-} WebsUpload;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the file upload filter
|
|
|
|
- @ingroup WebsUpload
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websUploadOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the hash of uploaded files for the request
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Hash table of uploaded files
|
|
|
|
- @ingroup WebsUpload
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsHash websGetUpload(struct Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the file upload filter
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param key Form upload name
|
|
|
|
- @return Upload object for the uploaded file
|
|
|
|
- @ingroup WebsUpload
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsUpload *websLookupUpload(struct Webs *wp, cchar *key);
|
|
|
|
-#endif
|
|
|
|
-/********************************** Defines ***********************************/
|
|
|
|
-
|
|
|
|
-#define WEBS_MAX_PORT_LEN 16 /* Max digits in port number */
|
|
|
|
-#define WEBS_HASH_INIT 67 /* Hash size for form table */
|
|
|
|
-#define WEBS_SESSION_HASH 31 /* Hash size for session stores */
|
|
|
|
-#define WEBS_SESSION_PRUNE (60*1000) /* Prune sessions every minute */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- The license agreement stipulates that you must not change this definition.
|
|
|
|
- */
|
|
|
|
-#define WEBS_NAME "Server: GoAhead-http"
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Request flags
|
|
|
|
- */
|
|
|
|
-#define WEBS_ACCEPTED 0x1 /**< TLS connection accepted */
|
|
|
|
-#define WEBS_CHUNKING 0x2 /**< Currently chunking output body data */
|
|
|
|
-#define WEBS_CLOSED 0x4 /**< Connection closed, ready to free */
|
|
|
|
-#define WEBS_COOKIE 0x8 /**< Cookie supplied in request */
|
|
|
|
-#if DEPRECATED || 1
|
|
|
|
-#define WEBS_FINALIZED 0x10 /**< Output is finalized */
|
|
|
|
-#endif
|
|
|
|
-#define WEBS_FORM 0x20 /**< Request is a form (url encoded data) */
|
|
|
|
-#define WEBS_HEADERS_CREATED 0x40 /**< Headers have been created and buffered */
|
|
|
|
-#define WEBS_HTTP11 0x80 /**< Request is using HTTP/1.1 */
|
|
|
|
-#define WEBS_JSON 0x100 /**< Request has a JSON payload */
|
|
|
|
-#define WEBS_KEEP_ALIVE 0x200 /**< HTTP/1.1 keep alive */
|
|
|
|
-#define WEBS_REROUTE 0x400 /**< Restart route matching */
|
|
|
|
-#define WEBS_RESPONSE_TRACED 0x800 /**< Started tracing the response */
|
|
|
|
-#define WEBS_SECURE 0x1000 /**< Connection uses SSL */
|
|
|
|
-#define WEBS_UPLOAD 0x2000 /**< Multipart-mime file upload */
|
|
|
|
-#define WEBS_VARS_ADDED 0x4000 /**< Query and body form vars added */
|
|
|
|
-#if ME_GOAHEAD_LEGACY
|
|
|
|
-#define WEBS_LOCAL 0x8000 /**< Request from local system */
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Incoming chunk encoding states. Used for tx and rx chunking.
|
|
|
|
- */
|
|
|
|
-#define WEBS_CHUNK_UNCHUNKED 0 /**< Data is not transfer-chunk encoded */
|
|
|
|
-#define WEBS_CHUNK_START 1 /**< Start of a new chunk */
|
|
|
|
-#define WEBS_CHUNK_HEADER 2 /**< Preparing tx chunk header */
|
|
|
|
-#define WEBS_CHUNK_DATA 3 /**< Start of chunk data */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Webs state
|
|
|
|
- */
|
|
|
|
-#define WEBS_BEGIN 0 /**< Beginning state */
|
|
|
|
-#define WEBS_CONTENT 1 /**< Ready for body data */
|
|
|
|
-#define WEBS_READY 2 /**< Ready to route and start handler */
|
|
|
|
-#define WEBS_RUNNING 3 /**< Processing request */
|
|
|
|
-#define WEBS_COMPLETE 4 /**< Request complete */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Session names
|
|
|
|
- */
|
|
|
|
-#define WEBS_SESSION "-goahead-session-"
|
|
|
|
-#define WEBS_SESSION_USERNAME "_:USERNAME:_" /* Username variable */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- WebsDone flags
|
|
|
|
- */
|
|
|
|
-#define WEBS_CODE_MASK 0xFFFF /**< Mask valid status codes */
|
|
|
|
-#define WEBS_CLOSE 0x20000 /**< Close connection */
|
|
|
|
-#define WEBS_NOLOG 0x40000 /**< Don't write error to log */
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Callback for write I/O events
|
|
|
|
- */
|
|
|
|
-typedef void (*WebsWriteProc)(struct Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- GoAhead request structure. This is a per-socket connection structure.
|
|
|
|
- @defgroup Webs Webs
|
|
|
|
- */
|
|
|
|
-typedef struct Webs {
|
|
|
|
- WebsBuf rxbuf; /**< Raw receive buffer */
|
|
|
|
- WebsBuf input; /**< Receive buffer after de-chunking */
|
|
|
|
- WebsBuf output; /**< Transmit buffer after chunking */
|
|
|
|
- WebsBuf chunkbuf; /**< Pre-chunking data buffer */
|
|
|
|
- WebsBuf *txbuf;
|
|
|
|
- WebsTime since; /**< Parsed if-modified-since time */
|
|
|
|
- WebsTime timestamp; /**< Last transaction with browser */
|
|
|
|
- WebsHash vars; /**< CGI standard variables */
|
|
|
|
- int timeout; /**< Timeout handle */
|
|
|
|
- char ipaddr[ME_MAX_IP]; /**< Connecting ipaddress */
|
|
|
|
- char ifaddr[ME_MAX_IP]; /**< Local interface ipaddress */
|
|
|
|
-
|
|
|
|
- int rxChunkState; /**< Rx chunk encoding state */
|
|
|
|
- ssize rxChunkSize; /**< Rx chunk size */
|
|
|
|
- char *rxEndp; /**< Pointer to end of raw data in input beyond endp */
|
|
|
|
- ssize lastRead; /**< Number of bytes last read from the socket */
|
|
|
|
- bool eof; /**< If at the end of the request content */
|
|
|
|
-
|
|
|
|
- char txChunkPrefix[16]; /**< Transmit chunk prefix */
|
|
|
|
- char *txChunkPrefixNext; /**< Current I/O pos in txChunkPrefix */
|
|
|
|
- ssize txChunkPrefixLen; /**< Length of prefix */
|
|
|
|
- ssize txChunkLen; /**< Length of the chunk */
|
|
|
|
- int txChunkState; /**< Transmit chunk state */
|
|
|
|
-
|
|
|
|
- char *authDetails; /**< Http header auth details */
|
|
|
|
- char *authResponse; /**< Outgoing auth header */
|
|
|
|
- char *authType; /**< Authorization type (Basic/DAA) */
|
|
|
|
- char *contentType; /**< Body content type */
|
|
|
|
- char *cookie; /**< Request cookie string */
|
|
|
|
- char *decodedQuery; /**< Decoded request query */
|
|
|
|
- char *digest; /**< Password digest */
|
|
|
|
- char *ext; /**< Path extension */
|
|
|
|
- char *filename; /**< Document path name */
|
|
|
|
- char *host; /**< Requested host */
|
|
|
|
- char *method; /**< HTTP request method */
|
|
|
|
- char *password; /**< Authorization password */
|
|
|
|
- char *path; /**< Path name without query. This is decoded. */
|
|
|
|
- char *protoVersion; /**< Protocol version (HTTP/1.1)*/
|
|
|
|
- char *protocol; /**< Protocol scheme (normally http|https) */
|
|
|
|
- char *putname; /**< PUT temporary filename */
|
|
|
|
- char *query; /**< Request query. This is decoded. */
|
|
|
|
- char *realm; /**< Realm field supplied in auth header */
|
|
|
|
- char *referrer; /**< The referring page */
|
|
|
|
- char *url; /**< Full request url. This is not decoded. */
|
|
|
|
- char *userAgent; /**< User agent (browser) */
|
|
|
|
- char *username; /**< Authorization username */
|
|
|
|
- int sid; /**< Socket id (handler) */
|
|
|
|
- int listenSid; /**< Listen Socket id */
|
|
|
|
- int port; /**< Request port number */
|
|
|
|
- int state; /**< Current state */
|
|
|
|
- int flags; /**< Current flags -- see above */
|
|
|
|
- int code; /**< Response status code */
|
|
|
|
- int routeCount; /**< Route count limiter */
|
|
|
|
- ssize rxLen; /**< Rx content length */
|
|
|
|
- ssize rxRemaining; /**< Remaining content to read from client */
|
|
|
|
- ssize txLen; /**< Tx content length header value */
|
|
|
|
- int wid; /**< Index into webs */
|
|
|
|
-#if ME_GOAHEAD_CGI
|
|
|
|
- char *cgiStdin; /**< Filename for CGI program input */
|
|
|
|
- int cgifd; /**< File handle for CGI program input */
|
|
|
|
-#endif
|
|
|
|
-#if !ME_ROM
|
|
|
|
- int putfd; /**< File handle to write PUT data */
|
|
|
|
-#endif
|
|
|
|
- int docfd; /**< File descriptor for document being served */
|
|
|
|
- ssize written; /**< Bytes actually transferred */
|
|
|
|
- ssize putLen; /**< Bytes read by a PUT request */
|
|
|
|
-
|
|
|
|
- uint finalized: 1; /**< Request has been completed */
|
|
|
|
- uint error: 1; /**< Request has an error */
|
|
|
|
- uint connError: 1; /**< Request has a connection error */
|
|
|
|
-
|
|
|
|
- WebsHash responseCookies; /**< Outgoing cookies */
|
|
|
|
- struct WebsSession *session; /**< Session record */
|
|
|
|
- struct WebsRoute *route; /**< Request route */
|
|
|
|
- struct WebsUser *user; /**< User auth record */
|
|
|
|
- WebsWriteProc writeData; /**< Handler write I/O event callback. Used by fileHandler */
|
|
|
|
- int encoded; /**< True if the password is MD5(username:realm:password) */
|
|
|
|
-#if ME_GOAHEAD_DIGEST
|
|
|
|
- char *cnonce; /**< check nonce */
|
|
|
|
- char *digestUri; /**< URI found in digest header */
|
|
|
|
- char *nonce; /**< opaque-to-client string sent by server */
|
|
|
|
- char *nc; /**< nonce count */
|
|
|
|
- char *opaque; /**< opaque value passed from server */
|
|
|
|
- char *qop; /**< quality operator */
|
|
|
|
-#endif
|
|
|
|
-#if ME_GOAHEAD_UPLOAD
|
|
|
|
- int upfd; /**< Upload file handle */
|
|
|
|
- WebsHash files; /**< Uploaded files */
|
|
|
|
- char *boundary; /**< Mime boundary (static) */
|
|
|
|
- ssize boundaryLen; /**< Boundary length */
|
|
|
|
- int uploadState; /**< Current file upload state */
|
|
|
|
- WebsUpload *currentFile; /**< Current file context */
|
|
|
|
- char *clientFilename; /**< Current file filename */
|
|
|
|
- char *uploadTmp; /**< Current temp filename for upload data */
|
|
|
|
- char *uploadVar; /**< Current upload form variable name */
|
|
|
|
-#endif
|
|
|
|
- void *ssl; /**< SSL context */
|
|
|
|
-
|
|
|
|
- IPMI20_SESSION_T ipmi_session;
|
|
|
|
-} Webs;
|
|
|
|
-
|
|
|
|
-#if ME_GOAHEAD_LEGACY
|
|
|
|
- #define WEBS_LEGACY_HANDLER 0x1 /* Using legacy calling sequence */
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- GoAhead handler service callback
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if the handler serviced the request
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef bool (*WebsHandlerProc)(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- GoAhead handler close to release memory prior to shutdown.
|
|
|
|
- @description This callback is invoked when GoAhead is shutting down.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef void (*WebsHandlerClose)(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- GoAhead handler object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef struct WebsHandler {
|
|
|
|
- char *name; /**< Handler name */
|
|
|
|
- WebsHandlerProc match; /**< Handler match callback */
|
|
|
|
- WebsHandlerProc service; /**< Handler service callback */
|
|
|
|
- WebsHandlerClose close; /**< Handler close callback */
|
|
|
|
- int flags; /**< Handler control flags */
|
|
|
|
-} WebsHandler;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Action callback
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef void (*WebsAction)(Webs *wp);
|
|
|
|
-
|
|
|
|
-#if ME_GOAHEAD_LEGACY
|
|
|
|
- typedef void (*WebsProc)(Webs *wp, char *path, char *query);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Error code list
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef struct WebsError {
|
|
|
|
- int code; /**< HTTP error code */
|
|
|
|
- char *msg; /**< HTTP error message */
|
|
|
|
-} WebsError;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Mime type list
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef struct WebsMime {
|
|
|
|
- char *type; /**< Mime type */
|
|
|
|
- char *ext; /**< File extension */
|
|
|
|
-} WebsMime;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- File information structure.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef struct WebsFileInfo {
|
|
|
|
- ulong size; /**< File length */
|
|
|
|
- int isDir; /**< Set if directory */
|
|
|
|
- WebsTime mtime; /**< Modified time */
|
|
|
|
-} WebsFileInfo;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Compiled Rom Page Index
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef struct WebsRomIndex {
|
|
|
|
- char *path; /**< Web page URL path */
|
|
|
|
- uchar *page; /**< Web page data */
|
|
|
|
- int size; /**< Size of web page in bytes */
|
|
|
|
- Offset pos; /**< Current read position */
|
|
|
|
-} WebsRomIndex;
|
|
|
|
-
|
|
|
|
-#if ME_ROM
|
|
|
|
- /**
|
|
|
|
- List of documents to service when built with ROM support
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
- PUBLIC_DATA WebsRomIndex websRomIndex[];
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#define WEBS_DECODE_TOKEQ 1 /**< Decode base 64 blocks up to a NULL or equals */
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Accept a new connection
|
|
|
|
- @param sid Socket ID handle for the newly accepted socket
|
|
|
|
- @param ipaddr IP address originating the connection.
|
|
|
|
- @param port Port number originating the connection.
|
|
|
|
- @param listenSid Socket ID of the listening socket
|
|
|
|
- @return Zero if successful, otherwise -1
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websAccept(int sid, cchar *ipaddr, int port, int listenSid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the action handler
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websActionOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Allocate a new Webs object
|
|
|
|
- @param sid Socket ID handle for the newly accepted socket
|
|
|
|
- @return The webs[] handle index for the allocated Webs object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websAlloc(int sid);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Cancel the request timeout.
|
|
|
|
- @description Handlers may choose to manually manage the request timeout. This routine will disable the
|
|
|
|
- centralized management of the timeout for this request.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websCancelTimeout(Webs *wp);
|
|
|
|
-
|
|
|
|
-#if ME_GOAHEAD_CGI
|
|
|
|
-/**
|
|
|
|
- Open the CGI handler
|
|
|
|
- @return Zero if successful, otherwise -1
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websCgiOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- CGI handler service callback
|
|
|
|
- @param wp Webs object
|
|
|
|
- @return Returns 1 if the request was handled.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websCgiHandler(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Poll for output from CGI processes and output.
|
|
|
|
- @return Time delay till next poll
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websCgiPoll(void);
|
|
|
|
-
|
|
|
|
-/* Internal */
|
|
|
|
-PUBLIC bool cgiHandler(Webs *wp);
|
|
|
|
-
|
|
|
|
-#endif /* ME_GOAHEAD_CGI */
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close the core GoAhead web server module
|
|
|
|
- @description Invoked when GoAhead is shutting down.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websClose(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close an open file
|
|
|
|
- @param fd Open file handle returned by websOpenFile
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websCloseFile(int fd);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Compare a request variable
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param var Variable name
|
|
|
|
- @param value Value to compare with
|
|
|
|
- @return True if the value matches. Otherwise return 0
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websCompareVar(Webs *wp, cchar *var, cchar *value);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Consume input from the request input buffer.
|
|
|
|
- @description This is called by handlers when consuming data from the request input buffer.
|
|
|
|
- This call updates the input service pointers and compacts the input buffer if required.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param nbytes Number of bytes the handler has consumed from the input buffer.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websConsumeInput(Webs *wp, ssize nbytes);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Decode the string using base-64 encoding
|
|
|
|
- @description This modifies the original string
|
|
|
|
- @param str String to decode
|
|
|
|
- @return The original string. Caller must not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websDecode64(char *str);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Decode a block using base-46 encoding
|
|
|
|
- @param str String to decode. The string must be null terminated.
|
|
|
|
- @param len Reference to an integer holding the length of the decoded string.
|
|
|
|
- @param flags Reserved.
|
|
|
|
- @return The original string.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websDecode64Block(char *str, ssize *len, int flags);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Decode a URL expanding %NN encoding
|
|
|
|
- @description Supports insitu decoding. i.e. Input and output buffers may be the same.
|
|
|
|
- @param decoded Buffer to hold the decoded URL
|
|
|
|
- @param input Input URL or buffer to decode
|
|
|
|
- @param len Length of the decoded buffer.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-PUBLIC void websDecodeUrl(char *decoded, char *input, ssize len);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Define a request handler
|
|
|
|
- @param name Name of the handler
|
|
|
|
- @param match Handler callback match procedure. Invoked to match the request with the handler.
|
|
|
|
- The handler should return true to accept the request.
|
|
|
|
- @param service Handler callback service procedure. Invoked to service each request.
|
|
|
|
- @param close Handler callback close procedure. Called when GoAhead is shutting down.
|
|
|
|
- @param flags Set to WEBS_LEGACY_HANDLER to support the legacy handler API calling sequence.
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websDefineHandler(cchar *name, WebsHandlerProc match, WebsHandlerProc service, WebsHandlerClose close, int flags);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Complete a request.
|
|
|
|
- @description A handler should call websDone() to complete the request.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websDone(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Encode a string using base-64 encoding
|
|
|
|
- @description The string is encoded insitu.
|
|
|
|
- @param str String to encode
|
|
|
|
- @return The original string.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websEncode64(char *str);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Encode a block using base-64 encoding
|
|
|
|
- @description The string is encoded insitu.
|
|
|
|
- @param str String to encode.
|
|
|
|
- @param len Length of string to encode
|
|
|
|
- @return The original string.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websEncode64Block(char *str, ssize len);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Escape unsafe characters in a string
|
|
|
|
- @param str String to escape
|
|
|
|
- @return An allocated block containing the escaped string. Caller must free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websEscapeHtml(cchar *str);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Complete a request with an error response
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param code HTTP status code
|
|
|
|
- @param fmt Message printf style format
|
|
|
|
- @param ... Format args
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websError(Webs *wp, int code, cchar *fmt, ...);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get a message for a HTTP status code
|
|
|
|
- @param code HTTP status code
|
|
|
|
- @return Http status message. Caller must not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websErrorMsg(int code);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open and initialize the file handler
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websFileOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Flush buffered transmit data and compact the transmit buffer to make room for more data
|
|
|
|
- @description This call initiates sending buffered data. If blocking mode is selected via the block parameter,
|
|
|
|
- this call will wait until all the data has been sent to the O/S for transmission to the client.
|
|
|
|
- If block is false, the flush will be initiated and the call will return immediately without blocking.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param block Set to true to wait for all data to be written to the socket. Set to false to
|
|
|
|
- write whatever the socket can absorb without blocking.
|
|
|
|
- @return -1 for I/O errors. Return zero if there is more data remaining in the buffer. Return 1 if the
|
|
|
|
- contents of the transmit buffer are fully written and the buffer is now empty.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websFlush(Webs *wp, bool block);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Free the webs request object.
|
|
|
|
- @description Callers should call websDone to complete requests prior to invoking websFree.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websFree(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the background execution flag
|
|
|
|
- @description If GoAhead is invoked with --background, it will run as a daemon in the background.
|
|
|
|
- @return True if GoAhead is running in the background.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websGetBackground(void);
|
|
|
|
-
|
|
|
|
-#if ME_GOAHEAD_CGI
|
|
|
|
-/**
|
|
|
|
- Get a unique temporary filename for CGI communications
|
|
|
|
- @return Allocated filename string. Caller must free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websGetCgiCommName(void);
|
|
|
|
-#endif /* ME_GOAHEAD_CGI */
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request cookie if supplied
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Cookie string if defined, otherwise null. Caller must not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetCookie(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get a date as a string
|
|
|
|
- @description If sbuf is supplied, it is used to calculate the date. Otherwise, the current time is used.
|
|
|
|
- @param sbuf File info object
|
|
|
|
- @return An allocated date string. Caller should free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websGetDateString(WebsFileInfo *sbuf);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the debug flag
|
|
|
|
- @description If GoAhead is invoked with --debugger, the debug flag will be set to true
|
|
|
|
- @return True if GoAhead is running in debug mode.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websGetDebug(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the base file directory for a request
|
|
|
|
- @description Returns the request route directory if defined, otherwise returns the documents directory.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Path name string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetDir(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the GoAhead base documents directory
|
|
|
|
- @description The documents directory is defined at build time and may be overridden by the GoAhead command line.
|
|
|
|
- @return Path string for the documents directory.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websGetDocuments(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request EOF status
|
|
|
|
- @description The request EOF status is set to true when all the request body (POST|PUT) data has been received.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if all the request body data has been received.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websGetEof(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request URI extension
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return The URI filename extension component. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetExt(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request filename
|
|
|
|
- @description The URI is mapped to a filename by decoding and prepending with the request directory.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Filename string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetFilename(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request host
|
|
|
|
- @description The request host is set to the Host HTTP header value if it is present. Otherwise it is set to
|
|
|
|
- the request URI hostname.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Host string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetHost(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request interface address
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Network interface string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetIfaddr(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the default index document name
|
|
|
|
- @description The default index is "index.html" and can be updated via websSetIndex.
|
|
|
|
- @return Index name string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetIndex(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request method
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return HTTP method string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetMethod(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request password
|
|
|
|
- @description The request password may be encoded depending on the authentication scheme.
|
|
|
|
- See wp->encoded to test if it is encoded.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Password string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetPassword(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request path
|
|
|
|
- @description The URI path component excludes the http protocol, hostname, port, reference and query components.
|
|
|
|
- It always beings with "/".
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Request path string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetPath(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request TCP/IP port
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return TCP/IP Port integer
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websGetPort(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request HTTP protocol
|
|
|
|
- @description This will be set to either "http" or "https"
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Protocol string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetProtocol(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request query component
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Request query string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetQuery(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the server host name
|
|
|
|
- @return Host name string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetServer(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the server host name with port number.
|
|
|
|
- @return Host name string with port number. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetServerUrl(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the server IP address
|
|
|
|
- @return Server IP address string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetServerAddress(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the server IP address with port number
|
|
|
|
- @return Server IP:PORT address string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetServerAddressUrl(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request URI
|
|
|
|
- @description This returns the request URI. This may be modified if the request is rewritten via websRewrite
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return URI string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetUrl(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the client User-Agent HTTP header
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return User-Agent string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetUserAgent(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the request username
|
|
|
|
- @description If the request is authenticated, this call returns the username supplied during authentication.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Username string if defined, otherwise null. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetUsername(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get a request variable
|
|
|
|
- @description Request variables are defined for HTTP headers of the form HTTP_*.
|
|
|
|
- Some request handlers also define their own variables. For example: CGI environment variables.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param name Variable name
|
|
|
|
- @param defaultValue Default value to return if the variable is not defined
|
|
|
|
- @return Variable value string. Caller should not free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetVar(Webs *wp, cchar *name, cchar *defaultValue);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Listen on a TCP/IP address endpoint
|
|
|
|
- @description The URI is mapped to a filename by decoding and prepending with the request directory.
|
|
|
|
- For IPv6 addresses, use the format: [aaaa:bbbb:cccc:dddd:eeee:ffff:gggg:hhhh:iiii]:port.
|
|
|
|
- @param endpoint IPv4 or IPv6 address on which to listen.
|
|
|
|
- @return Positive integer holding a Socket ID handle if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websListen(cchar *endpoint);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get an MD5 digest of a string
|
|
|
|
- @param str String to analyze.
|
|
|
|
- @return Allocated MD5 checksum. Caller should free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websMD5(cchar *str);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get an MD5 digest of a block and optionally prepend a prefix.
|
|
|
|
- @param buf Block to analyze
|
|
|
|
- @param length Length of block
|
|
|
|
- @param prefix Optional prefix to prepend to the MD5 sum.
|
|
|
|
- @return Allocated MD5 checksum. Caller should free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websMD5Block(cchar *buf, ssize length, cchar *prefix);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Normalize a URI path
|
|
|
|
- @description This removes "./", "../" and redundant separators.
|
|
|
|
- @param path URI path to normalize
|
|
|
|
- @return An allocated normalized URI path. Caller must free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websNormalizeUriPath(cchar *path);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Take not of the request activity and mark the time.
|
|
|
|
- @description This is used to defer the request timeout whenever there is request I/O activity.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websNoteRequestActivity(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close the runtime code.
|
|
|
|
- @description Called from websClose
|
|
|
|
- @ingroup Webs
|
|
|
|
- @internal
|
|
|
|
- */
|
|
|
|
-PUBLIC void websRuntimeClose(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the runtime code.
|
|
|
|
- @description Called from websOpen
|
|
|
|
- @return Zero if successful
|
|
|
|
- @ingroup Webs
|
|
|
|
- @internal
|
|
|
|
- */
|
|
|
|
-PUBLIC int websRuntimeOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the web server
|
|
|
|
- @description This initializes the web server and defines the documents directory.
|
|
|
|
- @param documents Optional web documents directory. If set to null, the build time ME_GOAHEAD_DOCUMENTS value
|
|
|
|
- is used for the documents directory.
|
|
|
|
- @param routes Optional filename for a route configuration file to load. Additional route or
|
|
|
|
- authentication configuration files can be loaded via websLoad.
|
|
|
|
- @param routes Webs request object
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websOpen(cchar *documents, cchar *routes);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close the O/S dependent code.
|
|
|
|
- @description Called from websClose
|
|
|
|
- @ingroup Webs
|
|
|
|
- @internal
|
|
|
|
- */
|
|
|
|
-PUBLIC void websOsClose(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the O/S dependent code.
|
|
|
|
- @description Called from websOpen
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @internal
|
|
|
|
- */
|
|
|
|
-PUBLIC int websOsOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the web page document for the current request
|
|
|
|
- @param path Filename path to open
|
|
|
|
- @param flags File open flags
|
|
|
|
- @param mode Permissions mask
|
|
|
|
- @return Positive file handle if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websOpenFile(cchar *path, int flags, int mode);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the options handler
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websOptionsOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close the document page
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websPageClose(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Test if the document page for the request corresponds to a directory
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if the filename is a directory
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websPageIsDirectory(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open a web page document for a request
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param mode File open mode. Select from O_RDONLY and O_BINARY. Rom files systems ignore this argument.
|
|
|
|
- @param perms Ignored
|
|
|
|
- @return File handle if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websPageOpen(Webs *wp, int mode, int perms);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Read data from the request page document
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param buf Buffer for the read data
|
|
|
|
- @param size Size of buf
|
|
|
|
- @return Count of bytes read if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize websPageReadData(Webs *wp, char *buf, ssize size);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Seek to a position in the request page document
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param offset Offset of location in the file to seek to. This is relative to the specified origin.
|
|
|
|
- @param origin Set to SEEK_CUR, SEEK_SET or SEEK_END to position relative to the current position,
|
|
|
|
- beginning or end of the document.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websPageSeek(Webs *wp, Offset offset, int origin);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get file status for the current request document
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param sbuf File information structure to modify with file status
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websPageStat(Webs *wp, WebsFileInfo *sbuf);
|
|
|
|
-
|
|
|
|
-#if !ME_ROM
|
|
|
|
-/**
|
|
|
|
- Process request PUT body data
|
|
|
|
- @description This routine is called by the core HTTP engine to process request PUT data.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if processing the request can proceed.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websProcessPutData(Webs *wp);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Pump the state machine
|
|
|
|
- @description This routine will advance the connection state machine in response to events.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websPump(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Define an action callback for use with the action handler.
|
|
|
|
- @description The action handler binds a C function to a URI under "/action".
|
|
|
|
- @param name URI path suffix. This suffix is added to "/action" to form the bound URI path.
|
|
|
|
- @param fun Callback function. The signature is void (*WebsAction)(Webs *wp);
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websDefineAction(cchar *name, void *fun);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Read data from an open file
|
|
|
|
- @param fd Open file handle returned by websOpenFile
|
|
|
|
- @param buf Buffer for the read data
|
|
|
|
- @param size Size of buf
|
|
|
|
- @return Count of bytes read if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize websReadFile(int fd, char *buf, ssize size);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Read all the data from a file
|
|
|
|
- @param path File path to read from
|
|
|
|
- @return An allocated buffer containing the file data with an appended null. Caller must free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websReadWholeFile(cchar *path);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Redirect the client to a new URL.
|
|
|
|
- @description This creates a response to the client with a Location header directing the client to a new location.
|
|
|
|
- The response uses a 302 HTTP status code.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param url URL to direct the client to.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websRedirect(Webs *wp, cchar *url);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Redirect the client to a new URI
|
|
|
|
- @description The routing configuration file can define redirection routes for various HTTP status codes.
|
|
|
|
- This routine will utilize the appropriate route redirection based on the request route and specified status code.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param status HTTP status code to use in selecting the route redirection.
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websRedirectByStatus(Webs *wp, int status);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Create and send a request response
|
|
|
|
- @description This creates a response for the current request using the specified HTTP status code and
|
|
|
|
- the supplied message.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param status HTTP status code.
|
|
|
|
- @param msg Response message body
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websResponse(Webs *wp, int status, cchar *msg);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Rewrite a request
|
|
|
|
- @description Handlers may choose to not process a request but rather rewrite requests and then reroute.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param url New request URL.
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websRewriteRequest(Webs *wp, cchar *url);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the file system module
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websFsOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close the file system module
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websFsClose(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Seek to a position in the current request page document
|
|
|
|
- @param fd Open file handle returned by websOpenFile
|
|
|
|
- @param offset Location in the file to seek to.
|
|
|
|
- @param origin Set to SEEK_CUR, SEEK_SET or SEEK_END to position relative to the current position,
|
|
|
|
- beginning or end of the document.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC Offset websSeekFile(int fd, Offset offset, int origin);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get file status for a file
|
|
|
|
- @param path Filename path
|
|
|
|
- @param sbuf File information structure to modify with file status
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websStatFile(cchar *path, WebsFileInfo *sbuf);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- One line embedding API.
|
|
|
|
- @description This call will also open auth.txt and route.txt for authentication and routing configuration.
|
|
|
|
- @param endpoint IP:PORT address on which to listen
|
|
|
|
- @param documents Directory containing web documents to serve
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websServer(cchar *endpoint, cchar *documents);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Service I/O events until finished
|
|
|
|
- @description This will wait for socket events and service those until *finished is set to true
|
|
|
|
- @param finished Integer location to test. If set to true, then exit. Note: setting finished will not
|
|
|
|
- automatically wake up the service routine.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websServiceEvents(int *finished);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set the background processing flag
|
|
|
|
- @param on Value to set the background flag to.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @internal
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetBackground(int on);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Define a background write I/O event callback
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param proc Write callback
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetBackgroundWriter(Webs *wp, WebsWriteProc proc);
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Flags for websSetCookie
|
|
|
|
- */
|
|
|
|
-#define WEBS_COOKIE_SECURE 0x1 /**< Flag for websSetCookie for secure cookies (https only) */
|
|
|
|
-#define WEBS_COOKIE_HTTP 0x2 /**< Flag for websSetCookie for http cookies (http only) */
|
|
|
|
-#define WEBS_COOKIE_SAME_LAX 0x4 /**< Flag for websSetCookie for SameSite=Lax */
|
|
|
|
-#define WEBS_COOKIE_SAME_STRICT 0x8 /**< Flag for websSetCookie for SameSite=Strict */
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Define a cookie to include in the response
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param name Cookie name
|
|
|
|
- @param value Cookie value
|
|
|
|
- @param path URI path prefix applicable for this cookie
|
|
|
|
- @param domain Domain applicable for this cookie
|
|
|
|
- @param lifespan Cookie lifespan in seconds
|
|
|
|
- @param flags Set to WEBS_COOKIE_SECURE for https only. Set to WEBS_COOKIE_HTTP for http only.
|
|
|
|
- Otherwise the cookie applies to both http and https requests. Or in WEBS_COOKIE_SAME_LAX for SameSite=Lax
|
|
|
|
- and WEBS_COOKIE_SAME_STRICT for SameSite=Strict.
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetCookie(Webs *wp, cchar *name, cchar *value, cchar *path, cchar *domain, int lifespan, int flags);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set the debug processing flag
|
|
|
|
- @param on Value to set the debug flag to.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @internal
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetDebug(int on);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set the web documents directory
|
|
|
|
- @description The web documents directory is used when resolving request URIs into filenames.
|
|
|
|
- @param dir Directory path to use
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetDocuments(cchar *dir);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Create the CGI environment variables for the current request.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetEnv(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Create request variables for query and POST body data
|
|
|
|
- @description This creates request variables if the request is a POST form (has a Content-Type of
|
|
|
|
- application/x-www-form-urlencoded). The POST body data is consumed from the input buffer.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetFormVars(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Define the host name for the server
|
|
|
|
- @param host String host name
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetHost(cchar *host);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Define the host IP address
|
|
|
|
- @param ipaddr Host IP address
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetIpAddr(cchar *ipaddr);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Create and send a request response
|
|
|
|
- @description This creates a response for the current request using the specified HTTP status code and
|
|
|
|
- the supplied message.
|
|
|
|
- @param filename Web document name to use as the index. This should not contain any directory components.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetIndex(cchar *filename);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Create request variables for query string data
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetQueryVars(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set the response HTTP status code
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param status HTTP status code
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetStatus(Webs *wp, int status);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set the response body content length
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param length Length value to use
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetTxLength(Webs *wp, ssize length);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set a request variable to a formatted string value
|
|
|
|
- @description Request variables are defined for HTTP headers of the form HTTP_*.
|
|
|
|
- Some request handlers also define their own variables. For example: CGI environment variables.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param name Variable name to set
|
|
|
|
- @param fmt Value format string
|
|
|
|
- @param ... Args to format
|
|
|
|
- @return the allocated WebsKey
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Evolving
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsKey *websSetVarFmt(Webs *wp, cchar *name, cchar *fmt, ...);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set a request variable to a string value
|
|
|
|
- @description Request variables are defined for HTTP headers of the form HTTP_*.
|
|
|
|
- Some request handlers also define their own variables. For example: CGI environment variables.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param name Variable name to set
|
|
|
|
- @param value Value to set
|
|
|
|
- @return the allocated WebsKey
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Evolving
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsKey *websSetVar(Webs *wp, cchar *name, cchar *value);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Test if a request variable is defined
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param name Variable name
|
|
|
|
- @return True if the variable is defined
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websTestVar(Webs *wp, cchar *name);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Create a temporary filename
|
|
|
|
- This does not guarantee the filename is unique or that it is not already in use by another application.
|
|
|
|
- @param dir Directory to locate the temp file. Defaults to the O/S default temporary directory (usually /tmp)
|
|
|
|
- @param prefix Filename prefix
|
|
|
|
- @return An allocated filename string
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websTempFile(cchar *dir, cchar *prefix);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the date/time parsing module
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Evolving
|
|
|
|
- */
|
|
|
|
-PUBLIC int websTimeOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close the date/time parsing module
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Evolving
|
|
|
|
-*/
|
|
|
|
-PUBLIC void websTimeClose(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Parse a date/time string
|
|
|
|
- @description Try to intelligently parse a date.
|
|
|
|
- This is a tolerant parser. It is not validating and will do its best to parse any possible date string.
|
|
|
|
- Supports the following date/time formats:
|
|
|
|
- \n\n
|
|
|
|
- ISO dates: 2009-05-21t16:06:05.000z
|
|
|
|
- \n\n
|
|
|
|
- Date: 07/28/2014, 07/28/08, Jan/28/2014, Jaunuary-28-2014, 28-jan-2014.
|
|
|
|
- \n\n
|
|
|
|
- Support date order: dd/mm/yy, mm/dd/yy and yyyy/mm/dd
|
|
|
|
- \n\n
|
|
|
|
- Support separators "/", ".", "-"
|
|
|
|
- \n\n
|
|
|
|
- Timezones: GMT|UTC[+-]NN[:]NN
|
|
|
|
- \n\n
|
|
|
|
- Time: 10:52[:23]
|
|
|
|
- \n\n
|
|
|
|
- @param time Reference to a
|
|
|
|
- @param date Date/time string to parse
|
|
|
|
- @param defaults Optionally supply missing components for the date/time. Set to NULL if not used.
|
|
|
|
- @return Zero if successful, otherwise -1
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Evolving
|
|
|
|
- */
|
|
|
|
-PUBLIC int websParseDateTime(WebsTime *time, cchar *date, struct tm *defaults);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Parse a URL into its components
|
|
|
|
- @param url URL to parse
|
|
|
|
- @param buf Buffer to hold storage for various parsed components. Caller must free. NOTE: the parsed components may
|
|
|
|
- point to locations in this buffer.
|
|
|
|
- @param protocol Parsed URL protocol component
|
|
|
|
- @param host Parsed hostname
|
|
|
|
- @param port Parsed URL port
|
|
|
|
- @param path Parsed URL path component
|
|
|
|
- @param ext Parsed URL extension
|
|
|
|
- @param reference Parsed URL reference portion (\#reference)
|
|
|
|
- @param query Parsed URL query component
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Evolving
|
|
|
|
- */
|
|
|
|
-PUBLIC int websUrlParse(cchar *url, char **buf, char **protocol, char **host, char **port, char **path, char **ext,
|
|
|
|
- char **reference, char **query);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Test if a webs object is valid
|
|
|
|
- @description After calling websDone, the websFree routine will have been called and the memory for the webs object
|
|
|
|
- will be released. Call websValid to test a Webs object for validity.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if the webs object is still valid and the request has not been completed.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websValid(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Validate a URI path as expected in a HTTP request line
|
|
|
|
- @description This expects a URI beginning with "/" and containing only valid URI characters.
|
|
|
|
- The URI is decoded, and normalized removing "../" and "." segments.
|
|
|
|
- The URI must begin with a "/" both before and after decoding and normalization.
|
|
|
|
- @param uri URI to validate.
|
|
|
|
- @return A validated, normalized URI path. Caller must free.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websValidateUriPath(cchar *uri);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Test if a URI is using only valid characters
|
|
|
|
- Note this does not test if the URI is fully legal. Some components of the URI have restricted character sets
|
|
|
|
- that this routine does not test. This tests if the URI has only characters valid to use in a URI before decoding.
|
|
|
|
- i.e. It will permit %NN encodings. The set of valid characters is:
|
|
|
|
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=%"
|
|
|
|
- @param uri Uri to test
|
|
|
|
- @return True if the URI string is comprised of legal URI characters.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Evolving
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websValidUriChars(cchar *uri);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Write a set of standard response headers
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param contentLength Value for the Content-Length header which describes the length of the response body
|
|
|
|
- @param redirect Value for the Location header which redirects the client to a new URL.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @see websSetStatus
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websWriteHeaders(Webs *wp, ssize contentLength, cchar *redirect);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Signify the end of the response headers
|
|
|
|
- @description This call concludes the response headers and writes a blank line to the response.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websWriteEndHeaders(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Write a response header
|
|
|
|
- @description This routine writes a response header. It should be invoked after calling websWriteHeaders
|
|
|
|
- to write the standard headers and before websWriteEndHeaders.
|
|
|
|
- This routine differs from websWrite in that it traces header values to the log.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param key Header key value
|
|
|
|
- @param fmt Header value format string.
|
|
|
|
- @param ... Arguments to the format string.
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websWriteHeader(Webs *wp, cchar *key, cchar *fmt, ...);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Write data to the response
|
|
|
|
- @description The data is buffered and will be sent to the client when the buffer is full or websFlush is
|
|
|
|
- called.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param fmt Printf style format string.
|
|
|
|
- @param ... Arguments to the format string.
|
|
|
|
- @return Count of bytes written
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize websWrite(Webs *wp, cchar *fmt, ...);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Write data to the open file
|
|
|
|
- @param fd Open file handle returned by websOpenFile
|
|
|
|
- @param buf Buffer for the read data
|
|
|
|
- @param size Size of buf
|
|
|
|
- @return Count of bytes read if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize websWriteFile(int fd, cchar *buf, ssize size);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Write a block of data to the response
|
|
|
|
- @description The data is buffered and will be sent to the client when the buffer is full or websFlush is
|
|
|
|
- called. This routine will never return "short", it will always write all the data unless there are errors.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param buf Buffer of data to write
|
|
|
|
- @param size Length of buf
|
|
|
|
- @return Count of bytes written or -1. This will always equal size if there are no errors.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize websWriteBlock(Webs *wp, cchar *buf, ssize size);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Write a block of data to the network
|
|
|
|
- @description This bypassed output buffering and is the lowest level write.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param buf Buffer of data to write
|
|
|
|
- @param size Length of buf
|
|
|
|
- @return Count of bytes written. May be less than len if the socket is in non-blocking mode.
|
|
|
|
- Returns -1 for errors and if the socket cannot absorb any more data. If the transport is saturated,
|
|
|
|
- will return a negative error and errno will be set to EAGAIN or EWOULDBLOCK.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize websWriteSocket(Webs *wp, cchar *buf, ssize size);
|
|
|
|
-
|
|
|
|
-#if ME_GOAHEAD_UPLOAD
|
|
|
|
-/**
|
|
|
|
- Process upload data for form, multipart mime file upload.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if processing the request can proceed.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websProcessUploadData(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Free file upload data structures.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websFreeUpload(Webs *wp);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#if ME_GOAHEAD_CGI
|
|
|
|
-/**
|
|
|
|
- Process CGI request body data.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if processing the request can proceed.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websProcessCgiData(Webs *wp);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/************************************** Crypto ********************************/
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get some random data
|
|
|
|
- @param buf Reference to a buffer to hold the random data
|
|
|
|
- @param length Size of the buffer
|
|
|
|
- @param block Set to true if it is acceptable to block while accumulating entropy sufficient to provide good
|
|
|
|
- random data. Setting to false will cause this API to not block and may return random data of a lower quality.
|
|
|
|
- @ingroup Crypto
|
|
|
|
- @stability Prototype.
|
|
|
|
- */
|
|
|
|
-PUBLIC int websGetRandomBytes(char *buf, ssize length, bool block);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Encrypt a password using the Blowfish algorithm
|
|
|
|
- @param password User's password to encrypt
|
|
|
|
- @param salt Salt text to add to password. Helps to make each user's password unique.
|
|
|
|
- @param rounds Number of times to encrypt. More times, makes the routine slower and passwords harder to crack.
|
|
|
|
- @return The encrypted password.
|
|
|
|
- @ingroup Crypto
|
|
|
|
- @stability Prototype
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websCryptPassword(cchar *password, cchar *salt, int rounds);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Make salt for adding to a password.
|
|
|
|
- @param size Size in bytes of the salt text.
|
|
|
|
- @return The random salt text. Caller must free.
|
|
|
|
- @ingroup Crypto
|
|
|
|
- @stability Prototype
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websMakeSalt(ssize size);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Make a password hash for a plain-text password using the Blowfish algorithm.
|
|
|
|
- @param password User's password to encrypt
|
|
|
|
- @param saltLength Length of salt text to add to password. Helps to make each user's password unique.
|
|
|
|
- @param rounds Number of times to encrypt. More times, makes the routine slower and passwords harder to crack.
|
|
|
|
- @return The encrypted password. Caller must free.
|
|
|
|
- @ingroup Crypto
|
|
|
|
- @stability Prototype
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websMakePassword(cchar *password, int saltLength, int rounds);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Check a plain-text password against the defined hashed password.
|
|
|
|
- @param plainTextPassword User's plain-text-password to check
|
|
|
|
- @param passwordHash Required password in hashed format previously computed by websMakePassword.
|
|
|
|
- @return True if the password is correct.
|
|
|
|
- @ingroup Crypto
|
|
|
|
- @stability Prototype
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websCheckPassword(cchar *plainTextPassword, cchar *passwordHash);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get a password from the terminal console
|
|
|
|
- @param prompt Text prompt to display before reading the password
|
|
|
|
- @return The entered password. Caller must free.
|
|
|
|
- @ingroup Crypto
|
|
|
|
- @stability Prototype
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websReadPassword(cchar *prompt);
|
|
|
|
-
|
|
|
|
-/*************************************** JST ***********************************/
|
|
|
|
-
|
|
|
|
-#if ME_GOAHEAD_JAVASCRIPT
|
|
|
|
-/**
|
|
|
|
- Javascript native function
|
|
|
|
- @param jid JavaScript engine ID
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param argc Count of function arguments
|
|
|
|
- @param argv Array of function arguments
|
|
|
|
- @param defaultValue Default value to return if the variable is not defined
|
|
|
|
- @return Return zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef int (*WebsJstProc)(int jid, Webs *wp, int argc, char **argv);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Define a Javscript native function.
|
|
|
|
- @description This routine binds a C function to a Javascript function. When the Javascript function is called,
|
|
|
|
- the C function is invoked.
|
|
|
|
- @param name Javascript function name
|
|
|
|
- @param fn C function to invoke
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websDefineJst(cchar *name, WebsJstProc fn);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the Javascript module.
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websJstOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Write data to the response
|
|
|
|
- @param jid Javascript ID handle
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param argc Count of arguments
|
|
|
|
- @param argv Array arguments
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websJstWrite(int jid, Webs *wp, int argc, char **argv);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/*************************************** SSL ***********************************/
|
|
|
|
-
|
|
|
|
-#if ME_COM_SSL
|
|
|
|
-/*
|
|
|
|
- Default MakeMe settings
|
|
|
|
- */
|
|
|
|
-#ifndef ME_GOAHEAD_SSL_AUTHORITY
|
|
|
|
- #define ME_GOAHEAD_SSL_AUTHORITY ""
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_SSL_CACHE
|
|
|
|
- #define ME_GOAHEAD_SSL_CACHE 512
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_SSL_CERTIFICATE
|
|
|
|
- #define ME_GOAHEAD_SSL_CERTIFICATE ""
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_SSL_CIPHERS
|
|
|
|
- #define ME_GOAHEAD_SSL_CIPHERS ""
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_SSL_KEY
|
|
|
|
- #define ME_GOAHEAD_SSL_KEY ""
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_SSL_LOG_LEVEL
|
|
|
|
- #define ME_GOAHEAD_SSL_LOG_LEVEL 4
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_SSL_RENEGOTIATE
|
|
|
|
- #define ME_GOAHEAD_SSL_RENEGOTIATE 1
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_SSL_REVOKE
|
|
|
|
- #define ME_GOAHEAD_SSL_REVOKE ""
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_SSL_TICKET
|
|
|
|
- #define ME_GOAHEAD_SSL_TICKET 1
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_SSL_TIMEOUT
|
|
|
|
- #define ME_GOAHEAD_SSL_TIMEOUT 86400
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_SSL_VERIFY
|
|
|
|
- #define ME_GOAHEAD_SSL_VERIFY 0
|
|
|
|
-#endif
|
|
|
|
-#ifndef ME_GOAHEAD_SSL_VERIFY_ISSUER
|
|
|
|
- #define ME_GOAHEAD_SSL_VERIFY_ISSUER 0
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the ssl module
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int sslOpen(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close the ssl module
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void sslClose(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Free a ssl connection associated with a request
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void sslFree(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Upgrade a request connection to utilize SSL
|
|
|
|
- @description This routine is invoked on a connection received on a secure listening socket
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int sslUpgrade(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Read data from a secure socket
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param buf Buffer into which to read data
|
|
|
|
- @param len Size of buf
|
|
|
|
- @return Count of bytes read if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize sslRead(Webs *wp, void *buf, ssize len);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- WRite data to a secure socket
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param buf Buffer from which to write data
|
|
|
|
- @param len Size of buf
|
|
|
|
- @return Count of bytes written if successful, otherwise -1.
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC ssize sslWrite(Webs *wp, void *buf, ssize len);
|
|
|
|
-#endif /* ME_COM_SSL */
|
|
|
|
-
|
|
|
|
-/*************************************** Route *********************************/
|
|
|
|
-/**
|
|
|
|
- Callback to prompt the user for their password
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef void (*WebsAskLogin)(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Callback to verify the username and password
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if the password is verified
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef bool (*WebsVerify)(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Callback to parse authentication details submitted with the web request
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if the details can be parsed
|
|
|
|
- @ingroup Webs
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef bool (*WebsParseAuth)(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Request route structure
|
|
|
|
- @defgroup WebsRoute WebsRoute
|
|
|
|
- */
|
|
|
|
-typedef struct WebsRoute {
|
|
|
|
- char *prefix; /**< Route path prefix */
|
|
|
|
- ssize prefixLen; /**< Prefix length */
|
|
|
|
- char *dir; /**< Filesystem base directory for route documents */
|
|
|
|
- char *protocol; /**< HTTP protocol to use for this route */
|
|
|
|
- char *authType; /**< Authentication type */
|
|
|
|
- WebsHandler *handler; /**< Request handler to service requests */
|
|
|
|
- WebsHash abilities; /**< Required user abilities */
|
|
|
|
- WebsHash extensions; /**< Permissible URI extensions */
|
|
|
|
- WebsHash redirects; /**< Response redirections */
|
|
|
|
- WebsHash methods; /**< Supported HTTP methods */
|
|
|
|
- WebsAskLogin askLogin; /**< Route path prefix */
|
|
|
|
- WebsParseAuth parseAuth; /**< Parse authentication details callback*/
|
|
|
|
- WebsVerify verify; /**< Verify password callback */
|
|
|
|
- int flags; /**< Route control flags */
|
|
|
|
-} WebsRoute;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Add a route to the routing tables
|
|
|
|
- @param uri Matching URI prefix
|
|
|
|
- @param handler Request handler to service routed requests
|
|
|
|
- @param pos Position in the list of routes. Zero inserts at the front of the list. A value of -1 will append to the
|
|
|
|
- end of the list.
|
|
|
|
- @return A route object
|
|
|
|
- @ingroup WebsRoute
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsRoute *websAddRoute(cchar *uri, cchar *handler, int pos);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close the route module
|
|
|
|
- @ingroup WebsRoute
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websCloseRoute(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Load routing tables from the specified filename
|
|
|
|
- @param path Route configuration filename
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup WebsRoute
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websLoad(cchar *path);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the routing module
|
|
|
|
- @ingroup WebsRoute
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websOpenRoute(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Remove a route from the routing tables
|
|
|
|
- @param uri Matching URI prefix
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup WebsRoute
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websRemoveRoute(cchar *uri);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Route a request
|
|
|
|
- @description This routine will select a matching route and will invoke the selected route handler to service
|
|
|
|
- the request. In the process, authentication and request rewriting may take place.
|
|
|
|
- This routine is called internally by the request pipeline.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup WebsRoute
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websRouteRequest(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Run a request handler
|
|
|
|
- @description This routine will run the handler and route selected by #websRouteRequest.
|
|
|
|
- This routine is called internally by the request pipeline.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if the handler serviced the request. Return false to test other routes to handle this request.
|
|
|
|
- This is for legacy handlers that do not have a match callback.
|
|
|
|
- @ingroup WebsRoute
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websRunRequest(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Configure a route by adding matching criteria
|
|
|
|
- @param route Route to modify
|
|
|
|
- @param dir Set the route documents directory filename
|
|
|
|
- @param protocol Set the matching HTTP protocol (http or https)
|
|
|
|
- @param methods Hash of permissible HTTP methods. (GET, HEAD, POST, PUT)
|
|
|
|
- @param extensions Hash of permissible URI filename extensions.
|
|
|
|
- @param abilities Required user abilities. The user must be authenticated.
|
|
|
|
- @param abilities Required user abilities. If abilities are required, the user must be authenticated.
|
|
|
|
- @param redirects Set of applicable response redirections when completing the request.
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup WebsRoute
|
|
|
|
- @stability Evolving
|
|
|
|
- */
|
|
|
|
-PUBLIC int websSetRouteMatch(WebsRoute *route, cchar *dir, cchar *protocol, WebsHash methods, WebsHash extensions,
|
|
|
|
- WebsHash abilities, WebsHash redirects);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set route authentication scheme
|
|
|
|
- @param route Route to modify
|
|
|
|
- @param authType Set to "basic", "digest" or "form".
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup WebsRoute
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websSetRouteAuth(WebsRoute *route, cchar *authType);
|
|
|
|
-
|
|
|
|
-/*************************************** Auth **********************************/
|
|
|
|
-#if ME_GOAHEAD_AUTH
|
|
|
|
-
|
|
|
|
-#define WEBS_USIZE 128 /* Size of realm:username */
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- GoAhead Authentication
|
|
|
|
- @defgroup WebsAuth WebsAuth
|
|
|
|
- */
|
|
|
|
-/**
|
|
|
|
- User definition structure
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef struct WebsUser {
|
|
|
|
- char *name; /**< User name */
|
|
|
|
- char *password; /**< User password (encrypted) */
|
|
|
|
- char *roles; /**< User roles */
|
|
|
|
- WebsHash abilities; /**< Resolved user abilities */
|
|
|
|
-} WebsUser;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Role definition structure
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-typedef struct WebsRole {
|
|
|
|
- WebsHash abilities; /**< Resolved role abilities */
|
|
|
|
-} WebsRole;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Add a role
|
|
|
|
- @description The role is added to the list of roles
|
|
|
|
- @param role Role name
|
|
|
|
- @param abilities Hash of abilities for the role
|
|
|
|
- @return The allocated role.
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsRole *websAddRole(cchar *role, WebsHash abilities);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Add a user
|
|
|
|
- @description The user is added to the list of users
|
|
|
|
- @param username User name
|
|
|
|
- @param password User password (encrypted)
|
|
|
|
- @param roles Space separated list of roles. This may also contain abilities.
|
|
|
|
- @return User object.
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsUser *websAddUser(cchar *username, cchar *password, cchar *roles);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Authenticate a user
|
|
|
|
- @description The user is authenticated if required by the selected request route.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if the route does not require authentication or the user is authenticated successfully.
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websAuthenticate(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Test if a user possesses the required ability
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param ability Set of required abilities.
|
|
|
|
- @return True if the user has the required ability.
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websCan(Webs *wp, WebsHash ability);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Close the authentication module
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websCloseAuth(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Compute the abilities for all users by resolving roles into abilities
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websComputeAllUserAbilities(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set the password store verify callback
|
|
|
|
- @return verify WebsVerify callback function
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsVerify websGetPasswordStoreVerify(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the roles hash
|
|
|
|
- @return The roles hash object
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsHash websGetRoles(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the users hash
|
|
|
|
- @return The users hash object
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsHash websGetUsers(void);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Login a user by verifying the login credentials.
|
|
|
|
- @description This may be called by handlers to manually authenticate a user.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param username User name
|
|
|
|
- @param password User password (encrypted)
|
|
|
|
- @return True if the user can be authenticated.
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websLoginUser(Webs *wp, cchar *username, cchar *password);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Logout a user and remove the user login session.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if successful.
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websLogoutUser(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Lookup if a user exists
|
|
|
|
- @param username User name to search for
|
|
|
|
- @return User object or null if the user cannot be found
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsUser *websLookupUser(cchar *username);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Remove a role from the system
|
|
|
|
- @param role Role name
|
|
|
|
- @return Zero if successful, otherwise -1
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websRemoveRole(cchar *role);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Remove a user from the system
|
|
|
|
- @param name User name
|
|
|
|
- @return Zero if successful, otherwise -1
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websRemoveUser(cchar *name);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Open the authentication module
|
|
|
|
- @param minimal Reserved. Set to zero.
|
|
|
|
- @return True if the user has the required ability.
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websOpenAuth(int minimal);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set the password store verify callback
|
|
|
|
- @param verify WebsVerify callback function
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websSetPasswordStoreVerify(WebsVerify verify);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set a password for the user
|
|
|
|
- @param username User name
|
|
|
|
- @param password Null terminated password string
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websSetUserPassword(cchar *username, cchar *password);
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Define the set of roles for a user
|
|
|
|
- @param username User name
|
|
|
|
- @param roles Space separated list of roles or abilities
|
|
|
|
- @return Zero if successful, otherwise -1.
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websSetUserRoles(cchar *username, cchar *roles);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- User password verification routine from a custom password back-end store.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if the user password verifies.
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websVerifyPasswordFromCustom(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- User password verification routine from auth.txt
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if the user password verifies.
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websVerifyPasswordFromFile(Webs *wp);
|
|
|
|
-
|
|
|
|
-#if ME_COMPILER_HAS_PAM
|
|
|
|
-/**
|
|
|
|
- Verify a password using the system PAM password database.
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return True if the user password verifies.
|
|
|
|
- @ingroup WebsAuth
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC bool websVerifyPasswordFromPam(Webs *wp);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#endif /* ME_GOAHEAD_AUTH */
|
|
|
|
-/************************************** Sessions *******************************/
|
|
|
|
-/**
|
|
|
|
- Session state storage
|
|
|
|
- @defgroup WebsSession WebsSession
|
|
|
|
- */
|
|
|
|
-typedef struct WebsSession {
|
|
|
|
- char *id; /**< Session ID key */
|
|
|
|
- int lifespan; /**< Session inactivity timeout (secs) */
|
|
|
|
- WebsTime expires; /**< When the session expires */
|
|
|
|
- WebsHash cache; /**< Cache of session variables */
|
|
|
|
-} WebsSession;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Test if a user possesses the required ability
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param id Session ID to use. Set to null to allocate a new session ID.
|
|
|
|
- @param lifespan Lifespan of the session in seconds.
|
|
|
|
- @return Allocated session object
|
|
|
|
- @ingroup WebsSession
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsSession *websAllocSession(Webs *wp, cchar *id, int lifespan);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Test if a user possesses the required ability
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return Allocated session object
|
|
|
|
- @ingroup WebsSession
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsSession *websCreateSession(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Destroy the webs session object
|
|
|
|
- @description Useful to be called as part of the user logout process
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @ingroup WebsSession
|
|
|
|
- @stability Prototype
|
|
|
|
- */
|
|
|
|
-PUBLIC void websDestroySession(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the session ID
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @return The session ID if session state storage is defined for this request. Caller must free.
|
|
|
|
- @ingroup WebsSession
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC char *websGetSessionID(Webs *wp);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get the session state object for the current request
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param create Set to true to create a new session if one does not already exist.
|
|
|
|
- @return Session object
|
|
|
|
- @ingroup WebsSession
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC WebsSession *websGetSession(Webs *wp, int create);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Get a session variable
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param name Session variable name
|
|
|
|
- @param defaultValue Default value to return if the variable does not exist
|
|
|
|
- @return Session variable value or default value if it does not exist
|
|
|
|
- @ingroup WebsSession
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC cchar *websGetSessionVar(Webs *wp, cchar *name, cchar *defaultValue);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Remove a session variable
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param name Session variable name
|
|
|
|
- @ingroup WebsSession
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC void websRemoveSessionVar(Webs *wp, cchar *name);
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- Set a session variable name value
|
|
|
|
- @param wp Webs request object
|
|
|
|
- @param name Session variable name
|
|
|
|
- @param value Value to set the variable to
|
|
|
|
- @return Zero if successful, otherwise -1
|
|
|
|
- @ingroup WebsSession
|
|
|
|
- @stability Stable
|
|
|
|
- */
|
|
|
|
-PUBLIC int websSetSessionVar(Webs *wp, cchar *name, cchar *value);
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-////////////////////////////////////add by lusa///////////////////////////
|
|
|
|
-PUBLIC void personInfoAction(Webs *wp);
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-PUBLIC void actionTest(Webs *wp);
|
|
|
|
-
|
|
|
|
-PUBLIC void buy(Webs *wp);
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-////////////////////////////////end/////////////////
|
|
|
|
-/************************************ Legacy **********************************/
|
|
|
|
-/*
|
|
|
|
- Legacy mappings for pre GoAhead 3.X applications
|
|
|
|
- This is a list of the name changes from GoAhead 2.X to GoAhead 3.x
|
|
|
|
- To maximize forward compatibility, It is best to not use ME_GOAHEAD_LEGACY except as
|
|
|
|
- a transitional compilation aid.
|
|
|
|
- */
|
|
|
|
-#if ME_GOAHEAD_LEGACY
|
|
|
|
- #define B_L 0
|
|
|
|
- #define a_assert assert
|
|
|
|
- #define balloc walloc
|
|
|
|
- #define bclose wcloseAlloc
|
|
|
|
- #define bfree(loc, p) wfree(p)
|
|
|
|
- #define bfreeSafe(loc, p) wfree(p)
|
|
|
|
- #define bopen wopenAlloc
|
|
|
|
- #define brealloc wrealloc
|
|
|
|
- #define bstrdup sclone
|
|
|
|
- #define emfReschedCallback websRestartEvent
|
|
|
|
- #define emfSchedCallback websStartEvent
|
|
|
|
- #define emfSchedProc WebsEventProc
|
|
|
|
- #define emfSchedProcess websRunEvents
|
|
|
|
- #define emfUnschedCallback websStopEvent
|
|
|
|
- #define fmtStatic fmt
|
|
|
|
- #define gassert assert
|
|
|
|
- #define galloc walloc
|
|
|
|
- #define gallocEntry wallocObject
|
|
|
|
- #define gfree wfree
|
|
|
|
- #define gFree wfreeHandle
|
|
|
|
- #define grealloc wrealloc
|
|
|
|
- #define gaccess access
|
|
|
|
- #define gasctime asctime
|
|
|
|
- #define gatoi atoi
|
|
|
|
- #define gchmod chmod
|
|
|
|
- #define wclose close
|
|
|
|
- #define wclosedir closedir
|
|
|
|
- #define gcreat creat
|
|
|
|
- #define gctime ctime
|
|
|
|
- #define gexecvp execvp
|
|
|
|
- #define gfgets fgets
|
|
|
|
- #define gfindclose _findclose
|
|
|
|
- #define gfinddata_t _finddata_t
|
|
|
|
- #define gfindfirst _findfirst
|
|
|
|
- #define gfindnext _findnext
|
|
|
|
- #define gfopen fopen
|
|
|
|
- #define gfprintf fprintf
|
|
|
|
- #define gfputs fputs
|
|
|
|
- #define gfscanf fscanf
|
|
|
|
- #define ggetcwd getcwd
|
|
|
|
- #define ggetenv getenv
|
|
|
|
- #define ggets gets
|
|
|
|
- #define gisalnum isalnum
|
|
|
|
- #define gisalpha isalpha
|
|
|
|
- #define gisdigit isdigit
|
|
|
|
- #define gislower islower
|
|
|
|
- #define gisspace isspace
|
|
|
|
- #define gisupper isupper
|
|
|
|
- #define gisxdigit isxdigit
|
|
|
|
- #define gloadModule loadModule
|
|
|
|
- #define glseek lseek
|
|
|
|
- #define gopendir opendir
|
|
|
|
- #define gprintf printf
|
|
|
|
- #define gread read
|
|
|
|
- #define greaddir readdir
|
|
|
|
- #define gremove remove
|
|
|
|
- #define grename rename
|
|
|
|
- #define gsprintf sprintf
|
|
|
|
- #define gsscanf sscanf
|
|
|
|
- #define gstat stat
|
|
|
|
- #define gstrcat strcat
|
|
|
|
- #define gstrchr strchr
|
|
|
|
- #define gstrcmp strcmp
|
|
|
|
- #define gstrcpy strcpy
|
|
|
|
- #define gstrcspn strcspn
|
|
|
|
- #define gstricmp strcmpci
|
|
|
|
- #define gstritoa stritoa
|
|
|
|
- #define gstrlen strlen
|
|
|
|
- #define gstrlower strlower
|
|
|
|
- #define gstrncat strncat
|
|
|
|
- #define gstrncmp strncmp
|
|
|
|
- #define gstrncpy strncpy
|
|
|
|
- #define gstrnlen strnlen
|
|
|
|
- #define gstrnset strnset
|
|
|
|
- #define gstrrchr strrchr
|
|
|
|
- #define gstrspn strspn
|
|
|
|
- #define gstrstr strstr
|
|
|
|
- #define gstrtok strtok
|
|
|
|
- #define gstrtol strtol
|
|
|
|
- #define gstrupper strupper
|
|
|
|
- #define gtempnam websTempFile
|
|
|
|
- #define gtolower tolower
|
|
|
|
- #define gtoupper toupper
|
|
|
|
- #define gunlink unlink
|
|
|
|
- #define gvsprintf vsprintf
|
|
|
|
- #define gwrite write
|
|
|
|
- #define hAlloc wallocHandle
|
|
|
|
- #define hAllocEntry wallocObject
|
|
|
|
- #define hFree wfreeHandle
|
|
|
|
- #define stritoa gstritoa
|
|
|
|
- #define strlower gstrlower
|
|
|
|
- #define strupper gstrupper
|
|
|
|
- #define websAspDefine websDefineJst
|
|
|
|
- #define websAspOpen websJstOpen
|
|
|
|
- #define websAspRequest websJstRequest
|
|
|
|
- #define websFormDefine websDefineAction
|
|
|
|
- #define websGetDefaultDir websGetDocuments
|
|
|
|
- #define websGetDefaultPage websGetIndex
|
|
|
|
-
|
|
|
|
- #define websGetRequestDir(wp) wp->dir
|
|
|
|
- #define websGetRequestIpAddr(wp) wp->ipaddr
|
|
|
|
- #define websGetRequestFilename(wp) wp->filename
|
|
|
|
- #define websGetRequestFlags(wp) wp->flags
|
|
|
|
- #define websGetRequestLpath(wp) wp->filename
|
|
|
|
- #define websGetRequestPath(wp) wp->path
|
|
|
|
- #define websGetRequestPassword(wp) wp->password
|
|
|
|
- #define websGetRequestUserName(wp) wp->username
|
|
|
|
- #define websGetRequestWritten(wp) wp->written
|
|
|
|
-
|
|
|
|
- #define websSetDefaultDir websSetDocuments
|
|
|
|
- #define websSetDefaultPage websSetIndex
|
|
|
|
- #define websSetRequestLpath websSetRequestFilename
|
|
|
|
- #define websSetRequestWritten(wp, nbytes) if (1) { wp->written = nbytes; } else {}
|
|
|
|
- #define websTimeoutCancel websCancelTimeout
|
|
|
|
- #define websWriteDataNonBlock websWriteRaw
|
|
|
|
-
|
|
|
|
- #define ringqOpen bufCreate
|
|
|
|
- #define ringqClose bufFree
|
|
|
|
- #define ringqLen bufLen
|
|
|
|
- #define ringqPutc bufPutc
|
|
|
|
- #define ringqInsertc bufInsertc
|
|
|
|
- #define ringqPutStr bufPutStr
|
|
|
|
- #define ringqGetc bufGetc
|
|
|
|
- #define ringqGrow bufGrow
|
|
|
|
- #define ringqPutBlk bufPutBlk
|
|
|
|
- #define ringqPutBlkMax bufRoom
|
|
|
|
- #define ringqPutBlkAdj bufAdjustEnd
|
|
|
|
- #define ringqGetBlk bufGetBlk
|
|
|
|
- #define ringqGetBlkMax bufGetBlkMax
|
|
|
|
- #define ringqGetBlkAdj bufAdjustSTart
|
|
|
|
- #define ringqFlush bufFlush
|
|
|
|
- #define ringqCompact bufCompact
|
|
|
|
- #define ringqReset bufReset
|
|
|
|
- #define ringqAddNull bufAddNull
|
|
|
|
-
|
|
|
|
- #define symCreate hashCreate
|
|
|
|
- #define symClose hashFree
|
|
|
|
- #define symLookup hashLookup
|
|
|
|
- #define symEnter hashEnter
|
|
|
|
- #define symDelete hashDelete
|
|
|
|
- #define symWalk hashWalk
|
|
|
|
- #define symFirst hashFirst
|
|
|
|
- #define symNext hashNext
|
|
|
|
-
|
|
|
|
- typedef Webs *webs_t;
|
|
|
|
- typedef Webs WebsRec;
|
|
|
|
- typedef Webs websType;
|
|
|
|
- typedef WebsBuf ringq_t;
|
|
|
|
- typedef WebsError websErrorType;
|
|
|
|
- typedef WebsProc WebsFormProc;
|
|
|
|
- typedef int (*WebsLegacyHandlerProc)(Webs *wp, char *prefix, char *dir, int flags);
|
|
|
|
- typedef SocketHandler socketHandler_t;
|
|
|
|
- typedef SocketAccept socketAccept_t;
|
|
|
|
- typedef WebsType vtype_t;
|
|
|
|
-
|
|
|
|
- typedef WebsHash sym_fd_t;
|
|
|
|
- typedef WebsKey sym_t;
|
|
|
|
- typedef WebsMime websMimeType;
|
|
|
|
- typedef WebsSocket socket_t;
|
|
|
|
- typedef WebsStat gstat_t;
|
|
|
|
- typedef WebsValue value_t;
|
|
|
|
-
|
|
|
|
- PUBLIC int fmtValloc(char **s, int n, cchar *fmt, va_list arg);
|
|
|
|
- PUBLIC int fmtAlloc(char **s, int n, cchar *fmt, ...);
|
|
|
|
- PUBLIC void websFooter(Webs *wp);
|
|
|
|
- PUBLIC void websHeader(Webs *wp);
|
|
|
|
- PUBLIC int websPublish(cchar *prefix, cchar *path);
|
|
|
|
- PUBLIC void websSetRequestFilename(Webs *wp, cchar *filename);
|
|
|
|
- PUBLIC int websUrlHandlerDefine(cchar *prefix, cchar *dir, int arg, WebsLegacyHandlerProc handler, int flags);
|
|
|
|
-
|
|
|
|
-#if ME_ROM
|
|
|
|
- typedef WebsRomIndex websRomIndexType;
|
|
|
|
-#endif
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#if ME_CUSTOMIZE
|
|
|
|
- #include "customize.h"
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#ifdef __cplusplus
|
|
|
|
-}
|
|
|
|
-#endif
|
|
|
|
-#endif /* _h_GOAHEAD */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- Copyright (c) Embedthis Software. All Rights Reserved.
|
|
|
|
- This software is distributed under commercial and open source licenses.
|
|
|
|
- You may use the Embedthis GoAhead open source license or you may acquire
|
|
|
|
- a commercial license from Embedthis Software. You agree to be fully bound
|
|
|
|
- by the terms of either license. Consult the LICENSE.md distributed with
|
|
|
|
- this software for full details and other copyrights.
|
|
|
|
- */
|
|
|