CGIplus-enabled Run-time Environment Example
--------------------------------------------
***** FIRST, EVIDENCE OF PERSISTANCE *****
Usage Count: 2
***** SECOND, THE CGI ENVIRONMENT AVAILABLE *****
WWW_AUTH_TYPE=
WWW_CONTENT_LENGTH=0
WWW_CONTENT_TYPE=text/plain; charset=ISO-8859-1
WWW_DOCUMENT_ROOT=
WWW_GATEWAY_BG=BG47559:
WWW_GATEWAY_INTERFACE=CGI/1.1
WWW_GATEWAY_EOF=$Z-C3CEC6D71385252C89AE003D-
WWW_GATEWAY_EOT=$D-169649DA01F335931F0D5DB8-
WWW_GATEWAY_ESC=$E-E92E64597997E046F548260F-
WWW_GATEWAY_MRS=4492
WWW_HTTP_CF_RAY=8e9905b0292210d3-ORD
WWW_HTTP_USER_AGENT=Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
WWW_HTTP_HOST=675502.arinterhk.tech
WWW_HTTP_CF_IPCOUNTRY=US
WWW_HTTP_ACCEPT_ENCODING=gzip, br
WWW_HTTP_X_FORWARDED_FOR=3.149.232.87
WWW_HTTP_X_FORWARDED_PROTO=https
WWW_HTTP_ACCEPT=*/*
WWW_HTTP_CF_CONNECTING_IP=3.149.232.87
WWW_HTTP_CF_VISITOR={"scheme":"https"}
WWW_HTTP_CONNECTION=Keep-Alive
WWW_HTTP_CDN_LOOP=cloudflare; loops=1
WWW_PATH_INFO=/just/a/bogus/path.txt
WWW_PATH_ODS=5
WWW_PATH_TRANSLATED=WASD_ROOT:[just.a.bogus]path.txt
WWW_QUERY_STRING=query=string
WWW_REMOTE_ADDR=172.69.59.171
WWW_REMOTE_HOST=172.69.59.171
WWW_REMOTE_PORT=19476
WWW_REMOTE_USER=
WWW_REQUEST_METHOD=GET
WWW_REQUEST_PROTOCOL=HTTP/1.1
WWW_REQUEST_SCHEME=http:
WWW_REQUEST_TIME_GMT=Thu, 28 Nov 2024 08:41:11 GMT
WWW_REQUEST_TIME_LOCAL=Thu, 28 Nov 2024 09:41:11
WWW_REQUEST_URI=/rtbin/version.h/just/a/bogus/path.txt?query=string
WWW_SCRIPT_FILENAME=WASD_ROOT:[src.httpd]version.h
WWW_SCRIPT_NAME=/rtbin/version.h
WWW_SCRIPT_RTE=cgi-bin:[000000]rte_example.exe
WWW_SERVER_ADDR=146.48.108.2
WWW_SERVER_CHARSET=ISO-8859-1
WWW_SERVER_GMT=+01:00
WWW_SERVER_NAME=ns1.gposta.it
WWW_SERVER_PROTOCOL=HTTP/1.1
WWW_SERVER_PORT=80
WWW_SERVER_SIGNATURE=
WASD/11.5.1 Server at ns1.gposta.it Port 80
WWW_SERVER_SOFTWARE=HTTPd-WASD/11.5.1 OpenVMS/IA64 SSL
WWW_UNIQUE_ID=Z0g6twAAAAQkwAEpABs
WWW_FORM_QUERY=string
WWW_KEY_COUNT=0
***** THIRD, AN "INTERPRETED" FILE (WWW_SCRIPT_NAME/WWW_SCRIPT_FILENAME) *****
[0001] /*****************************************************************************/
[0002] /*
[0003] version.h
[0004]
[0005]
[0006] VERSION HISTORY
[0007] ---------------
[0008] 17-AUG-2020 MGD v11.5.1,
[0009] Http2RequestData() reduce memory consumption
[0010] HTTP2_DEFAULT_WINDOW_SIZE from 1048575 to 131070
[0011] if no service configured create http: and https: ex nihilo
[0012] VmCheckPgFlLimit() and WASD_VM_PGFL_LIMIT logical name
[0013] keep connect cert (->VerifyPeer) distinct from client cert
[0014] bugfix; ProxyEnd() fix NetIoEnd() fix
[0015] bugfix; OdsDirectSearch() if wildcard specification
[0016] return RMS$_NMF, otherwise RMS$_FNF (seems so elementary)
[0017] bugfix; Http2RequestCancel() cancel and abort
[0018] bugfix; RequestEnd() redirection
[0019] bugfix; SesolaALPNCallback() 'h2' global and service enabled
[0020] bugfix; ControlDoHelp() remove non-existant DISCONNECT=..
[0021] bugfix; RequestExecutePostAuth1() INTERNAL_PASSWORD_CHANGE
[0022] should call HtAdminBegin() not AdminBegin()
[0023] bugfix; SesolaSNICallback() needs to propagate newly set
[0024] context client verify parameters to SSL-specific
[0025] bugfix; SesolaNetFree() ensure (sigh) X509_free() where
[0026] ->ClientCertPtr associated with connection (i.e. HTTP/2)
[0027] bugfix; RequestParseExecute() ensure PUT and DELETE have
[0028] WebDAV header field(s) before considering WebDAV
[0029] 22-JUL-2020 MGD v11.5.0, "Stay well..."
[0030] static fallback cert replaced by dynamic SesolaMkCert()
[0031] protocol "HTTP/2" also reported in standard log formats
[0032] DavWebRequest() remove requirement for logical name
[0033] WASD_HTTP2_WEBDAV after WebDAV over HTTP/2 tested
[0034] NetIoQioMaxSeg() tune QIO to TCP MSS
[0035] verified against VSI SSL111 product
[0036] SET response=csp= ("content-security-policy:")
[0037] https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
[0038] SET response=cspro= ("..policy-report-only:")
[0039] metacon alpn: (TLS application level protocol negotiation)
[0040] metacon proctor: (obvious proctored script clause)
[0041] DCL callout CSP: ("content-security-policy:")
[0042] DCL callout CSPRO: ("..policy-report-only:")
[0043] REGEX.C updated (ever-so-slightly)
[0044] more proxy persistent connection (per JPP)
[0045] RequestAbort() accomodates HttpdSupervisor() refinement
[0046] and REQUEST_STATE_ABORT used throughout server
[0047] Http2RequestData() delivers Http2RequestCancel() read AST
[0048] NetTestSupevisor() and WASD_NET_TEST_BREAK logical name
[0049] bugfix; ProxyEnd() free ioptr using NetIoEnd()
[0050] bugfix; NetIoWriteStatus() and NetIoReadStatus()
[0051] bugfix; RequestPersistentConnection() pipelined request
[0052] bugfix; Http2RequestData() flow control
[0053] bugfix; SesolaClientCertGet() SSL_VERIFY_POST_HANDSHAKE
[0054] bugfix; httpd.c if (!CliDemo) HttpdGblSecInit();
[0055] bugfix; MetaConConditionalList() bu**ered
[0056] bugfix; RequestProcessFields() DictLookup (.."accept"..)
[0057] bugfix; SesolaCertExtension() BIO_NOCLOSE memory leak
[0058] bugfix; CacheLoadEnd() free rqCache.ContentPtr on fail
[0059] bugfix; DICT.C "tmptr && tmptr->clink.."
[0060] bugfix; Http2Priority() exclusive bit
[0061] bugfix; NetCreateService() only SesolaInitService() once
[0062] bugfix; WatchDataDump() CHARS_PER_LINE calculation (sigh)
[0063] bugfix; OdsDirectSearch() RMS$_FNF not RMS$_NMF (per JPP)
[0064] bugfix; RequestShareBegin() if (!MATCH6 (cptr, "raw://"))
[0065] bugfix; SesolaNetClientBegin() SESOLA_SINCE_110
[0066] BIO_set_data() before SSL_set_bio() (per JPP)
[0067] bugfix; AdminParsePath() extraneous OdsParseRelease()
[0068] bugfix; OdsDirectSearch() only if not already on the block
[0069] boundary add one to get to next, otherwise already there!
[0070] 20-JUL-2019 MGD v11.4.0, "One small step ..."
[0071] 25th Anniversary Release (see 20-JUN-1994 below)
[0072] adapt WatchSystemPlus() to allow use via CLI /SYSPLUS
[0073] then dignified with a (sysPlus..()) module of its very own
[0074] /OUTPUT= (in particular for /SYSPLUS)
[0075] HttpdSupervisor() explicitly WatchEnd()
[0076] Sesola_netio_read() and Sesola_netio_write() if connection
[0077] broken (channel zero) return zero (SSL shutdown)
[0078] SET response=200=203 for request tracking and log analysis
[0079] ResponseHiss() response status changed from 403 to 203
[0080] status code 418 (teapot) forces connection drop
[0081] allow a specified port when redirecting, i.e. http[s]//:nnn
[0082] Sesola_netio_read_ast() 0 status TCP/IP Services?
[0083] Sesola_netio_write_ast() 0 status TCP/IP Services?
[0084] bugfix; SesolaClientCertGet() status 0 an issue
[0085] bugfix; SesolaClientCertGet() if (value <= 0) break;
[0086] bugfix; CgiOutput() Content-Length: strtoul()
[0087] bugfix; SesolaClientCert() allow pattern per 25-AUG-2015
[0088] bugfix; SesolaCertExtension() storage reset
[0089] bugfix; SesolaCertParseDn() regression (or whatever)
[0090] bugfix; Http2NetQueueWrite() PEEK_8 at w2ptr->type
[0091] bugfix; non-local without "Host:" use name not host:port
[0092] bugfix; Http2RequestEnd() copy tally rx/tx to request
[0093] bugfix; OdsDirectSearch() (uint)0xffff && rlen < 508)
[0094] bugfix; AuthCompleted() and AuthNotComplete() to address
[0095] AST delivery following request end and rundown
[0096] bugfix; for bugfix StringSliceValue() kludge
[0097] allow for DECnet connection string specified username
[0098] bugfix; DavMetaDir() ACCVIO from !SAME2(mfdptr,'[.')
[0099] 24-NOV-2018 MGD v11.3.0
[0100] verified against OpenSSL v1.0.2 && v1.1.0 && v1.1.1
[0101] TLSv1.3 operational
[0102] verified against EXPAT v2.2.5 (for WebDAV purposes)
[0103] (but reverted to v2.0.1 for final VAX WASD release)
[0104] VM.C eliminate dynamic tuning of heap initial allocation
[0105] and rework to allow detailed memory management statistics
[0106] to be compiled into the runtime for development purposes
[0107] ODS (FILES-11) directory parser
[0108] WatchSystemPlus() et.al. for system troubleshooting
[0109] RequestBegin() exit after consecutive SesolaNetBegin() fails
[0110] DavWebRundown() explicitly abort WebDAV processing
[0111] allow logical name content during one-to-one rule mapping
[0112] refactor WatchWrite() using NetWriteBuffered()
[0113] DclTaskRunDown() always use DclEmptySysOutput()
[0114] [BufferQuotaDclOutput] BUFQUO value for SYS$OUTPUT mailbox
[0115] refactor Http2RequestCancel() into Http2RequestCancelRead()
[0116] and Http2RequestCancelWrite()
[0117] ProxyRequestRebuild() proxy-authorization opaque:
[0118] ProxyTunnelLogicalName() WASD_TUNNEL_SECONDS
[0119] RequestGet() and ProxyTunnelNetReadAst() provide
[0120] "X-Forwarded-For:" client host to proxied-to server
[0121] /DO=REQUEST=RUNDOWN=..
[0122] /DO=ZERO=STATUS
[0123] /DO=SSL=SERVICE=LOAD[=] no longer works
[0124] SET response=var=crlf
[0125] SET response=var=lf
[0126] SET response=var=none
[0127] bugfix; PutWriteFileOpen() override incompatible existing
[0128] file characteristics by first erasing the file
[0129] bugfix; seeming innumerable WebDAV fixes (some obvious,
[0130] some obscure) many thanks to John Dite for his patience and
[0131] persistence in finding and reporting anomalous behaviours
[0132] (check the individual DAV...C modules for descriptions)
[0133] bugfix; StringSliceValue() kludge for DECnet tasks
[0134] bugfix; MetaConEvaluate() "webdav:MSagent"
[0135] bugfix; DavWebMicrosoftDetect() before ->WebDavTaskPtr
[0136] bugfix; X509_free() memory leak with ->ClientCertPtr
[0137] bugfix; Http2NetIoWrite() blocking write data must be
[0138] asynchronously persistent so employ internal buffer(s)
[0139] bugfix; /DO=AUTH=SKELKEY=.. cluster wide (yet again :-)
[0140] bugfix; SESOLA-OpenSSL memory leak at v11.0.0
[0141] bugfix; FileParseAst() regression with search list file
[0142] bugfix; RequestRundown() allow for cache activity
[0143] bugfix; WatchDataDump() CHARS_PER_LINE calculation
[0144] bugfix; (longstanding) MapUrl__Map() multiple template
[0145] wildcards when reverse mapping
[0146] 01-MAR-2018 MGD v11.2.0
[0147] make WATCH item width flexible using initial value 6 digits
[0148] with leading 3 digits HTTP/2 stream ID followed by 3 digits
[0149] connection ID number and on overflow increment by 2
[0150] if |WASD_ENV| defined use that in absence of /ENV=..
[0151] Dav..() always DavWebEnd() not RequestEnd()
[0152] WebDAV "authorisation" allowed to be EXTERNAL or OPAQUE
[0153] RequestRundown() outstanding task sanity checks
[0154] HttpdSupervisor() refactored timeout handling
[0155] ProxyTunnelLogicalName() and WASD_TUNNEL to provide client
[0156] host and port tunnel data available to the WASD system
[0157] activated by SET..PROXY=FORWARDED=[FOR|ADDRESS]
[0158] logging 'II' image information (file, version, link time)
[0159] logging 'TI' request time in ISO 8601 extended format
[0160] logging 'TS' (sortable) UTC request time ISO 8601 format
[0161] logging 'TU' request time UTC (GMT) now synonym for 'TG'
[0162] stamp (note) log events when common/combined with/without+
[0163] SET DIR=TITLE=[default|owner|remote||this=]
[0164] /DO=HELP brief summary of command-line /DOs
[0165] /DO=SSL=SERVICE=LOAD[= (re)load SSL context
[0166] (/DO=SSL=CERT=LOAD is now implemented using this)
[0167] /DO=STATUS report basic status of all instances
[0168] /DO=STATUS=NOW instances immediately update status information
[0169] /DO=STATUS=PURGE zero stale instance status information
[0170] /DO=STATUS=RESET zero instance status information
[0171] /NOTE= annotation to server process log
[0172] refactor WatchEnd() (yet again)
[0173] DclInit() do not adjust SYS$OUTPUT mailbox size when HTTP/2
[0174] is enabled, issue an informational as required
[0175] DclMemBuf..() memory buffer script IPC (see DCLMEMBUF.C)
[0176] callout BUFFER-BEGIN:
[0177] callout BUFFER-END:
[0178] callout BUFFER-WRITE:
[0179] SesolaReport() allow reporting using an HTTP service
[0180] CgiOutput() refine Content-Length: to report out-of-range
[0181] CgiOutput() reject subsequent non-header
[0182] WatchReport() move SSL item into Network group
[0183] WatchShowCluster() and WatchShowSystem() VMS V6.2 obsolete
[0184] bugfix; (longstanding) InstanceSocketForAdmin() sys$deq()
[0185] bugfix; Http2..() window update and flow control management
[0186] bugfix; logging 'BB' header length "lost" during HTTP/2 mods
[0187] bugfix; nil content CGI responses not delivered
[0188] bugfix; (long-standing) always use UpdEnd() not SysDclAst()
[0189] bugfix; CgiGenerateVariables()
[0190] |rqptr->rqAuth.SourceRealm != AUTH_SOURCE_AGENT_OPAQUE &&|
[0191] 09-AUG-2017 MGD v11.1.1
[0192] relax HTTP/2 "rabbit hole" to permit WATCHing except
[0193] for items [x]HTTP/2, [x]SSL and [x]network
[0194] /INSTANCE=CONFIG ensures config values used
[0195] SesolaClientCertRenegotiate() allow for pre- and post-
[0196] OpenSSL 1.1.0 due to MSIE11 (Edge) stalling on a read
[0197] after renegotiation (pre reverts to v11.0 and earlier code)
[0198] SesolaInitService() when SSL_CTX_set_tmp_dh_callback() is
[0199] enabled (DH_PARAM_*.PEM files present) ensure flag
[0200] SSL_OP_CIPHER_SERVER_PREFERENCE is implicitly set
[0201] MapUrl_GuaranteeAccess() mapping as well as authorisation
[0202] Authorize() move AuthorizeGuaranteeAccess() up-front to
[0203] ensure access to guaranteed paths not only with failure
[0204] StringSliceValue() allow quote-delim inside space-delimited
[0205] bugfix; rationalise as OpenSSL_version[_num]() becomes
[0206] confused catering for OpenSSL v1.0.2 && v1.1.0 && v1.1.1
[0207] bugfix; HttpdSupervisor() do RequestRundown() only the once
[0208] bugfix; DclCalloutDefault() NOTICED: and OPCOM: responses
[0209] bugfix; DclScriptProctor() request is not actually "!!*!"
[0210] bugfix; HpackHeadersFrame() use ":authority" pseudo-header
[0211] for "Host:" header according to RFC7540 8.1.2.3
[0212] bugfix; SesolaCertExtension() generate UPN independently
[0213] for each of pre- and post- OpenSSL 1.1.n
[0214] bugfix; SesolaClientCertConditional() 'IS' processing
[0215] bugfix; SesolaClientCertRenegotiate() allow for low-level
[0216] (i.e. SSL) I/O errors (e.g. link disconnection)
[0217] bugfix; LoggingDo() 'SR' silliness from v11.0 rework
[0218] bugfix; MapUrl_ExplainPathSet() response=header=add=..
[0219] bugfix; for HTTP/2 (sigh) we need NPH to generate a header
[0220] bugfix; session ticket key refresh (must be one of those...)
[0221] 04-MAY-2017 MGD v11.1.0,
[0222] "Raw"Socket based on WebSocket infrastructure
[0223] [DclScriptProctor] * general idle process(es)
[0224] [ServiceRawSocket] enables a RawSocket
[0225] [ServiceSSLcert] specification can contain wildcard(s)
[0226] SET proxy=header=[=]
[0227] logging 'CL' insert request content-length
[0228] logging 'PL' insert PUT or POST body received count
[0229] Sesola..() refinements for OpenSSL v1.1.1 and TLS 1.3
[0230] sesola.h |#include "openssl/rand.h"| to fix OpenSSL v1.1.0
[0231] static link error against rand_bytes() and rand_seed()
[0232] SesolaNetThisIsSSL() allow redirection to include scheme
[0233] /DO=SSL=CERT=LOAD ... basically for internal use only!
[0234] (heads-up: planned Let's Encrypt CME utility :-)
[0235] Graph..() activity graphic now implemented using HTML5 canvas
[0236] ResponseHeader() ensure non-printables cannot be injected
[0237] InstanceSessionTicketKey() rework multi-instance/cluster
[0238] (sigh! yes again; the lack of a test cluster these days)
[0239] DirDirectories() do not list "hidden" (^.the.DIR) directories
[0240] bugfix; use rqHeader.RequestBody.. for body with header
[0241] bugfix; DclScriptProctor() v11.0 request structure
[0242] requires dictionary and netio structures
[0243] bugfix; SesolaNetIoRead() SSL_read() in-progress
[0244] bugfix; Http2RequestEnd() end-of-request (control) frame
[0245] independent of request itself
[0246] bugfix; Http2NetQueueWrite() and Http2NetWriteDataAst()
[0247] blocking writes are not placed on the request's
[0248] write list as they are transparent to the request
[0249] bugfix; Http2NetQueueWrite() deliver via NetIoWriteStatus()
[0250] using SS$_NORMAL (HTTP/2 I/O) not the request ->VmsStatus
[0251] bugfix; SesolaControlReloadCA() do not proactively
[0252] X509_STORE_free() (leaves a dangling pointer?)
[0253] bugfix; SesolaSNICallback() port elimination
[0254] bugfix; RequestExecutePostCache() keyword redirection count
[0255] 25-AUG-2016 MGD v11.0.2,
[0256] Http2RequestBegin() ensure stream ident not reused
[0257] increase MAX_REQUEST_HEADER from 16384 to 32768
[0258] InstanceSessionTicketKey() rework multi-instance rotate
[0259] CgiGenerateVariables() mitigate httpoxy vulnerability
[0260] MsgConfigLoadCallback() make [ismap] optional
[0261] ParseCommandInteger() accept just an integer
[0262] CLI /INSTANCE= now sets global section |InstanceMax|
[0263] to allow the created process to continue to exist and when
[0264] used needs to be reset with the likes of /INSTANCE=1
[0265] minimum supported OpenSSL version is now v1.0.0
[0266] which precludes HP SSL V1.4 (at least)
[0267] OpenSSL v1.1.0 required code changes including
[0268] #if (OPENSSL_VERSION_NUMBER < 0x10100000L) in Sesola..()
[0269] modules, and introducing a version dependent build
[0270] SesolaClientCertRenegotiate() rework due to OpenSSL v1.1.0
[0271] ResponseHeader() ->rqCgi.ScriptControlHttpStatus will allow
[0272] an error reporting script to override the original status
[0273] CGI Script-Control: X-http-status=
[0274] %SSL-x-STRICT (RFC6797) now described as %SSL-x-STRICT, HSTS
[0275] bugfix; Http2RequestData() always deliver via NetIoReadAst()
[0276] bugfix; HpackHeadersFrame() uncompressed header size
[0277] bugfix; CgiGenerateVariables() names from dictionary
[0278] bugfix; MetaConEvaluate() request: regression
[0279] bugfix; RequestProcessFields() if-range: regression
[0280] bugfix; MetaConEvaluate() client_connect_gt: regression
[0281] bugfix; SesolaClientCert() move X509 RENEGOTIATE switch
[0282] HTTP/2 to HTTP/1.1 after SSL_get_peer_certificate()
[0283] 30-JUN-2016 MGD v11.0.1,
[0284] meta config [[wasd*n.n.n]] server version conditional
[0285] [SSLsessionLifetime] session ticket (or ID) lifetime
[0286] [SSLverifyPeerDataMax] see documentation
[0287] [ServiceSSLsessionLifetime] per-service equivalent
[0288] [ServiceSSLverifyPeerDataMax] per-service equivalent
[0289] [SSLsessionCacheMax] default (of zero) now disables
[0290] in favour of the more efficient Session Ticket
[0291] SesolaSessionTicket..() refresh and coordinate the
[0292] TLS session ticket key cluster-wide using the DLM
[0293] InstanceSupervisor() refresh session ticket key at midnight
[0294] RequestGblSecUpdate() method and URI only printable chars
[0295] ProxyTunnelRequestParse() append mapped path for logging
[0296] DirFiles() and DavPropSearchAst() ignore ambiguous file
[0297] names containing an escaped ("^.") period but no type
[0298] ErrorRedirectQueryString() ERROR_URI variable
[0299] bugfix; MapOdsUrlToOds5Vms() URLs will not contain
[0300] '^'-escaped sequences so just '^'-escape them
[0301] bugfix; SesolaClientCertRenegotiate() ensure request
[0302] data cleared before renegotiate ([SSLverifyPeerDataMax])
[0303] bugfix; DclTaskRundown() cancel HTTP/2 client read
[0304] bugfix; HttpdSupervisor() accumulate proxy accounting data
[0305] bugfix; RequestEnd2() decrement processing rx or (SSH) method
[0306] bugfix; RequestEnd2() read status OK -or- ENDOFFILE
[0307] bugfix; HpackHeadersFrame() multiple to single cookie header
[0308] bugfix; MetaConEvaluate() request-scheme: regression
[0309] bugfix; NetWrite() response header write error handling
[0310] bugfix; SesolaClientCert() just return status
[0311] 07-MAY-2016 MGD v11.0.0,
[0312] HTTP/2 (RFC7540, RFC7541)
[0313] restructure network I/O abstractions (oh boy!)
[0314] key-value dictionary (associative array) abstraction
[0315] add "Refresh [integer] Seconds" to appropriate reports
[0316] ProxyFtpListOutput() update in line with directory listing
[0317] SET dict[=[=]]
[0318] SET http2=protocol=1.1
[0319] SET http2=send=goaway[=]
[0320] SET http2=send=ping
[0321] SET http2=send=reset[=]
[0322] SET http2=write=[low|normal|high]
[0323] metacon dict:, http2: and request-protocol:
[0324] [HTTP2..] global configuration
[0325] [TimeoutHttp2Idle]
[0326] logging 'DI' insert specified dictionary item value
[0327] /DO=HTTP2=PURGE[=]
[0328] ensure timed-out requests are logged as 408/500
[0329] excise much of the twenty years of reporting HTML cruft
[0330] obsolete ismap.c, filedot.c, menu.c and track.c functionality
[0331] 22-APR-2016 MGD v10.4.3 (unreleased),
[0332] logging 'NP' insert notepad value
[0333] logging 'XX' insert custom site/client-specific datum
[0334] SET sslcgi=apache_mod_ssl_client
[0335] SET sslcgi=apache_mod_ssl_extens
[0336] LoggingDo() MAX_FAO_VECTOR from 64 to 128
[0337] SSL_CTX_set_ecdh_auto() set elliptic curves selection
[0338] SesolaTmpDHCallback() improve DH*.PEM flexibility
[0339] SesolaCertExtension() parse X509 extensions
[0340] SesolaCertName() parse X509 distinguished name
[0341] SesolaCgiVariablesExtension() document X509 extensions
[0342] SesolaReport() list certificate extensions
[0343] [ru:/CN=] allows multiple to be selected between
[0344] (e.g. "[ru:/CN=user*]", "[ru:/CN=^^\[^/=\]*$]")
[0345] SesolaCertParseDn() strncmp() not strsame()
[0346] SesolaCertParseDn() select on pattern match
[0347] StringMatchAndRegex() ensure |rqptr| not needed
[0348] add limit to consecutive failures on persistent connection
[0349] remove limit to consecutive requests on persistent connection
[0350] TcpIpAddressToString() IPv4 in IPv6 as ::FFFF:n.n.n.n
[0351] bugfix; ResponseHeader() for HEAD request transfer-encoding
[0352] chunked suppress actual chunked body (RFC 7230 3.3)
[0353] bugfix; SesolaInit() session cache max -1 disables cache
[0354] bugfix; LoggingDo() elapsed time items
[0355] bugfix; LoggingDo() 'CC' do not reuse pointers!
[0356] bugfix; LoggingDo() 'VS' |->ServicePtr| dereference
[0357] 15-AUG-2015 MGD v10.4.2,
[0358] [ServiceStrictTransSec] (RFC6797)
[0359] [SSLstrictTransSec] (RFC6797)
[0360] SET response=sts= (Strict-Transport-Security:)
[0361] ResponseHeader() Strict-Transport-Security: header
[0362] add WATCH "!42*x" to beginning and ending of requests
[0363] DavWebRequest() allow bodies with any and no Content-Type:
[0364] then in DavWebRequest2() check for XML in the body content
[0365] RequestRedirect() always use dynamic buffers
[0366] when "remote-addr:" begins '?' translate host to IP address
[0367] LoggingDo() add WASD_LOGS "convenience" logical name
[0368] disable kludge; SesolaNetAccept() SSL3_ST_SR_CLNT_HELLO_C
[0369] as the issue seems to have been fixed in OpenSSL v1.0.2c
[0370] logical name WASD_REDIRECT_WILDCARD must be defined
[0371] to enable "DNS wildcard" proxy redirection
[0372] bugfix; [Cli]ParseCommand() parenthesis parsing
[0373] bugfix; Request..() rework pipelined request handling
[0374] bugfix; move supervisor PID from InstanceNodeSupervisor()
[0375] to InstanceNodeSupervisorAst()
[0376] bugfix; DavWebDestination() URI and URL (Total Commander)
[0377] bugfix; Error..() earlier and broader detection of WebDAV
[0378] bugfix; DavDeleteParse() enable access around OdsParse()
[0379] bugfix; DavMoveMeta() do not report RMS$_DNF
[0380] bugfix; FaoSAK() sdptr = StrDscBuffer(StrDscPtr);
[0381] bugfix; DavXmlStartElement() PROPFIND accumulate list of
[0382] dead properties subsequently searched for in the metadata
[0383] bugfix; MapUrl_ExplainPathSet() ->ResponseChunked
[0384] bugfix; CONFIG_SERVER_LOGS logical names precede fixed locale
[0385] 12-FEB-2015 MGD v10.4.1,
[0386] ProxyResponseRebuild() and ProxyRequestRebuild() provide
[0387] timeout=n parameter with Keep-Alive: header field (some
[0388] origin servers hang when no parameters supplied, per JPP)
[0389] SesolaInitOptions() expand options keywords to include
[0390] most SSL_OP_.. flags using the OpenSSL flag #define as the
[0391] keyword minus the "SSL_" (e.g. OP_CIPHER_SERVER_PREFERENCE)
[0392] SesolaTmpRSACallback() and SesolaTmpDHCallback()
[0393] support for ephemeral keys enabling "forward secrecy"
[0394] SesolaInitService() and SesolaInitClientService()
[0395] if cipher list begins '+', '-' or '!' append it to default
[0396] increase MAX_REQUEST_HEADER from 8192 to 16384
[0397] (proxying requests from Firefox to IIS, per JPP)
[0398] kludge; SesolaNetAccept() SSL3_ST_SR_CLNT_HELLO_C
[0399] bugfix; RequestEndEnd() use ZERO_DELTA_TIME macro
[0400] bugfix; AuthCacheNeedsReval() AlreadyLocked (per JPP)
[0401] bugfix; ConfigReportSecureSocket() FaoVector[32]
[0402] 05-DEC-2014 MGD v10.4.0
[0403] CORS support
[0404] /SSL=(TLSvALL,TLSv1.1,noTLSv1.1,TLSv1.2,noTLSv1.2)
[0405] removed /SSL=(2|3|23) which must be altered to SSLv2, etc.
[0406] NOTE: TLSv1, TLSv1.1, TLSv1.2 now ENABLED by default
[0407] SSLv2 and SSLv3 are now DISABLED by default
[0408] (as recommended post-POODLE)
[0409] MapUrl_ClientAddress() allows for transparent upstream proxy
[0410] ResponseStream() and request /stream/
[0411] AuthCacheNeedsReval() so multiple cache entries for the
[0412] same credentials do not trigger multiple revalidations
[0413] SsiEnd() detect and report non-SSI problem encountered
[0414] access log buffer extended from [4096] to [16384] (UMA SAML)
[0415] LoggingQuoted() explicitly encode some fields where a raw
[0416] quotation mark (URI forbidden) can break a log entry
[0417] HttpdExit() sanity check trace after %SYSTEM-F-ASTFLT
[0418] stack corruption at (you guessed it) Uni Malaga resulted
[0419] in the icb.libicb$v_bottom_of_stack never being set!
[0420] tweaks to some accounting fields and values (for WASDmon)
[0421] NetCreateService() check bind address string instead of
[0422] address to allow binding primary to 0.0.0.0 (INADDR_ANY)
[0423] directory default listing style now ed
[0424] directory path SET ods=name=utf8 then response charset=utf-8
[0425] directory ?httpd=index&font=[inherit|monospace(D)]
[0426] ?httpd=index&style=table[2]
[0427] SET client=[forwarded|if=forwarded|literal=|reset|
[0428] if=xforwardedfor|xforwardedfor]
[0429] SET dir=font=[inherit|monospace(D)]
[0430] dir=style=TABLE[2] (new default)
[0431] SET cors=age= cors=cred=[true|false]
[0432] cors=expose= cors=headers=
[0433] cors=methods= cors=origin=
[0434] SET ods=name=8bit, ods=name=utf8, ods=name=default
[0435] SET webdav=[no]hidden
[0436] webdav=meta=dir=
[0437] [SecureSocket] and [SSL...] (overridden by /SSL=)
[0438] [WebDAVmetaDir] sub or full directory for meta files
[0439] WedDAV configurable metadata (sub)directory
[0440] AuthAccessCheck() add explicit check against server
[0441] account to improve reporting of underlying access
[0442] User-defined logging directives 'CI', 'SR', 'SV' for
[0443] SSL cipher, session reuse and version items
[0444] COMMON+, COMMON_SERVER+, COMBINED+ composite log formats
[0445] X-record0-mode[=0|1] and associated CGI null-record mode
[0446] bugfix; and refine DirFormatSize()
[0447] bugfix; SSLv23_method() appears to be a Swiss-army knife
[0448] significant rework of SSL version configuration
[0449] bugfix; TcpIpCacheAddressToName() memcpy null char
[0450] bugfix; DavMetaOpenAst() retry after meta directory creation
[0451] bugfix; DavPropEnd() ensure unused meta-data file deleted
[0452] bugfix; MapOds5VmsToUrl() et.al. allow for ".]["
[0453] bugfix; SAME3 0x00ffffff mask (not 0xffffff00)
[0454] bugfix; DirFormatAcpInfoAst() ThisIsADirectory = false;
[0455] bugfix; DavWebCreateDir() set SYSPRV access, propagate rest
[0456] bugfix; PutWriteFileOpen() WebDAV should not use default
[0457] protection mask and instead propagate from profile
[0458] bugfix; FileParseAst() allow for non-dir .DIR files
[0459] bugfix; RequestRedirect() allocate using (possibly expanded)
[0460] header length (not fixed) when allocating POST buffer
[0461] bugfix; PROXY.C no $QIO buffer should exceed 65535!
[0462] 06-OCT-2013 MGD v10.3.0
[0463] TLS1 Server Name Indication (SNI) extension
[0464] /SSL= parameter options rework (plus new mnemonic options)
[0465] SesolaNetClientBegin() include SNI before connect
[0466] PutWriteFileOpen() support FAB$C_STM and FAB$C_STMCR
[0467] DclMailboxAcl() allow usernames without associated
[0468] identifiers (i.e. shared UICs) by first trying with the
[0469] username and on failure getting the UIC and using that
[0470] FaoUrlEncodeTable tilde from "%7e" to "~" (cadaver issue)
[0471] GzipInit() ZLIB shareable image via logical names
[0472] WASD_LIBZ_SHR32, then GNV$LIBZSHR32, finally LIBZ_SHR32
[0473] PersonaAssume() wrap sys$persona_create() with SYSPRV
[0474] after modifications to DclMailboxAcl() to allow usernames
[0475] without associated identifiers (i.e. shared UICs)
[0476] authorisation realm read-only group can be specified as "*"
[0477] to represent that "everyone else" can read
[0478] ProxyResponseRebuild() additional header length bumped
[0479] from an ambit 256 to an ambit 1024 (Uni Malaga :-)
[0480] OdsNamBlockAst() on non-ODS_EXTENDED platforms (i.e. VAX)
[0481] tease-out system file name from Nam.nam$l_name and
[0482] Nam.nam$l_type into odsptr->SysFileName buffer
[0483] historically used by ODS-5 and munge for ODS-2 as well
[0484] .WWW_WASD directory directive file
[0485] sortable directory listing
[0486] ?httpd=index&ilink=[yes|no]
[0487] ?httpd=index&override=[yes|no]
[0488] ?httpd=index&query= (.WWW_WASD specific)
[0489] ?httpd=index&style=
[0490] ?httpd=index&sort=[+|-]
[0491] ?httpd=index&target=
[0492] ?httpd=index&these=[,]
[0493] ?httpd=index&versions=|*
[0494] SET dir=delimit=
[0495] SET dir=[no]ilink
[0496] SET dir=style=sort (plus the dir=style=2)
[0497] SET dir=sort=[+|-]
[0498] SET dir=target=
[0499] SET dir=these=[,]
[0500] SET dir=versions=|*
[0501] SET put=rfm=[STM|STMCR|UDF] added to FIX512,STMLF
[0502] "upstream-addr:" conditional
[0503] [AuthRevalidateLoginCookie] obsolete (in favour of ...)
[0504] rqptr->AuthRevalidateCount to track empty authentication
[0505] prompts preceding potential redundant revalidation prompt
[0506] [PutBinaryRFM] add STM and STMCR
[0507] [ServiceNonSSLRedirect] |[:]
[0508] some refinements to Upd..() layout and functionality
[0509] refine HTML and bring a little more up-to-date
[0510] AUTH_MAX_USERNAME_LENGTH bumped from 47 to 64 for X509
[0511] FileAcpInfoAst() '$.' file extension kludge
[0512] bugfix; AuthConfigLoadCallBack() additional [AuthProxy]
[0513] with intervening rules should reset proxies
[0514] bugfix; FileResponseHeader() "?httpd=content&type=" decoded
[0515] bugfix; MapOds..() identify MFD using "000000]" and "000000."
[0516] bugfix; AuthVmsGetUai() interaction of logon= parameters
[0517] bugfix; UpdFileRename() ACCVIO with AuthAccessEnable()
[0518] bugfix; RequestParseAndExecute2() remove reset of
[0519] request persistent flag from OPTIONS and DELETE
[0520] bugfix; SesolaInitService() (or refinement)
[0521] SSL_CTX_set_session_id_context() against each service
[0522] bugfix; DirFormatSize() bytes
[0523] bugfix; OdsParseTerminate() on non-ODS_EXTENDED platforms
[0524] (i.e. VAX) reset .nam$b_esl to changed expanded length
[0525] or it can generate RMS$_ESL errors
[0526] bugfix; DavPropSearchAst() on non-ODS_EXTENDED platforms
[0527] (i.e. VAX) reset .nam$b_rsl to changed resultant length
[0528] or it can generate RMS$_RSL errors
[0529] bugfix; non-ODS_EXTENDED platforms (e.g. VAX) must
[0530] OdsParse() NAM$M_NOCONCEAL before OdsSearchNoConceal()
[0531] bugfix; MapUrl__Map() reverse mapping wildcard copy
[0532] bugfix; CgiGenerateVariables() AUTH_GROUP write/read status
[0533] bugfix; AuthClientHostGroup() wildcard match result reversed
[0534] bugfix; ProxyResponseRebuild() call ProxyRebuildLocation()
[0535] can return a pointer to the original location!
[0536] bugfix; SesolaInit() translate WASD_SSL_CIPHER logical name
[0537] 09-NOV-2012 MGD v10.2.0,
[0538] TOKEN authorisation
[0539] request header DNT (do not track)
[0540] set ProxyReadBufferSize to 64k (per JPP)
[0541] allow (proxy) ResponseBufferSize to be >= 64k (per JPP)
[0542] HttpdSystemInfo() $GETSYIW() CsidVersion treat status
[0543] SS$_UNREACHABLE as non-fatal and fallback to 16 byte LVB
[0544] DIGEST.C numerious tweaks up to RFC2069
[0545] [AuthTokenEntriesMax] for token authorisation
[0546] bugfix; HTAdminModifyUser() use database name for digest
[0547] bugfix; AuthorizeResponse() digest scheme
[0548] bugfix; AuthVmsGetUai() logon= fall through
[0549] bugfix; DclSysOutputAst() WebSocket wrt agent
[0550] bugfix; WebSockEnd() do not NetCloseSocket()
[0551] bugfix; (at least improve) caching of group write/read
[0552] bugfix; SesolaParseCertDn() return NULL if record not found
[0553] bugfix; AuthorizeGroupWrite() with cached entries!
[0554] bugfix; AuthReadSimpleList() parameter /DIRECTORY= processing
[0555] 28-APR-2012 MGD v10.1.1,
[0556] RequestGet() no longer report 408 for unused connections
[0557] RequestEndEnd() likewise ignore unused connections (Chrome)
[0558] MetaConLoad() compress non-signficant white-space
[0559] proxy WebSocket upgrade requests as raw tunnels (kludge)
[0560] DclRestartScript() refine WebSocket handling
[0561] DirFormatSize() now uses quadword
[0562] DirFormatSize() adjusts units to fit size width
[0563] MATCH0..8() macro to improve efficiency over memcmp()
[0564] SAME1..4() macro to abstract the *(USHORTPTR)s, etc.
[0565] bugfix; RequestBegin() remove RequestEnd() following failed
[0566] SesolaNetBegin() resulted in redundant request rundown
[0567] bugfix; SesolaNetAccept() initialise value=0
[0568] bugfix; SesolaNetRead() SSL state not SSL_ST_OK
[0569] bugfix; SesolaNetWrite() SSL state not SSL_ST_OK
[0570] bugfix; DavWebMicrosoftMunge2() token reprocessing
[0571] bugfix; FileAcpInfoAst() SS$_BADPARAM >2GB <4GB (per JPP)
[0572] bugfix; WebSockCloseMailboxes() logic
[0573] bugfix; DclScriptProcessCompletionAST() don't WebSockClose()
[0574] any WebSocket request currrently associated with the task
[0575] bugfix; RequestEndEnd() '->WebSocketCount' already locked
[0576] 06-NOV-2011 MGD v10.1.0,
[0577] dragged kicking and screaming to VMS V7.0 base build
[0578] Web Socket (HTML5) support
[0579] Secure Sockets default to SSL v3 and TLS v1 (no more SSL v2)
[0580] SET cache=[no]cookie
[0581] SET map=uri
[0582] SET proxy=chain=cred=
[0583] SET proxy=tunnel=request=
[0584] SET regex=
[0585] SET response=HTTP=original
[0586] SET service=
[0587] SET notimeout (short-hand for timeout=none,none,none)
[0588] SET websocket=
[0589] "origin:" conditional
[0590] "request-peek:" conditional
[0591] "upgrade:" conditional
[0592] "websocket:" conditional
[0593] [DclScriptProctor] (pro-)activate script/environments
[0594] [RegEx] enabled/disabled/
[0595] [ServiceProxyChainCred] down-stream proxy credentials
[0596] [WwwImplied] "www." is implied even with virtual services
[0597] ("Host:") not beginning with it (ServiceFindVirtual())
[0598] callout LIFETIME: can accept
[0599] callout SCRIPT-CONTROL:string (see DCL.C)
[0600] logging 'PP' outgoing proxy connection local port
[0601] /DO=ALIGN=.. to allow collection and analysis of Alpha and
[0602] Itanium alignment fault data using HttpdAlignFault() et.al.
[0603] /DO=NET=PURGE[=..] expanded capability
[0604] /DO=WEBSOCKET=DISCONNECT[=..] to disconnect WebSockets
[0605] /PRIORITY= limit increased from 6 to 15
[0606] SesolaInit() default is SSLv2 off and SSLv3/TLSv1 on
[0607] AuthAgentCallout() callout BODY implemented (for PAPI)
[0608] MapOdsUrlTo..() consecutive '/' into a single a la Unix
[0609] ServiceReportNow() service synopsis
[0610] ProxyTunnelChainConnect() chain proxy authorization
[0611] ProxyRequestRebuild() chain proxy authorization (BASIC only)
[0612] ServiceReportNow() add summary to service report
[0613] configuration lines beginning "!#" now allow WATCHable
[0614] during mapping and authorisation processing
[0615] reworked query string handling based on length
[0616] ServiceEntityMatch() processes in-match and if-not-match
[0617] CacheSearch() implement request cache control
[0618] CacheLoadResponse() checks response header for
[0619] "Cache-Control:" directives and adjusts accordingly
[0620] CacheLoadEnd() buffer all content-type data
[0621] (previous behaviour truncated at ';' or white-space)
[0622] MetaConLoad() ensure metacon "lines" are quadword aligned
[0623] __unaligned directive added to pointer macros in a
[0624] (successful) effort to avoid alignment faults
[0625] VM_OFFSET now 8 (quadword alignment) instead of 4
[0626] bugfix; OdsFileExists() parse NAM$M_NOCONCEAL in case of
[0627] multi-valued, concealed logical devices and then convert
[0628] returned status DNF into the functional equivalent FNF
[0629] bugfix; directory listing OdsSearchNoConceal() to
[0630] process concealed, multi-value logical device names
[0631] bugfix; RequestRedirect() only concat '&' if including query
[0632] bugfix; set rule 'CacheSetting' boolean with any CACHE=..
[0633] 02-OCT-2010 MGD v10.0.3,
[0634] command-line checks of configuration files
[0635] /DO=AUTH=CHECK /DO=CONFIG=CHECK (all configuration files)
[0636] /DO=GLOBAL=CHECK /DO=MAP=CHECK /DO=MSG=CHECK
[0637] /DO=SERVICE=CHECK
[0638] TcpIp6..() functions to resolve IPv6 AAAA records
[0639] ProxyRequestParse() improve IPv6 host parsing
[0640] bugfix; regression at 10.0.1 with proxy authorization
[0641] bugfix; SSL_set_info_callback() not SSL_CTX_set..()
[0642] 01-JUL-2010 MGD v10.0.2,
[0643] metacon "file:" and "directory:" to probe file-system
[0644] SET script=lifetime=
[0645] SET put=max= per-path equivalent of [PutMaxKbytes]
[0646] SET put=max=* for (effectively) unlimited upload
[0647] BODY.C significant rework to function()alise common code
[0648] BODY.C improve performance with multiblock of 127 (per JPP)
[0649] BODY.C make MultipartContentType(Ptr) a dynamic structure
[0650] as Microsoft endeavour to include application data
[0651] along with MIME content-type, see ...
[0652] http://msdn.microsoft.com/en-us/library/aa338205.aspx
[0653] and an example (no kidding!) ...
[0654] "application/vnd.ms.powerpoint.template.macroEnabled.12application/x-font"
[0655] FileNextBlocks() change QIO file size from long to quad
[0656] to cater for files greater than 4GB (4GB+ is limited to
[0657] file serving only, no ranges, etc.)
[0658] RequestExecutePostCache() UTF-8 decode WebDAV objects
[0659] RequestRedirect() support WebDAV "Destination:" field (JPP)
[0660] DclAllocateTask() default unconfigured CGIplus lifetime
[0661] SsiDoSet() and SsiGetTagValue() allow '$' in variable names
[0662] Mapurl_ControlReload() rather than Mapurl_Load()
[0663] bugfix; MapUrl_ControlReload()
[0664] bugfix; DclUpdateScriptNameCache() run-time pointer
[0665] bugfix; OdsNamBlockAst() odsptr->NamFileSysNamePtr
[0666] always set to odsptr->SysFileName in case RMS$_FNF, etc.
[0667] bugfix; RequestGet() MAX_REQUEST_HEADER (per JPP)
[0668] bugfix; allow METACON_TOKEN_INCLUDE for [IncludeFile]
[0669] bugfix; MetaConEvaluate() when JustChecking: HTTP header
[0670] fields (e.g. "cookie:")
[0671] bugfix; DavMetaReadName() and DavMetaWriteName()
[0672] allow for typeless file names (e.g. ]AFILE.;)
[0673] bugfix; PutWriteFileOpen() ensure SYSPRV enabled before
[0674] $ERASE() if not WebDAV request (access and ownership) (JPP)
[0675] bugfix; DavWebSlashlessMunge() enable SYSPRV while
[0676] calling OdsFileExists() (per JPP)
[0677] bugfix; do not use REDIRECT for WebDAV request error report
[0678] bugfix; no new token when refreshing existing lock (per JPP)
[0679] bugfix; FileNextBlocks() signed/unsigned comparison
[0680] when calculating buffer size on files larger than 2^31
[0681] bugfix; MapOdsUrlToOds5Vms() MapOdsElementsToVms()
[0682] include '|' and '%' as ODS-5 escaped characters
[0683] bugfix; DirAuthorizationAst() only check access on
[0684] non-empty expanded file names
[0685] bugfix; PutWriteFileOpen() ensure SYSPRV enabled before
[0686] $CREATE() if not WebDAV request (for access and ownership)
[0687] bugfix; FileNextBlocks() signed/unsigned comparison
[0688] when calculating buffer size on files larger than 2^31
[0689] bugfix; MapOdsUrlToOds5Vms() MapOdsElementsToVms()
[0690] include '|' as an ODS-5 escaped character
[0691] bugfix; DirAuthorizationAst() only check access on
[0692] non-empty expanded file names
[0693] bugfix; PutWriteFileOpen() ensure SYSPRV enabled before
[0694] $CREATE() if not WebDAV request (for access and ownership)
[0695] bugfix; DirBegin() "httpd=index&" detection (since v9.3.0)
[0696] bugfix; DirEnd() suppress