Unit WSAPI

Classes

Functions

bind_wsapi - ========================= SERVER_EXPORTED FUNCTIONS ========================= // // Version binding // TESTED: BOOL bind_wsapi(WORD major, WORD minor, BOOL strict);
close_form_decoder - TESTED: void close_form_decoder(FORM_CTX ctx, TCTX *TP);
construct_url - Other URL operations // UNTESTED: void construct_url(char *d, char *s, TCTX *tp);
DbgDump - UNTESTED: void DbgDump (BYTE *buf, WORD len, char *label);
decode_next_field - TESTED: PFIELD decode_next_field(FORM_CTX ctx, TCTX *tp);
die - HTTP error handler (use above result code #defs) // TESTED: void die(int http_status, char *string, TCTX *tp);
do_imagemap - UNTESTED: void do_imagemap(int method, char *map_name, char *coords, TCTX *tp);
escape_url - UNTESTED: void escape_url(char *url, TCTX *tp);
evaluate_access - UNTESTED: void evaluate_access(char *url, TCTX *tp);
exec_cgi - Response // UNTESTED: void exec_cgi(char *m, char *file, char *args, int intfc, TCTX *tp);
exec_cgi_to_file - UNTESTED: void exec_cgi_to_file(char *m, char *file, char *args, int intfc, TCTX *tp);
file_to_url - UNTESTED: void file_to_url(char *pathname, TCTX *tp);
get_content_type - Content type // UNTESTED: char *get_content_type(char *fn, TCTX *tp);
get_server_variable - UNTESTED: BOOL get_server_variable(char *name, char *buf, DWORD size, TCTX *tp);
get_temp_name - UNTESTED: void get_temp_name(char *buf);
http_nt_timestr - UNCONVERTED: char *http_timestr(time_t t, char *buf, int len); function http_timestr(t : time_t; buf : PChar; len : integer) : PChar cdecl; external 'HTTPD32.
init_sec -
later_than - Utilities // UNTESTED: BOOL later_than(char *t1, char *t2);
MD5Final - UNTESTED: void MD5Final(BYTE digest[16], MD5Context *context);
MD5Init - MD5 Support // UNTESTED: void MD5Init(MD5Context *context);
MD5Update - UNTESTED: void MD5Update(MD5Context *context, BYTE *buf, DWORD len);
nflush - TESTED: void nflush(TCTX *tp);
ngets - UNTESTED: void ngets(char *buf, int max, TCTX *tp);
normalize_url - UNTESTED: BOOL normalize_url(char *path);
nputs - Network I/O // TESTED: void nputs(char *buf, TCTX *tp);
nread - TESTED: void nread(char *buf, long nreq, TCTX *tp);
nreadf - UNTESTED: void nreadf(HANDLE hFile, long nreq, TCTX *tp);
nwrite - TESTED: void nwrite(char *buf, int n, TCTX *tp);
nwritef - UNTESTED: void nwritef(HANDLE hFile, DWORD dwStartPos, DWORD dwCount, TCTX *tp);
open_form_decoder - Registry access // UNCONVERTED: HKEY OpenRegKey(char *pszKey); UNCONVERTED: char *GetRegString(char *name, HKEY hKey); UNCONVERTED: DWORD GetRegBin(char *name, HKEY hKey); // Form decoder // TESTED: FORM_CTX open_form_decoder(BYTE *cont, DWORD clen, TCTX *tp);
plus_to_space - UNTESTED: void plus_to_space(char *str);
process_get - UNTESTED: void process_get(char *m, char *url, char *args, TCTX *tp);
send_http_header - TESTED: void send_http_header(TCTX *tp, BOOL do_xhdr);
set_content_type - UNTESTED: void set_content_type(char *fn, TCTX *tp);
space_to_plus - UNTESTED: void space_to_plus(char *str);
TrueRandAddNoise - Cryptographically Strong Random Number Generator // UNTESTED: void TrueRandAddNoise(DWORD data);
TrueRandEntropy - UNTESTED: DWORD TrueRandEntropy(void);
TrueRandGetByte - UNTESTED: BYTE TrueRandGetByte(void);
TrueRandGetBytes - UNTESTED: void TrueRandGetBytes(BYTE *buf, DWORD len);
unescape_url - UNTESTED: void unescape_url(char *url);
url_to_file - URL <--> filespace mapping // UNTESTED: int url_to_file(char *pathname, BOOL do_index, TCTX *tp);
wsapi_free - TESTED: void wsapi_free(void *ptr);
wsapi_log_event - UNTESTED: void wsapi_log_event(HINSTANCE hInstance, char *message);
wsapi_malloc - TESTED: void *wsapi_malloc(long size, TCTX *tp);
wsapi_realloc - UNTESTED: void *wsapi_realloc(void *ptr, long size, TCTX *tp);
wsapi_strdup - UNTESTED: char *wsapi_strdup(char *str, TCTX *tp);

Types

FIELD
FORM_CTX
get_cert_key_Function
HANDLE
HCONN
HINSTANCE
LPBYTE
LPVOID
MD5Context
PDWORD
PFIELD
PMD5Context
PPBYTE
PTCTX
SOCKET
T16Bytes
TTCTX
xhdr

Constants

ACCEPTED
AUTH_ACCEPT
AUTH_INTERNAL
AUTH_REJECT
AUTH_REQUIRED
BAD_REQUEST
CREATED
DELETED
DOCUMENT_FOLLOWS
FORBIDDEN
HUGE_STRING_LEN
MAJOR_VERSION
MAX_CGI_DLLS
MAX_EXT_HEADERS
MAX_NAME_LEN
MAX_PROC_DLLS
MAX_STRING_LEN
MAX_TYPE_LEN
MED_STRING_LEN
MINOR_VERSION
MODIFIED
MOVED
M_ANY
M_DELETE
M_GET
M_LINK
M_POST
M_PUT
M_UNLINK
NOT_FOUND
NOT_IMPLEMENTED
NO_RESPONSE
PARTIAL_INFORMATION
REDIRECT
REDIRECT_URL
SCRIPT_DOS
SCRIPT_SHELL
SCRIPT_WIN
SECOPT_NO_BROWSE
SECOPT_OR_CLASS_USERS
SECOPT_SSL_ONLY
SERVER_ERROR
SHTTP_HANDLE_SECURE_METHOD
SHTTP_HANDLE_SECURE_RESPONSE
SHTTP_PROCESS_REQUEST_HEADERS
SHTTP_TRANSACTION_CLEANUP
SML_STRING_LEN
STD_DOCUMENT
USE_LOCAL_COPY

Variables


Functions


function bind_wsapi(major, minor : WORD; strict : BOOL) : BOOL cdecl;

========================= SERVER_EXPORTED FUNCTIONS ========================= // // Version binding // TESTED: BOOL bind_wsapi(WORD major, WORD minor, BOOL strict);

procedure close_form_decoder( ctx : FORM_CTX; tp : PTCTX) cdecl;

TESTED: void close_form_decoder(FORM_CTX ctx, TCTX *TP);

procedure construct_url(d, s : PChar; tp : PTCTX) cdecl;

Other URL operations // UNTESTED: void construct_url(char *d, char *s, TCTX *tp);

procedure DbgDump (buf : PBOOL; len : WORD; _label : PChar) cdecl;

UNTESTED: void DbgDump (BYTE *buf, WORD len, char *label);

function decode_next_field( ctx : FORM_CTX; tp : PTCTX) : PFIELD cdecl;

TESTED: PFIELD decode_next_field(FORM_CTX ctx, TCTX *tp);

procedure die( http_status : longint; s : PChar; tp : PTCTX) cdecl;

HTTP error handler (use above result code #defs) // TESTED: void die(int http_status, char *string, TCTX *tp);

procedure do_imagemap(method : integer; map_name, coords : Pchar; tp : PTCTX) cdecl;

UNTESTED: void do_imagemap(int method, char *map_name, char *coords, TCTX *tp);

procedure escape_url(url : Pchar; tp : PTCTX) cdecl;

UNTESTED: void escape_url(char *url, TCTX *tp);

procedure evaluate_access(url : Pchar; tp : PTCTX) cdecl;

UNTESTED: void evaluate_access(char *url, TCTX *tp);

procedure exec_cgi(m, sfile, args : PChar; intfc : integer; tp : PTCTX) cdecl;

Response // UNTESTED: void exec_cgi(char *m, char *file, char *args, int intfc, TCTX *tp);

procedure exec_cgi_to_file(m, sfile, args : PChar; intfc : integer; tp : PTCTX) cdecl;

UNTESTED: void exec_cgi_to_file(char *m, char *file, char *args, int intfc, TCTX *tp);

procedure file_to_url(pathname : PChar; tp : PTCTX) cdecl;

UNTESTED: void file_to_url(char *pathname, TCTX *tp);

function get_content_type(fn : PChar; tp : PTCTX) : PChar cdecl;

Content type // UNTESTED: char *get_content_type(char *fn, TCTX *tp);

function get_server_variable(name, buf : Pchar; size : DWORD; tp : PTCTX) : BOOL cdecl;

UNTESTED: BOOL get_server_variable(char *name, char *buf, DWORD size, TCTX *tp);

procedure get_temp_name(buf : PChar) cdecl;

UNTESTED: void get_temp_name(char *buf);

function http_nt_timestr(pst : PSystemTime; buf : PChar; len : integer) : PChar cdecl;

UNCONVERTED: char *http_timestr(time_t t, char *buf, int len); function http_timestr(t : time_t; buf : PChar; len : integer) : PChar cdecl; external 'HTTPD32.EXE'; TESTED: char *http_nt_timestr(LPSYSTEMTIME pst, char *buf, int len);

procedure init_sec(get_cert_key : get_cert_key_Function);


function later_than(t1, t2 : PChar ) : BOOL cdecl;

Utilities // UNTESTED: BOOL later_than(char *t1, char *t2);

procedure MD5Final(digest : T16Bytes; context : PMD5Context) cdecl;

UNTESTED: void MD5Final(BYTE digest[16], MD5Context *context);

procedure MD5Init(context : PMD5Context) cdecl;

MD5 Support // UNTESTED: void MD5Init(MD5Context *context);

procedure MD5Update(context : PMD5Context; buf : PBYTE; len : DWORD) cdecl;

UNTESTED: void MD5Update(MD5Context *context, BYTE *buf, DWORD len);

procedure nflush(tp : PTCTX) cdecl;

TESTED: void nflush(TCTX *tp);

procedure ngets(buf : PChar; max : integer; tp : PTCTX) cdecl;

UNTESTED: void ngets(char *buf, int max, TCTX *tp);

function normalize_url(path : PChar) : BOOL cdecl;

UNTESTED: BOOL normalize_url(char *path);

procedure nputs(buf : PChar; tp : PTCTX) cdecl;

Network I/O // TESTED: void nputs(char *buf, TCTX *tp);

procedure nread(buf : PChar; nreq : longint; tp : PTCTX) cdecl;

TESTED: void nread(char *buf, long nreq, TCTX *tp);

procedure nreadf(hFile : HANDLE; nreq : longint; tp : PTCTX) cdecl;

UNTESTED: void nreadf(HANDLE hFile, long nreq, TCTX *tp);

procedure nwrite(buf : PChar; n : integer; tp : PTCTX) cdecl;

TESTED: void nwrite(char *buf, int n, TCTX *tp);

procedure nwritef(hFile : HANDLE; dwStartPos, dwCount : DWORD; tp : PTCTX) cdecl;

UNTESTED: void nwritef(HANDLE hFile, DWORD dwStartPos, DWORD dwCount, TCTX *tp);

function open_form_decoder(cont : PBYTE; clen : DWORD; tp : PTCTX) : FORM_CTX cdecl;

Registry access // UNCONVERTED: HKEY OpenRegKey(char *pszKey); UNCONVERTED: char *GetRegString(char *name, HKEY hKey); UNCONVERTED: DWORD GetRegBin(char *name, HKEY hKey); // Form decoder // TESTED: FORM_CTX open_form_decoder(BYTE *cont, DWORD clen, TCTX *tp);

procedure plus_to_space(str : Pchar) cdecl;

UNTESTED: void plus_to_space(char *str);

procedure process_get(m, url, args : PChar; tp : PTCTX) cdecl;

UNTESTED: void process_get(char *m, char *url, char *args, TCTX *tp);

procedure send_http_header(tp : PTCTX; do_xhdr : BOOL) cdecl;

TESTED: void send_http_header(TCTX *tp, BOOL do_xhdr);

procedure set_content_type(fn : PChar; tp : PTCTX) cdecl;

UNTESTED: void set_content_type(char *fn, TCTX *tp);

procedure space_to_plus(str : Pchar) cdecl;

UNTESTED: void space_to_plus(char *str);

procedure TrueRandAddNoise(data : DWORD) cdecl;

Cryptographically Strong Random Number Generator // UNTESTED: void TrueRandAddNoise(DWORD data);

function TrueRandEntropy : DWORD cdecl;

UNTESTED: DWORD TrueRandEntropy(void);

function TrueRandGetByte : BYTE cdecl;

UNTESTED: BYTE TrueRandGetByte(void);

procedure TrueRandGetBytes(buf : PBYTE; len : DWORD) cdecl;

UNTESTED: void TrueRandGetBytes(BYTE *buf, DWORD len);

procedure unescape_url(url : Pchar) cdecl;

UNTESTED: void unescape_url(char *url);

function url_to_file(pathname : PChar; do_index : BOOL; tp : PTCTX): integer cdecl;

URL <--> filespace mapping // UNTESTED: int url_to_file(char *pathname, BOOL do_index, TCTX *tp);

procedure wsapi_free(ptr : pointer) cdecl;

TESTED: void wsapi_free(void *ptr);

procedure wsapi_log_event( hInstance : HINSTANCE; _message : PChar) cdecl;

UNTESTED: void wsapi_log_event(HINSTANCE hInstance, char *message);

function wsapi_malloc(size : longint; tp : PTCTX) : pointer cdecl;

TESTED: void *wsapi_malloc(long size, TCTX *tp);

function wsapi_realloc(ptr : pointer; size : longint; tp : PTCTX) : pointer cdecl;

UNTESTED: void *wsapi_realloc(void *ptr, long size, TCTX *tp);

function wsapi_strdup(str : Pchar; tp : PTCTX) : Pchar cdecl;

UNTESTED: char *wsapi_strdup(char *str, TCTX *tp);

Types


FIELD = record
name : array[0..MED_STRING_LEN-1] of char;
data : PBYTE;
len : DWORD;
ctype : array[0..MED_STRING_LEN-1] of char;
xftype : array[0..MED_STRING_LEN-1] of char;
fname : array[0..MED_STRING_LEN-1] of char;
end;

FORM_CTX = pointer
------------ Form decoder ------------
get_cert_key_Function = Function(cn : PChar;
                                    cert : PPBYTE; cert_len : PDWORD;
                                    key : PPBYTE; key_len : PDWORD) : BOOL
S-HTTP only - Security initializer callback // UNTESTED: void init_sec(BOOL(*get_cert_key)(char *cn, BYTE **cert, DWORD *cert_len, BYTE **key, DWORD *key_len));
HANDLE = DWORD

HCONN = LPVOID

HINSTANCE = DWORD

LPBYTE = PBYTE

LPVOID = Pointer
supporting types not in WSAPI.H but needed in the Delphi version
MD5Context = record
hash : array[0..3] of DWORD;
bytes : array[0..1] of DWORD;
input : array[0..15] of DWORD;
end;

PDWORD = ^DWORD

PFIELD = ^FIELD
Decoding context handle
PMD5Context = ^MD5Context
----------- FATAL Macro ----------- // Use this when you need to "bail out". It will generate an exception that will cause the server to alert and disable your hook DLL. Use it for "serious" errors that could compromise the DLL or the server. For "normal" errors, call the server-exported die() function or use the ABORT macro. // UNCONVERTED: #define FATAL RaiseException(0xE1000001, 0, 0, NULL) ----------- ABORT Macro (UNCONVERTED) ----------- // Use this when you need to silently end the current request. Calling this will end the request, sending a TCP "reset" packet to the browser. It will not cause your DLL to be disabled. // UNCONVERTED: #define ABORT RaiseException(0xE100000F, 0, 0, NULL) ------------------------------------ Message Digest 5 (MD5, see RFC 1321) ------------------------------------
PPBYTE = ^PBYTE

PTCTX = ^TTCTX
--------------------- Transaction Context --------------------- // This is the structure that holds all of the public per-transaction data //
SOCKET = DWORD

T16Bytes = array[0..15] of BYTE;

TTCTX = record
link : pointer;
_hMainWnd : HWND;
bService : BOOL;
bTraceHook : BOOL;
temp_path : PChar;
server_version : PChar;
hSocket : SOCKET;
dwPort : DWORD;
dwThreadID : DWORD;
dwStartTicks : DWORD;
bSSL : BOOL;
remote_host : PChar;
remote_ip : PChar;
remote_name : PChar;
local_name : PChar;
url_prefix : PChar;
local_CN : PChar;
cert : ^BYTE;
cert_len : DWORD;
http_request : array[0..MED_STRING_LEN-1] of char;
http_09 : BOOL;
method : array[0..SML_STRING_LEN-1] of char;
url : array[0..MAX_STRING_LEN-1] of char;
params : array[0..MAX_STRING_LEN-1] of char;
args : array[0..MAX_STRING_LEN-1] of char;
http_accept : array[0..MAX_STRING_LEN-1] of char;
if_mod_since : array[0..SML_STRING_LEN-1] of char;
request_range : array[0..MAX_STRING_LEN-1] of char;
unl_mod_since : array[0..SML_STRING_LEN-1] of char;
referer : array[0..MAX_STRING_LEN-1] of char;
from : array[0..MED_STRING_LEN-1] of char;
user_agent : array[0..MED_STRING_LEN-1] of char;
keep_alive : BOOL;
auth_line : array[0..MED_STRING_LEN-1] of char;
auth_type : PChar;
auth_name : PChar;
user : array[0..SML_STRING_LEN-1] of char;
pass : array[0..SML_STRING_LEN-1] of char;
allow_options : DWORD;
content_length : longint;
content_type : array[0..MED_STRING_LEN-1] of char;
content_encoding : array[0..MED_STRING_LEN-1] of char;
location : array[0..MAX_STRING_LEN-1] of char;
last_modified : array[0..SML_STRING_LEN-1] of char;
rsp_status : array[0..SML_STRING_LEN-1] of char;
num_req_xhdr : longint;
req_xhdr : array[0..MAX_EXT_HEADERS-1] of xhdr;
num_rsp_xhdr : longint;
rsp_xhdr : array[0..MAX_EXT_HEADERS-1] of xhdr;
user_to_check : array[0..SML_STRING_LEN-1] of char;
hOutFile : HANDLE;
http_status : integer;
bytes : longint;
user_1 : DWORD;
user_2 : DWORD;
bSHTTP : BOOL;
dwCryptRequest : DWORD;
TerisaCtx : pointer;
hUnwrappedReq : HANDLE;
hUnwrappedRsp : HANDLE;
end;

xhdr = record
key : pointer;
value : pointer;
end;
------------------------- Extra header info in TCTX -------------------------

Constants

ACCEPTED = 202

AUTH_ACCEPT = 1

Reject username/password

AUTH_INTERNAL = 2

Accept username/password

AUTH_REJECT = 0

Used as intfc parameter to exec_cgi_script -------------------------------- Authentication Hook Return Codes --------------------------------

AUTH_REQUIRED = 401

BAD_REQUEST = 400

CREATED = 201

DELETED = 205

DOCUMENT_FOLLOWS = 200

Max extra request or CGI/1.1 headers ------------------- HTTP Result Codes -------------------

FORBIDDEN = 403

HUGE_STRING_LEN = 8192

Big string buffer

MAJOR_VERSION = 1

=============== VERSION CONTROL =============== |--->(in fact, don't edit this file at all!) (ha ha ha - paulg) ----------------------------- WARNING! DO NOT EDIT THESE DEFINITIONS! USE THEM IN THE CALL TO bind_wcgi(). IF YOU COMPILE YOUR HOOK WITH THIS HEADER FILE, IT HAS THE WSAPI VERSION INDICATED BELOW //

MAX_CGI_DLLS = 32

Longest CGI DLL name

MAX_EXT_HEADERS = 100

Very large string buffer

MAX_NAME_LEN = 64

Max # postprocessors

MAX_PROC_DLLS = 32

Longest postproc content type

MAX_STRING_LEN = 1024

Medium string buffer

MAX_TYPE_LEN = 64

------ Limits ------

MED_STRING_LEN = 256

Small string buffer

MINOR_VERSION = 1

MODIFIED = 206

MOVED = 301

M_ANY = 255

M_DELETE = 3

M_GET = 0

-------------------- Supported methods -------------------- // Numeric method codes used in some interfaces //

M_LINK = 4

M_POST = 2

M_PUT = 1

M_UNLINK = 5

NOT_FOUND = 404

NOT_IMPLEMENTED = 501

NO_RESPONSE = 204

PARTIAL_INFORMATION = 203

REDIRECT = 302

REDIRECT_URL = -1

--------------- Object types --------------- // Returned by url_to_file() //

SCRIPT_DOS = 1

SCRIPT_SHELL = 4

Used as intfc parameter to exec_cgi_script

SCRIPT_WIN = 2

Used as intfc parameter to exec_cgi_script

SECOPT_NO_BROWSE = 1

Accessible via SSL only

SECOPT_OR_CLASS_USERS = 1

Use internal authentication --------------------- Access option codes ---------------------

SECOPT_SSL_ONLY = 1

"OR" logic for class/user access

SERVER_ERROR = 500

SHTTP_HANDLE_SECURE_METHOD = 1

Disable directory browsing ==================== S-HTTP REQUEST CODES ==================== // Used in TCB to tell Terisa hook what to do //

SHTTP_HANDLE_SECURE_RESPONSE = 3

SHTTP_PROCESS_REQUEST_HEADERS = 2

SHTTP_TRANSACTION_CLEANUP = 4

SML_STRING_LEN = 64

MAX # CGI DLLs

STD_DOCUMENT = 0

USE_LOCAL_COPY = 304


Variables