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_CSP_NONCE=d0f468fb488e45a64a8b7b37fadb2ad
WWW_DOCUMENT_ROOT=
WWW_GATEWAY_INTERFACE=CGI/1.1
WWW_GATEWAY_EOF=$Z-F61E87ED2B46E1CA230410C3-
WWW_GATEWAY_EOT=$D-4FDE532892699F093AB0CF36-
WWW_GATEWAY_ESC=$E-C951AC3F08652174FD22ADE5-
WWW_GATEWAY_MRS=4492
WWW_GATEWAY_QIO=30660
WWW_HTTP_ACCEPT=*/*
WWW_HTTP_USER_AGENT=Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
WWW_HTTP_ACCEPT_ENCODING=gzip, br, zstd, deflate
WWW_HTTP_HOST=vsmx86.vsm.com.au
WWW_HTTP_VIA=1.1 squid-proxy-5b5d847c96-dchd6 (squid/6.13)
WWW_HTTP_X_FORWARDED_FOR=10.1.240.213
WWW_HTTP_CACHE_CONTROL=max-age=0
WWW_HTTP_CONNECTION=keep-alive
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=216.73.216.57
WWW_REMOTE_HOST=216.73.216.57
WWW_REMOTE_PORT=45458
WWW_REMOTE_USER=
WWW_REQUEST_METHOD=GET
WWW_REQUEST_PROTOCOL=HTTP/1.1
WWW_REQUEST_SCHEME=http:
WWW_REQUEST_TIME_GMT=Thu, 16 Apr 2026 03:37:59 GMT
WWW_REQUEST_TIME_LOCAL=Thu, 16 Apr 2026 13:07:59
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=119.252.17.11
WWW_SERVER_CHARSET=ISO-8859-1
WWW_SERVER_GMT=+09:30
WWW_SERVER_NAME=vsmx86.vsm.com.au
WWW_SERVER_PROTOCOL=HTTP/1.1
WWW_SERVER_PORT=80
WWW_SERVER_SIGNATURE=
WASD/12.4.0 Server at vsmx86.vsm.com.au Port 80
WWW_SERVER_SOFTWARE=HTTPd-WASD/12.4.0 OpenVMS/X86 SSL
WWW_UNIQUE_ID=c3d34da759442aa102d
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] 31-DEC-2025 MGD v12.4.0,
[0009] simplify request timer management
[0010] remove 'state' maintenance in favour of 'event' model (again)
[0011] TcpIpSetKeepAlive() keep-alive on sockets (default enabled)
[0012] DclPrcUserName() implicitly and explicitly by ErrorNoticed()
[0013] avoid potential AST delivery issue using SesolaAcmeShut()
[0014] SSL_CTX_set_ecdh_auto() in lieu of SesolaTmpDHCallback()
[0015] DclCgiScriptSysCommand() activation based on RTE file type
[0016] SesolaAcmeAgentEnd() report SYNCH (success) rather than ABORT
[0017] (failure) after SSL_do_handshake() as it seems to work
[0018] avoid potential AST delivery issue using SesolaAcmeShut()
[0019] BUILD_HTTPD.COM (used directly) eliminates "WASD_VMS_V7"
[0020] with proxy gutted; it's all about tunnels and socks
[0021] add NetRequest() $CONNECT and $REQUEST directives
[0022] $DELPRC(0,0) replaced by $EXIT(SS$_OPRABORT) in concert
[0023] with STARTUP_SERVER.COM for implementing /DO=EXIT
[0024] bugfix; SesolaAcmeTls1() remove HttpdTimerSet()
[0025] bugfix; HttpdSupervisor() was not calling ThrottleTimeout()
[0026] bugfix; HttpdCheckPriv() pmptr from HttpdExpectedPriv()
[0027] bugfix; NetUpdateProcessing() in RequestGet(), RequestEnd2()
[0028] bugfix; confusion (compiler as well) between
[0029] NetCurrentProcessing and NetCurrentProcessing[] resulted
[0030] in poor (wrong!) current processing totals
[0031] bugfix; a classic! TcpIpRcvBufLength, TcpIpSndBufLength,
[0032] TcpIpMaxSegLength should be ints not words
[0033] Uncovered by Richard Whalen PSC during X86 MultiNet devel
[0034] bugfix; do not suppress output for HTTP/0.9 (especially HEAD)
[0035] bugfix; GraphActivityReport() allow /max-requests
[0036] bugfix; obscure CGI variable initialisation (X86?)
[0037] 03-DEC-2024 MGD v12.3.0,
[0038] /DO=AUTH=SKELKEY= extend skeleton-key functionality
[0039] WATCH now can generate standlone report file
[0040] WATCH can collect data in a "detached" mode
[0041] WATCH can collect data after network "trigger"
[0042] WATCH cipher octets only when [x]SSL is checked
[0043] WATCH "rabbit hole" restriction removed with revised strategy
[0044] /DO=ZERO=HTTP2
[0045] refine HTTP/2 flow control
[0046] Http2FlowCheck() and WASD_HTTP2_FLOW_CHECK logical name
[0047] [SRC.LIBZ] and WASD_LIBZ_SHR32
[0048] HttpdSystemInfo() SYI$_CPUID to get underlying x86-64 CPU
[0049] refine/expand server process log reports
[0050] RequestLogNBG() to access log NBG request
[0051] TcpIpSocketMaxQio() remove TLS-specific ->TcpMaxQio
[0052] SesolaNetIoPerMinute() allows socket read size to be set
[0053] SesolaCme.c supports ALPN-TLS-01 (acme-tls/1)
[0054] DclMemBuf.C as promised (in 2017)) counters moved to accounting
[0055] proxy FTP obsolete
[0056] bugfix; DclTaskRunDown() REQUEST_STATE_SHUTDOWN rare $FORCEX
[0057] bugfix; DirFormatLayout() return SS$_RESULTOVF
[0058] bugfix; FileNextBlocks() StrDscBegin()
[0059] bugfix; DclScriptProcessCompletionAST() remove IO$_WRITEOF
[0060] bugfix; RequestEnd2() some statistics
[0061] bugfix; RequestDiscardBody() regression
[0062] bugfix; LoggingDo() abs(rqptr->rqResponse.Duration64)
[0063] bugfix; Sesola_netio_read_ex() ->TcpMaxQio to ->TcpMaxSeg
[0064] subtly broke (very) large reads, back to v12.0.0 strategy
[0065] bugfix; request I/O accounting with HTTP/2
[0066] bugfix; HpackHeadersFrame() >= CookieSize
[0067] bugfix; allow service name devoid of alphabetics (e.g. 10-8.)
[0068] bugfix; ProxyTunnelLogicalName() SYSNAM for PSL$C_EXEC
[0069] bugfix; DECnetSupervisor() remove orphaned tasks
[0070] 16-JAN-2024 MGD v12.2.0,
[0071] OpenSSL 3.0.n now the baseline supported version
[0072] Can still be built and run against OpenSSL 1.1.1
[0073] OpenSSL TLS 1.3 requires SSL_CTX_set_cipher_suites()
[0074] OpenSSL v1.1.1 emulate v3.0.n OSSL_default_ciphersuites()
[0075] and OSSL_default_cipher_list()
[0076] GATEWAY_SYMBOLS standard CGI variable
[0077] #WASD_CONFIG_GLOBAL [Accept] and [Reject] now accept file
[0078] specifications allowing files of patterns to be loaded
[0079] /DO=ACCEPT and /DO=REJECT allow reloading of above
[0080] /DO=REJECT=PURGE[=] allows purging of $STATUS IPs
[0081] NetReject..() module allows more sophisticated accept/reject
[0082] allow CIDR n.n.n.n/n patterns
[0083] allow IP range n.n.n.n-n.n.n.n patterns
[0084] $DNS, $LOG, $NOTE, $OPCOM, $4/5nn with $400, $403
[0085] $4/5nn maps a specific HTTP status to rejected IPs
[0086] [SSLcipherSuites] for TLSv1.3
[0087] [ServiceSSLcipherSuites] for TLSv1.3
[0088] [AuthParam] and AuthConfigParam() provides per-realm params
[0089] FaolSAK() 'UQ' and 'XQ' unsigned and hexdeciaml quadwords
[0090] SesolaCertVerifyCallback() and SesolaClientCert() use new
[0091] algorithm for determining client certificate validity
[0092] X509 Authorization parameters can now include
[0093] [IG:] will ignore client cert verification
[0094] error number returned during the verification process
[0095] (see prologue to AuthConfigParam())
[0096] logical name WASD_WATCH_ONE_SHOT defines one-shot items
[0097] ensure all WASD_ROOT:[] are WASD_:
[0098] HttpdSysOutDaily() per-day progessive snapshot of server log
[0099] Http2Supervisor() mitigate Rapid Reset CVE-2023-44487
[0100] DclTaskRecover() periodically recover scripting resources
[0101] HTTP/2 refinements using https://github.com/summerwind/h2spec
[0102] bugfix; DirFormatAcpInfoAst() 64 bit file size
[0103] bugfix; FileAcpInfoAst() 64 bit file size
[0104] bugfix; DavPropLive() 64 bit file size
[0105] bugfix; SesolaWatchPeek() do NOT SSL_free()!
[0106] bugfix; braindead SesolaServiceSameCA()
[0107] bugfix; OdsDirect() [again!]
[0108] if (odsptr->DirectWildcard[0] &&
[0109] !odsptr->DirectVersion0)
[0110] status = RMS$_NMF;
[0111] 08-JAN-2023 MGD v12.1.0,
[0112] WASD_CONFIG_INLINE configuration file
[0113] SESOLA123 and SESOLA321 to allow OpenSSL-3.0 and
[0114] OpenSSL-1.1.1 to be built using the same object code
[0115] SesolaServiceSameCA() mitigate OpenSSL-3.0 expense
[0116] TcpIpSocketMaxQio() adjust send buffer 2x (unless explicit)
[0117] TcpIpSocketSndBuf() and ..RcvBuf() selectively applied
[0118] ResponseHeader() default "content-security-policy:"
[0119] move onclick=s to addEventListener()s to support
[0120] content-security-policy: 'strict-dynamic'
[0121] NetListFor() include client IP port, rework truncation
[0122] AdminMenu() [Request+] report
[0123] NetWrite() drop any and all HTTP status 418 (e.g. DCL script)
[0124] Sesola..() remove code support prior to OpenSSL 1.1.0
[0125] SysLogInit() and SysLogOpcom() and WASD_SYSLOG logical name
[0126] OdsAccessCheck() and logical name WASD_ODS_ACCESS_CHECK
[0127] metacon remote-addr: and remote-name: tests if DNS resolution
[0128] succeeded (if equal then name equals address and failed)
[0129] RequestDiscardBody() use ->rqBody.ContentCount64
[0130] DECnetEnd() "solution" to obscure corner-case behaviour
[0131] [NoticeInvalid] global configuration
[0132] /DO=NOTICE=INVALID=
[0133] /DO=OPCOM=""
[0134] pre-v10.0 file name munging via v10orPrev10() eliminated
[0135] while every care has been exercised with null-terminated
[0136] string overflow; strzcpy() and strzcat() now ubiquitous
[0137] bugfix; PutDelete() missing OdsStructInit(&SearchOds,true);
[0138] bugfix; NetAbortSocket() deliver any outstanding read and/or
[0139] write ASTs (especially for HTTP/2 streams)
[0140] bugfix; ProxyTunnelLogicalName(NULL) from HttpdTick()
[0141] bugfix; HttpdSupervisor() HTTP/2 request timeout/no-progress
[0142] bugfix; ProxyTunnelBegin() not ProxyTunnelRebuildRequest()
[0143] PROXY_TUNNEL_HTTP and PROXY_TUNNEL_HTTPS should NetRead()
[0144] bugfix; DECnetWriteRequestBody() tkptr->QueuedDECnetIO++;
[0145] 05-OCT-2022 MGD v12.0.1,
[0146] strsame() now implemented using str[n]casecmp()
[0147] bugfix; OdsDirect() end of records (-1) in end file block
[0148] bugfix; when using file cache magic buffers
[0149] bugfix; AuthorizeRealm() greater-than not -or-equal-to
[0150] ->LastAccessMinutesAgo > ->rqAuth.RevalidateTimeout
[0151] 23-OCT-2021 MGD v12.0.0,
[0152] So long, farewell, Auf Wiedersehen, goodnight (-VAX)
[0153] (comprehensive move to native 64 bit data storage)
[0154] continuing port to x86-64 (OpenVMS V9.1-A)
[0155] verified builds against and operates with OpenSSL 3.0
[0156] (but not offically supported due to OpenSSL 3.0 issues)
[0157] accomodate PIPE from WASD_ROOT:[SRC.UTILS]WASTEE.C
[0158] TcpIpAlt..() experimental address/name lookup
[0159] BSD 4.4 sockaddr.. IO$M_EXTEND to $QIO (per MB)
[0160] proxy caching has been obsoleted
[0161] proxy SOCKS5 connect support
[0162] scripting process naming revised (perhaps even enhanced)
[0163] agent scripting extended and formalised for v12...
[0164] AGENT-BEGIN: and AGENT-END: callouts
[0165] CGI: and DICT: callouts
[0166] /DO=DCL=PROCTOR=APPLY
[0167] /DO=DCL=PROCTOR=LOAD
[0168] /DO=NET=LIST
[0169] /DO=NET=PURGE=HTTP1
[0170] /DO=NET=PURGE=HTTP2
[0171] logging 'XX:blb' visual aid
[0172] AdminPing() provides a baseline RTT for request processing
[0173] SET proxy=rework= (replacement strings for response)
[0174] SET response=var=asis (provide exact image of on-disk file)
[0175] SET webdav=all (process all requests via WebDAV code)
[0176] SET webdav=auth (authorise access using WebDAV SETings)
[0177] metacon webdav:all (SETing of above)
[0178] metacon webdav:auth (SETing of above)
[0179] pass /whatever "200 $" executes CLI command
[0180] !#-- and !#++ selectively disable/(re)enable WATCH reporting
[0181] [ServiceConnect] respond to a connection on a port
[0182] WATCH: proctored script by checking only [x]Script
[0183] OdsFileAcpInfo() ATR$C_MODDATE (date-time *data* modified)
[0184] supplements ATR$C_REVDATE (classic revision date-time)
[0185] callout HTTP-STATUS: detect if a script has responded yet
[0186] DavWebRequest() specifically handle WebDAV GET and HEAD
[0187] DavMetaOds() ensure extended syntax only used ODS-5 volumes
[0188] AuthAccessEnable() file access use (rqptr->WebDavRequest ||
[0189] rqptr->WhiffOfWebDav || rqptr->rqPathSet.WebDavAuth)
[0190] AuthParseAuthorization() return AUTH_DENIED_BY_LOGIN
[0191] if unknown scheme allowing 401 response rather than 403
[0192] FaoBigNumber() '&,' optionally numbers 'P', 'G', 'M', 'k'
[0193] SesolaMkCertRetain() stores dynamic cert in process logical
[0194] WatchData() and WatchDataDump() constrain length
[0195] NetListFor() use of $BRKTHRU requires OPER privilege
[0196] bugfix; Http2Supervisor() idle connection
[0197] bugfix; SesolaNetIoRead() /bytes = value/
[0198] bugfix; FileBegin() ERROR_REPORTED() free file task
[0199] bugfix; CliDemo and instance environment number (per KM)
[0200] bugfix; CgiGenerateVariables() "AUTHAGENT hangs when called
[0201] for a POST request" (per JPP)
[0202] bugfix; DclCalloutDefault() CLIENT-READ:
[0203] bugfix; AdminMenu() activity hours 672
[0204] bugfix; MapOdsAdsVmsToUrl() "if (SAME2(cptr,':['))"
[0205] bugfix; OdsDirectSearch() appending the resultant file name
[0206] to the pre-filled expanded name
[0207] bugfix; DavMetaCreateDir() and DavMetaDeleteDir()
[0208] allow for non-existant meta data files
[0209] bugfix; DavMetaName() no meta directory
[0210] bugfix; ErrorReportFooter() use request heap for signature
[0211] 17-AUG-2020 MGD v11.5.1,
[0212] Http2RequestData() reduce memory consumption
[0213] HTTP2_DEFAULT_WINDOW_SIZE from 1048575 to 131070
[0214] if no service configured create http: and https: ex nihilo
[0215] VmCheckPgFlLimit() and WASD_VM_PGFL_LIMIT logical name
[0216] keep connect cert (->VerifyPeer) distinct from client cert
[0217] bugfix; ProxyEnd() fix NetIoEnd() fix
[0218] bugfix; OdsDirectSearch() if wildcard specification
[0219] return RMS$_NMF, otherwise RMS$_FNF (seems so elementary)
[0220] bugfix; Http2RequestCancel() cancel and abort
[0221] bugfix; RequestEnd() redirection
[0222] bugfix; SesolaALPNCallback() 'h2' global and service enabled
[0223] bugfix; ControlDoHelp() remove non-existant DISCONNECT=..
[0224] bugfix; RequestExecutePostAuth1() INTERNAL_PASSWORD_CHANGE
[0225] should call HtAdminBegin() not AdminBegin()
[0226] bugfix; SesolaSNICallback() needs to propagate newly set
[0227] context client verify parameters to SSL-specific
[0228] bugfix; SesolaNetFree() ensure (sigh) X509_free() where
[0229] ->ClientCertPtr associated with connection (i.e. HTTP/2)
[0230] bugfix; RequestParseExecute() ensure PUT and DELETE have
[0231] WebDAV header field(s) before considering WebDAV
[0232] 22-JUL-2020 MGD v11.5.0, "Stay well..."
[0233] static fallback cert replaced by dynamic SesolaMkCert()
[0234] protocol "HTTP/2" also reported in standard log formats
[0235] DavWebRequest() remove requirement for logical name
[0236] WASD_HTTP2_WEBDAV after WebDAV over HTTP/2 tested
[0237] NetIoQioMaxSeg() tune QIO to TCP MSS
[0238] verified against VSI SSL111 product
[0239] SET response=c sp= ("content-security-policy:")
[0240] https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
[0241] SET response=cspro= ("..policy-report-only:")
[0242] metacon alpn: (TLS application level protocol negotiation)
[0243] metacon proctor: (obvious proctored script clause)
[0244] DCL callout CSP: ("content-security-policy:")
[0245] DCL callout CSPRO: ("..policy-report-only:")
[0246] REGEX.C updated (ever-so-slightly)
[0247] more proxy persistent connection (per JPP)
[0248] RequestAbort() accomodates HttpdSupervisor() refinement
[0249] and REQUEST_STATE_ABORT used throughout server
[0250] Http2RequestData() delivers Http2RequestCancel() read AST
[0251] NetTestSupevisor() and WASD_NET_TEST_BREAK logical name
[0252] bugfix; ProxyEnd() free ioptr using NetIoEnd()
[0253] bugfix; NetIoWriteStatus() and NetIoReadStatus()
[0254] bugfix; RequestPersistentConnection() pipelined request
[0255] bugfix; Http2RequestData() flow control
[0256] bugfix; SesolaClientCertGet() SSL_VERIFY_POST_HANDSHAKE
[0257] bugfix; httpd.c if (!CliDemo) HttpdGblSecInit();
[0258] bugfix; MetaConConditionalList() bu**ered
[0259] bugfix; RequestProcessFields() DictLookup (.."accept"..)
[0260] bugfix; SesolaCertExtension() BIO_NOCLOSE memory leak
[0261] bugfix; CacheLoadEnd() free rqCache.ContentPtr on fail
[0262] bugfix; DICT.C "tmptr && tmptr->clink.."
[0263] bugfix; Http2Priority() exclusive bit
[0264] bugfix; NetCreateService() only SesolaInitService() once
[0265] bugfix; WatchDataDump() CHARS_PER_LINE calculation (sigh)
[0266] bugfix; OdsDirectSearch() RMS$_FNF not RMS$_NMF (per JPP)
[0267] bugfix; RequestShareBegin() if (!MATCH6 (cptr, "raw://"))
[0268] bugfix; SesolaNetClientBegin() SESOLA_SINCE_110
[0269] BIO_set_data() before SSL_set_bio() (per JPP)
[0270] bugfix; AdminParsePath() extraneous OdsParseRelease()
[0271] bugfix; OdsDirectSearch() only if not already on the block
[0272] boundary add one to get to next, otherwise already there!
[0273] 20-JUL-2019 MGD v11.4.0, "One small step ..."
[0274] 25th Anniversary Release (see 20-JUN-1994 below)
[0275] adapt WatchSystemPlus() to allow use via CLI /SYSPLUS
[0276] then dignified with a (sysPlus..()) module of its very own
[0277] /OUTPUT= (in particular for /SYSPLUS)
[0278] HttpdSupervisor() explicitly WatchEnd()
[0279] Sesola_netio_read() and Sesola_netio_write() if connection
[0280] broken (channel zero) return zero (SSL shutdown)
[0281] SET response=200=203 for request tracking and log analysis
[0282] ResponseHiss() response status changed from 403 to 203
[0283] status code 418 (teapot) forces connection drop
[0284] allow a specified port when redirecting, i.e. http[s]//:nnn
[0285] Sesola_netio_read_ast() 0 status TCP/IP Services?
[0286] Sesola_netio_write_ast() 0 status TCP/IP Services?
[0287] bugfix; SesolaClientCertGet() status 0 an issue
[0288] bugfix; SesolaClientCertGet() if (value <= 0) break;
[0289] bugfix; CgiOutput() Content-Length: strtoul()
[0290] bugfix; SesolaClientCert() allow pattern per 25-AUG-2015
[0291] bugfix; SesolaCertExtension() storage reset
[0292] bugfix; SesolaCertParseDn() regression (or whatever)
[0293] bugfix; Http2NetQueueWrite() PEEK_8 at w2ptr->type
[0294] bugfix; non-local without "Host:" use name not host:port
[0295] bugfix; Http2RequestEnd() copy tally rx/tx to request
[0296] bugfix; OdsDirectSearch() (uint)0xffff && rlen < 508)
[0297] bugfix; AuthCompleted() and AuthNotComplete() to address
[0298] AST delivery following request end and rundown
[0299] bugfix; for bugfix StringSliceValue() kludge
[0300] allow for DECnet connection string specified username
[0301] bugfix; DavMetaDir() ACCVIO from !SAME2(mfdptr,'[.')
[0302] 24-NOV-2018 MGD v11.3.0
[0303] verified against OpenSSL v1.0.2 && v1.1.0 && v1.1.1
[0304] TLSv1.3 operational
[0305] verified against EXPAT v2.2.5 (for WebDAV purposes)
[0306] (but reverted to v2.0.1 for final VAX WASD release)
[0307] VM.C eliminate dynamic tuning of heap initial allocation
[0308] and rework to allow detailed memory management statistics
[0309] to be compiled into the runtime for development purposes
[0310] ODS (FILES-11) directory parser
[0311] WatchSystemPlus() et.al. for system troubleshooting
[0312] RequestBegin() exit after consecutive SesolaNetBegin() fails
[0313] DavWebRundown() explicitly abort WebDAV processing
[0314] allow logical name content during one-to-one rule mapping
[0315] refactor WatchWrite() using NetWriteBuffered()
[0316] DclTaskRunDown() always use DclEmptySysOutput()
[0317] [BufferQuotaDclOutput] BUFQUO value for SYS$OUTPUT mailbox
[0318] refactor Http2RequestCancel() into Http2RequestCancelRead()
[0319] and Http2RequestCancelWrite()
[0320] ProxyRequestRebuild() proxy-authorization opaque:
[0321] ProxyTunnelLogicalName() WASD_TUNNEL_SECONDS
[0322] RequestGet() and ProxyTunnelNetReadAst() provide
[0323] "X-Forwarded-For:" client host to proxied-to server
[0324] /DO=REQUEST=RUNDOWN=..
[0325] /DO=ZERO=STATUS
[0326] /DO=SSL=SERVICE=LOAD[=] no longer works
[0327] SET response=var=crlf
[0328] SET response=var=lf
[0329] SET response=var=none
[0330] bugfix; PutWriteFileOpen() override incompatible existing
[0331] file characteristics by first erasing the file
[0332] bugfix; seeming innumerable WebDAV fixes (some obvious,
[0333] some obscure) many thanks to John Dite for his patience and
[0334] persistence in finding and reporting anomalous behaviours
[0335] (check the individual DAV...C modules for descriptions)
[0336] bugfix; StringSliceValue() kludge for DECnet tasks
[0337] bugfix; MetaConEvaluate() "webdav:MSagent"
[0338] bugfix; DavWebMicrosoftDetect() before ->WebDavTaskPtr
[0339] bugfix; X509_free() memory leak with ->ClientCertPtr
[0340] bugfix; Http2NetIoWrite() blocking write data must be
[0341] asynchronously persistent so employ internal buffer(s)
[0342] bugfix; /DO=AUTH=SKELKEY=.. cluster wide (yet again :-)
[0343] bugfix; SESOLA-OpenSSL memory leak at v11.0.0
[0344] bugfix; FileParseAst() regression with search list file
[0345] bugfix; RequestRundown() allow for cache activity
[0346] bugfix; WatchDataDump() CHARS_PER_LINE calculation
[0347] bugfix; (longstanding) MapUrl__Map() multiple template
[0348] wildcards when reverse mapping
[0349] 01-MAR-2018 MGD v11.2.0
[0350] make WATCH item width flexible using initial value 6 digits
[0351] with leading 3 digits HTTP/2 stream ID followed by 3 digits
[0352] connection ID number and on overflow increment by 2
[0353] if |WASD_ENV| defined use that in absence of /ENV=..
[0354] Dav..() always DavWebEnd() not RequestEnd()
[0355] WebDAV "authorisation" allowed to be EXTERNAL or OPAQUE
[0356] RequestRundown() outstanding task sanity checks
[0357] HttpdSupervisor() refactored timeout handling
[0358] ProxyTunnelLogicalName() and WASD_TUNNEL to provide client
[0359] host and port tunnel data available to the WASD system
[0360] activated by SET..PROXY=FORWARDED=[FOR|ADDRESS]
[0361] logging 'II' image information (file, version, link time)
[0362] logging 'TI' request time in ISO 8601 extended format
[0363] logging 'TS' (sortable) UTC request time ISO 8601 format
[0364] logging 'TU' request time UTC (GMT) now synonym for 'TG'
[0365] stamp (note) log events when common/combined with/without+
[0366] SET DIR=TITLE=[default|owner|remote||this=]
[0367] /DO=HELP brief summary of command-line /DOs
[0368] /DO=SSL=SERVICE=LOAD[= (re)load SSL context
[0369] (/DO=SSL=CERT=LOAD is now implemented using this)
[0370] /DO=STATUS report basic status of all instances
[0371] /DO=STATUS=NOW instances immediately update status information
[0372] /DO=STATUS=PURGE zero stale instance status information
[0373] /DO=STATUS=RESET zero instance status information
[0374] /NOTE= annotation to server process log
[0375] refactor WatchEnd() (yet again)
[0376] DclInit() do not adjust SYS$OUTPUT mailbox size when HTTP/2
[0377] is enabled, issue an informational as required
[0378] DclMemBuf..() memory buffer script IPC (see DCLMEMBUF.C)
[0379] callout BUFFER-BEGIN:
[0380] callout BUFFER-END:
[0381] callout BUFFER-WRITE:
[0382] SesolaReport() allow reporting using an HTTP service
[0383] CgiOutput() refine Content-Length: to report out-of-range
[0384] CgiOutput() reject subsequent non-header
[0385] WatchReport() move SSL item into Network group
[0386] WatchShowCluster() and WatchShowSystem() VMS V6.2 obsolete
[0387] bugfix; (longstanding) InstanceSocketForAdmin() sys$deq()
[0388] bugfix; Http2..() window update and flow control management
[0389] bugfix; logging 'BB' header length "lost" during HTTP/2 mods
[0390] bugfix; nil content CGI responses not delivered
[0391] bugfix; (long-standing) always use UpdEnd() not SysDclAst()
[0392] bugfix; CgiGenerateVariables()
[0393] |rqptr->rqAuth.SourceRealm != AUTH_SOURCE_AGENT_OPAQUE &&|
[0394] 09-AUG-2017 MGD v11.1.1
[0395] relax HTTP/2 "rabbit hole" to permit WATCHing except
[0396] for items [x]HTTP/2, [x]SSL and [x]network
[0397] /INSTANCE=CONFIG ensures config values used
[0398] SesolaClientCertRenegotiate() allow for pre- and post-
[0399] OpenSSL 1.1.0 due to MSIE11 (Edge) stalling on a read
[0400] after renegotiation (pre reverts to v11.0 and earlier code)
[0401] SesolaInitService() when SSL_CTX_set_tmp_dh_callback() is
[0402] enabled (DH_PARAM_*.PEM files present) ensure flag
[0403] SSL_OP_CIPHER_SERVER_PREFERENCE is implicitly set
[0404] MapUrl_GuaranteeAccess() mapping as well as authorisation
[0405] Authorize() move AuthorizeGuaranteeAccess() up-front to
[0406] ensure access to guaranteed paths not only with failure
[0407] StringSliceValue() allow quote-delim inside space-delimited
[0408] bugfix; rationalise as OpenSSL_version[_num]() becomes
[0409] confused catering for OpenSSL v1.0.2 && v1.1.0 && v1.1.1
[0410] bugfix; HttpdSupervisor() do RequestRundown() only the once
[0411] bugfix; DclCalloutDefault() NOTICED: and OPCOM: responses
[0412] bugfix; DclScriptProctor() request is not actually "!!*!"
[0413] bugfix; HpackHeadersFrame() use ":authority" pseudo-header
[0414] for "Host:" header according to RFC7540 8.1.2.3
[0415] bugfix; SesolaCertExtension() generate UPN independently
[0416] for each of pre- and post- OpenSSL 1.1.n
[0417] bugfix; SesolaClientCertConditional() 'IS' processing
[0418] bugfix; SesolaClientCertRenegotiate() allow for low-level
[0419] (i.e. SSL) I/O errors (e.g. link disconnection)
[0420] bugfix; LoggingDo() 'SR' silliness from v11.0 rework
[0421] bugfix; MapUrl_ExplainPathSet() response=header=add=..
[0422] bugfix; for HTTP/2 (sigh) we need NPH to generate a header
[0423] bugfix; session ticket key refresh (must be one of those...)
[0424] 04-MAY-2017 MGD v11.1.0,
[0425] "Raw"Socket based on WebSocket infrastructure
[0426] [DclScriptProctor] * general idle process(es)
[0427] [ServiceRawSocket] enables a RawSocket
[0428] [ServiceSSLcert] specification can contain wildcard(s)
[0429] SET proxy=header=[=]
[0430] logging 'CL' insert request content-length
[0431] logging 'PL' insert PUT or POST body received count
[0432] Sesola..() refinements for OpenSSL v1.1.1 and TLS 1.3
[0433] sesola.h |#include "openssl/rand.h"| to fix OpenSSL v1.1.0
[0434] static link error against rand_bytes() and rand_seed()
[0435] SesolaNetThisIsSSL() allow redirection to include scheme
[0436] /DO=SSL=CERT=LOAD ... basically for internal use only!
[0437] (heads-up: planned Let's Encrypt CME utility :-)
[0438] Graph..() activity graphic now implemented using HTML5 canvas
[0439] ResponseHeader() ensure non-printables cannot be injected
[0440] InstanceSessionTicketKey() rework multi-instance/cluster
[0441] (sigh! yes again; the lack of a test cluster these days)
[0442] DirDirectories() do not list "hidden" (^.the.DIR) directories
[0443] bugfix; use rqHeader.RequestBody.. for body with header
[0444] bugfix; DclScriptProctor() v11.0 request structure
[0445] requires dictionary and netio structures
[0446] bugfix; SesolaNetIoRead() SSL_read() in-progress
[0447] bugfix; Http2RequestEnd() end-of-request (control) frame
[0448] independent of request itself
[0449] bugfix; Http2NetQueueWrite() and Http2NetWriteDataAst()
[0450] blocking writes are not placed on the request's
[0451] write list as they are transparent to the request
[0452] bugfix; Http2NetQueueWrite() deliver via NetIoWriteStatus()
[0453] using SS$_NORMAL (HTTP/2 I/O) not the request ->VmsStatus
[0454] bugfix; SesolaControlReloadCA() do not proactively
[0455] X509_STORE_free() (leaves a dangling pointer?)
[0456] bugfix; SesolaSNICallback() port elimination
[0457] bugfix; RequestExecutePostCache() keyword redirection count
[0458] 25-AUG-2016 MGD v11.0.2,
[0459] Http2RequestBegin() ensure stream ident not reused
[0460] increase MAX_REQUEST_HEADER from 16384 to 32768
[0461] InstanceSessionTicketKey() rework multi-instance rotate
[0462] CgiGenerateVariables() mitigate httpoxy vulnerability
[0463] MsgConfigLoadCallback() make [ismap] optional
[0464] ParseCommandInteger() accept just an integer
[0465] CLI /INSTANCE= now sets global section |InstanceMax|
[0466] to allow the created process to continue to exist and when
[0467] used needs to be reset with the likes of /INSTANCE=1
[0468] minimum supported OpenSSL version is now v1.0.0
[0469] which precludes HP SSL V1.4 (at least)
[0470] OpenSSL v1.1.0 required code changes including
[0471] #if (OPENSSL_VERSION_NUMBER < 0x10100000L) in Sesola..()
[0472] modules, and introducing a version dependent build
[0473] SesolaClientCertRenegotiate() rework due to OpenSSL v1.1.0
[0474] ResponseHeader() ->rqCgi.ScriptControlHttpStatus will allow
[0475] an error reporting script to override the original status
[0476] CGI Script-Control: X-http-status=
[0477] %SSL-x-STRICT (RFC6797) now described as %SSL-x-STRICT, HSTS
[0478] bugfix; Http2RequestData() always deliver via NetIoReadAst()
[0479] bugfix; HpackHeadersFrame() uncompressed header size
[0480] bugfix; CgiGenerateVariables() names from dictionary
[0481] bugfix; MetaConEvaluate() request: regression
[0482] bugfix; RequestProcessFields() if-range: regression
[0483] bugfix; MetaConEvaluate() client_connect_gt: regression
[0484] bugfix; SesolaClientCert() move X509 RENEGOTIATE switch
[0485] HTTP/2 to HTTP/1.1 after SSL_get_peer_certificate()
[0486] 30-JUN-2016 MGD v11.0.1,
[0487] meta config [[wasd*n.n.n]] server version conditional
[0488] [SSLsessionLifetime] session ticket (or ID) lifetime
[0489] [SSLverifyPeerDataMax] see documentation
[0490] [ServiceSSLsessionLifetime] per-service equivalent
[0491] [ServiceSSLverifyPeerDataMax] per-service equivalent
[0492] [SSLsessionCacheMax] default (of zero) now disables
[0493] in favour of the more efficient Session Ticket
[0494] SesolaSessionTicket..() refresh and coordinate the
[0495] TLS session ticket key cluster-wide using the DLM
[0496] InstanceSupervisor() refresh session ticket key at midnight
[0497] RequestGblSecUpdate() method and URI only printable chars
[0498] ProxyTunnelRequestParse() append mapped path for logging
[0499] DirFiles() and DavPropSearchAst() ignore ambiguous file
[0500] names containing an escaped ("^.") period but no type
[0501] ErrorRedirectQueryString() ERROR_URI variable
[0502] bugfix; MapOdsUrlToOds5Vms() URLs will not contain
[0503] '^'-escaped sequences so just '^'-escape them
[0504] bugfix; SesolaClientCertRenegotiate() ensure request
[0505] data cleared before renegotiate ([SSLverifyPeerDataMax])
[0506] bugfix; DclTaskRundown() cancel HTTP/2 client read
[0507] bugfix; HttpdSupervisor() accumulate proxy accounting data
[0508] bugfix; RequestEnd2() decrement processing rx or (SSH) method
[0509] bugfix; RequestEnd2() read status OK -or- ENDOFFILE
[0510] bugfix; HpackHeadersFrame() multiple to single cookie header
[0511] bugfix; MetaConEvaluate() request-scheme: regression
[0512] bugfix; NetWrite() response header write error handling
[0513] bugfix; SesolaClientCert() just return status
[0514] 07-MAY-2016 MGD v11.0.0,
[0515] HTTP/2 (RFC7540, RFC7541)
[0516] restructure network I/O abstractions (oh boy!)
[0517] key-value dictionary (associative array) abstraction
[0518] add "Refresh [integer] Seconds" to appropriate reports
[0519] ProxyFtpListOutput() update in line with directory listing
[0520] SET dict[=[=]]
[0521] SET http2=protocol=1.1
[0522] SET http2=send=goaway[=]
[0523] SET http2=send=ping
[0524] SET http2=send=reset[=]
[0525] SET http2=write=[low|normal|high]
[0526] metacon dict:, http2: and request-protocol:
[0527] [HTTP2..] global configuration
[0528] [TimeoutHttp2Idle]
[0529] logging 'DI' insert specified dictionary item value
[0530] /DO=HTTP2=PURGE[=]
[0531] ensure timed-out requests are logged as 408/500
[0532] excise much of the twenty years of reporting HTML cruft
[0533] obsolete ismap.c, filedot.c, menu.c and track.c functionality
[0534] 22-APR-2016 MGD v10.4.3 (unreleased),
[0535] logging 'NP' insert notepad value
[0536] logging 'XX' insert custom site/client-specific datum
[0537] SET sslcgi=apache_mod_ssl_client
[0538] SET sslcgi=apache_mod_ssl_extens
[0539] LoggingDo() MAX_FAO_VECTOR from 64 to 128
[0540] SSL_CTX_set_ecdh_auto() set elliptic curves selection
[0541] SesolaTmpDHCallback() improve DH*.PEM flexibility
[0542] SesolaCertExtension() parse X509 extensions
[0543] SesolaCertName() parse X509 distinguished name
[0544] SesolaCgiVariablesExtension() document X509 extensions
[0545] SesolaReport() list certificate extensions
[0546] [ru:/CN=] allows multiple to be selected between
[0547] (e.g. "[ru:/CN=user*]", "[ru:/CN=^^\[^/=\]*$]")
[0548] SesolaCertParseDn() strncmp() not strsame()
[0549] SesolaCertParseDn() select on pattern match
[0550] StringMatchAndRegex() ensure |rqptr| not needed
[0551] add limit to consecutive failures on persistent connection
[0552] remove limit to consecutive requests on persistent connection
[0553] TcpIpAddressToString() IPv4 in IPv6 as ::FFFF:n.n.n.n
[0554] bugfix; ResponseHeader() for HEAD request transfer-encoding
[0555] chunked suppress actual chunked body (RFC 7230 3.3)
[0556] bugfix; SesolaInit() session cache max -1 disables cache
[0557] bugfix; LoggingDo() elapsed time items
[0558] bugfix; LoggingDo() 'CC' do not reuse pointers!
[0559] bugfix; LoggingDo() 'VS' |->ServicePtr| dereference
[0560] 15-AUG-2015 MGD v10.4.2,
[0561] [ServiceStrictTransSec] (RFC6797)
[0562] [SSLstrictTransSec] (RFC6797)
[0563] SET response=sts= (Strict-Transport-Security:)
[0564] ResponseHeader() Strict-Transport-Security: header
[0565] add WATCH "!42*x" to beginning and ending of requests
[0566] DavWebRequest() allow bodies with any and no Content-Type:
[0567] then in DavWebRequest2() check for XML in the body content
[0568] RequestRedirect() always use dynamic buffers
[0569] when "remote-addr:" begins '?' translate host to IP address
[0570] LoggingDo() add WASD_LOGS "convenience" logical name
[0571] disable kludge; SesolaNetAccept() SSL3_ST_SR_CLNT_HELLO_C
[0572] as the issue seems to have been fixed in OpenSSL v1.0.2c
[0573] logical name WASD_REDIRECT_WILDCARD must be defined
[0574] to enable "DNS wildcard" proxy redirection
[0575] bugfix; [Cli]ParseCommand() parenthesis parsing
[0576] bugfix; Request..() rework pipelined request handling
[0577] bugfix; move supervisor PID from InstanceNodeSupervisor()
[0578] to InstanceNodeSupervisorAst()
[0579] bugfix; DavWebDestination() URI and URL (Total Commander)
[0580] bugfix; Error..() earlier and broader detection of WebDAV
[0581] bugfix; DavDeleteParse() enable access around OdsParse()
[0582] bugfix; DavMoveMeta() do not report RMS$_DNF
[0583] bugfix; FaoSAK() sdptr = StrDscBuffer(StrDscPtr);
[0584] bugfix; DavXmlStartElement() PROPFIND accumulate list of
[0585] dead properties subsequently searched for in the metadata
[0586] bugfix; MapUrl_ExplainPathSet() ->ResponseChunked
[0587] bugfix; CONFIG_SERVER_LOGS logical names precede fixed locale
[0588] 12-FEB-2015 MGD v10.4.1,
[0589] ProxyResponseRebuild() and ProxyRequestRebuild() provide
[0590] timeout=n parameter with Keep-Alive: header field (some
[0591] origin servers hang when no parameters supplied, per JPP)
[0592] SesolaInitOptions() expand options keywords to include
[0593] most SSL_OP_.. flags using the OpenSSL flag #define as the
[0594] keyword minus the "SSL_" (e.g. OP_CIPHER_SERVER_PREFERENCE)
[0595] SesolaTmpRSACallback() and SesolaTmpDHCallback()
[0596] support for ephemeral keys enabling "forward secrecy"
[0597] SesolaInitService() and SesolaInitClientService()
[0598] if cipher list begins '+', '-' or '!' append it to default
[0599] increase MAX_REQUEST_HEADER from 8192 to 16384
[0600] (proxying requests from Firefox to IIS, per JPP)
[0601] kludge; SesolaNetAccept() SSL3_ST_SR_CLNT_HELLO_C
[0602] bugfix; RequestEndEnd() use ZERO_DELTA_TIME macro
[0603] bugfix; AuthCacheNeedsReval() AlreadyLocked (per JPP)
[0604] bugfix; ConfigReportSecureSocket() FaoVector[32]
[0605] 05-DEC-2014 MGD v10.4.0
[0606] CORS support
[0607] /SSL=(TLSvALL,TLSv1.1,noTLSv1.1,TLSv1.2,noTLSv1.2)
[0608] removed /SSL=(2|3|23) which must be altered to SSLv2, etc.
[0609] NOTE: TLSv1, TLSv1.1, TLSv1.2 now ENABLED by default
[0610] SSLv2 and SSLv3 are now DISABLED by default
[0611] (as recommended post-POODLE)
[0612] MapUrl_ClientAddress() allows for transparent upstream proxy
[0613] ResponseStream() and request /stream/
[0614] AuthCacheNeedsReval() so multiple cache entries for the
[0615] same credentials do not trigger multiple revalidations
[0616] SsiEnd() detect and report non-SSI problem encountered
[0617] access log buffer extended from [4096] to [16384] (UMA SAML)
[0618] LoggingQuoted() explicitly encode some fields where a raw
[0619] quotation mark (URI forbidden) can break a log entry
[0620] HttpdExit() sanity check trace after %SYSTEM-F-ASTFLT
[0621] stack corruption at (you guessed it) Uni Malaga resulted
[0622] in the icb.libicb$v_bottom_of_stack never being set!
[0623] tweaks to some accounting fields and values (for WASDmon)
[0624] NetCreateService() check bind address string instead of
[0625] address to allow binding primary to 0.0.0.0 (INADDR_ANY)
[0626] directory default listing style now ed
[0627] directory path SET ods=name=utf8 then response charset=utf-8
[0628] directory ?httpd=index&font=[inherit|monospace(D)]
[0629] ?httpd=index&style=table[2]
[0630] SET client=[forwarded|if=forwarded|literal=|reset|
[0631] if=xforwardedfor|xforwardedfor]
[0632] SET dir=font=[inherit|monospace(D)]
[0633] dir=style=TABLE[2] (new default)
[0634] SET cors=age= cors=cred=[true|false]
[0635] cors=expose= cors=headers=
[0636] cors=methods= cors=origin=
[0637] SET ods=name=8bit, ods=name=utf8, ods=name=default
[0638] SET webdav=[no]hidden
[0639] webdav=meta=dir=
[0640] [SecureSocket] and [SSL...] (overridden by /SSL=)
[0641] [WebDAVmetaDir] sub or full directory for meta files
[0642] WedDAV configurable metadata (sub)directory
[0643] AuthAccessCheck() add explicit check against server
[0644] account to improve reporting of underlying access
[0645] User-defined logging directives 'CI', 'SR', 'SV' for
[0646] SSL cipher, session reuse and version items
[0647] COMMON+, COMMON_SERVER+, COMBINED+ composite log formats
[0648] X-record0-mode[=0|1] and associated CGI null-record mode
[0649] bugfix; and refine DirFormatSize()
[0650] bugfix; SSLv23_method() appears to be a Swiss-army knife
[0651] significant rework of SSL version configuration
[0652] bugfix; TcpIpCacheAddressToName() memcpy null char
[0653] bugfix; DavMetaOpenAst() retry after meta directory creation
[0654] bugfix; DavPropEnd() ensure unused meta-data file deleted
[0655] bugfix; MapOds5VmsToUrl() et.al. allow for ".]["
[0656] bugfix; SAME3 0x00ffffff mask (not 0xffffff00)
[0657] bugfix; DirFormatAcpInfoAst() ThisIsADirectory = false;
[0658] bugfix; DavWebCreateDir() set SYSPRV access, propagate rest
[0659] bugfix; PutWriteFileOpen() WebDAV should not use default
[0660] protection mask and instead propagate from profile
[0661] bugfix; FileParseAst() allow for non-dir .DIR files
[0662] bugfix; RequestRedirect() allocate using (possibly expanded)
[0663] header length (not fixed) when allocating POST buffer
[0664] bugfix; PROXY.C no $QIO buffer should exceed 65535!
[0665] 06-OCT-2013 MGD v10.3.0
[0666] TLS1 Server Name Indication (SNI) extension
[0667] /SSL= parameter options rework (plus new mnemonic options)
[0668] SesolaNetClientBegin() include SNI before connect
[0669] PutWriteFileOpen() support FAB$C_STM and FAB$C_STMCR
[0670] DclMailboxAcl() allow usernames without associated
[0671] identifiers (i.e. shared UICs) by first trying with the
[0672] username and on failure getting the UIC and using that
[0673] FaoUrlEncodeTable tilde from "%7e" to "~" (cadaver issue)
[0674] GzipInit() ZLIB shareable image via logical names
[0675] WASD_LIBZ_SHR32, then GNV$LIBZSHR32, finally LIBZ_SHR32
[0676] PersonaAssume() wrap sys$persona_create() with SYSPRV
[0677] after modifications to DclMailboxAcl() to allow usernames
[0678] without associated identifiers (i.e. shared UICs)
[0679] authorisation realm read-only group can be specified as "*"
[0680] to represent that "everyone else" can read
[0681] ProxyResponseRebuild() additional header length bumped
[0682] from an ambit 256 to an ambit 1024 (Uni Malaga :-)
[0683] OdsNamBlockAst() on non-ODS_EXTENDED platforms (i.e. VAX)
[0684] tease-out system file name from Nam.nam$l_name and
[0685] Nam.nam$l_type into odsptr->SysFileName buffer
[0686] historically used by ODS-5 and munge for ODS-2 as well
[0687] .WWW_WASD directory directive file
[0688] sortable directory listing
[0689] ?httpd=index&ilink=[yes|no]
[0690] ?httpd=index&override=[yes|no]
[0691] ?httpd=index&query= (.WWW_WASD specific)
[0692] ?httpd=index&style=
[0693] ?httpd=index&sort=[+|-]
[0694] ?httpd=index&target=
[0695] ?httpd=index&these=[,]
[0696] ?httpd=index&versions=|*
[0697] SET dir=delimit=
[0698] SET dir=[no]ilink
[0699] SET dir=style=sort (plus the dir=style=2)
[0700] SET dir=sort=[+|-]
[0701] SET dir=target=
[0702] SET dir=these=[,]
[0703] SET dir=versions=|*
[0704] SET put=rfm=[STM|STMCR|UDF] added to FIX512,STMLF
[0705] "upstream-addr:" conditional
[0706] [AuthRevalidateLoginCookie] obsolete (in favour of ...)
[0707] rqptr->AuthRevalidateCount to track empty authentication
[0708] prompts preceding potential redundant revalidation prompt
[0709] [PutBinaryRFM] add STM and STMCR
[0710] [ServiceNonSSLRedirect] |[:]
[0711] some refinements to Upd..() layout and functionality
[0712] refine HTML and bring a little more up-to-date
[0713] AUTH_MAX_USERNAME_LENGTH bumped from 47 to 64 for X509
[0714] FileAcpInfoAst() '$.' file extension kludge
[0715] bugfix; AuthConfigLoadCallBack() additional [AuthProxy]
[0716] with intervening rules should reset proxies
[0717] bugfix; FileResponseHeader() "?httpd=content&type=" decoded
[0718] bugfix; MapOds..() identify MFD using "000000]" and "000000."
[0719] bugfix; AuthVmsGetUai() interaction of logon= parameters
[0720] bugfix; UpdFileRename() ACCVIO with AuthAccessEnable()
[0721] bugfix; RequestParseAndExecute2() remove reset of
[0722] request persistent flag from OPTIONS and DELETE
[0723] bugfix; SesolaInitService() (or refinement)
[0724] SSL_CTX_set_session_id_context() against each service
[0725] bugfix; DirFormatSize() bytes
[0726] bugfix; OdsParseTerminate() on non-ODS_EXTENDED platforms
[0727] (i.e. VAX) reset .nam$b_esl to changed expanded length
[0728] or it can generate RMS$_ESL errors
[0729] bugfix; DavPropSearchAst() on non-ODS_EXTENDED platforms
[0730] (i.e. VAX) reset .nam$b_rsl to changed resultant length
[0731] or it can generate RMS$_RSL errors
[0732] bugfix; non-ODS_EXTENDED platforms (e.g. VAX) must
[0733] OdsParse() NAM$M_NOCONCEAL before OdsSearchNoConceal()
[0734] bugfix; MapUrl__Map() reverse mapping wildcard copy
[0735] bugfix; CgiGenerateVariables() AUTH_GROUP write/read status
[0736] bugfix; AuthClientHostGroup() wildcard match result reversed
[0737] bugfix; ProxyResponseRebuild() call ProxyRebuildLocation()
[0738] can return a pointer to the original location!
[0739] bugfix; SesolaInit() translate WASD_SSL_CIPHER logical name
[0740] 09-NOV-2012 MGD v10.2.0,
[0741] TOKEN authorisation
[0742] request header DNT (do not track)
[0743] set ProxyReadBufferSize to 64k (per JPP)
[0744] allow (proxy) ResponseBufferSize to be >= 64k (per JPP)
[0745] HttpdSystemInfo() $GETSYIW() CsidVersion treat status
[0746] SS$_UNREACHABLE as non-fatal and fallback to 16 byte LVB
[0747] DIGEST.C numerious tweaks up to RFC2069
[0748] [AuthTokenEntriesMax] for token authorisation
[0749] bugfix; HTAdminModifyUser() use database name for digest
[0750] bugfix; AuthorizeResponse() digest scheme
[0751] bugfix; AuthVmsGetUai() logon= fall through
[0752] bugfix; DclSysOutputAst() WebSocket wrt agent
[0753] bugfix; WebSockEnd() do not NetCloseSocket()
[0754] bugfix; (at least improve) caching of group write/read
[0755] bugfix; SesolaParseCertDn() return NULL if record not found
[0756] bugfix; AuthorizeGroupWrite() with cached entries!
[0757] bugfix; AuthReadSimpleList() parameter /DIRECTORY= processing
[0758] 28-APR-2012 MGD v10.1.1,
[0759] RequestGet() no longer report 408 for unused connections
[0760] RequestEndEnd() likewise ignore unused connections (Chrome)
[0761] MetaConLoad() compress non-signficant white-space
[0762] proxy WebSocket upgrade requests as raw tunnels (kludge)
[0763] DclRestartScript() refine WebSocket handling
[0764] DirFormatSize() now uses quadword
[0765] DirFormatSize() adjusts units to fit size width
[0766] MATCH0..8() macro to improve efficiency over memcmp()
[0767] SAME1..4() macro to abstract the *(USHORTPTR)s, etc.
[0768] bugfix; RequestBegin() remove RequestEnd() following failed
[0769] SesolaNetBegin() resulted in redundant request rundown
[0770] bugfix; SesolaNetAccept() initialise value=0
[0771] bugfix; SesolaNetRead() SSL state not SSL_ST_OK
[0772] bugfix; SesolaNetWrite() SSL state not SSL_ST_OK
[0773] bugfix; DavWebMicrosoftMunge2() token reprocessing
[0774] bugfix; FileAcpInfoAst() SS$_BADPARAM >2GB <4GB (per JPP)
[0775] bugfix; WebSockCloseMailboxes() logic
[0776] bugfix; DclScriptProcessCompletionAST() don't WebSockClose()
[0777] any WebSocket request currrently associated with the task
[0778] bugfix; RequestEndEnd() '->WebSocketCount' already locked
[0779] 06-NOV-2011 MGD v10.1.0,
[0780] dragged kicking and screaming to VMS V7.0 base build
[0781] Web Socket (HTML5) support
[0782] Secure Sockets default to SSL v3 and TLS v1 (no more SSL v2)
[0783] SET cache=[no]cookie
[0784] SET map=uri
[0785] SET proxy=chain=cred=
[0786] SET proxy=tunnel=request=
[0787] SET regex=
[0788] SET response=HTTP=original
[0789] SET service=
[0790] SET notimeout (short-hand for timeout=none,none,none)
[0791] SET websocket=
[0792] "origin:" conditional
[0793] "request-peek:" conditional
[0794] "upgrade:" conditional
[0795] "websocket:" conditional
[0796] [DclScriptProctor] (pro-)activate script/environments
[0797] [RegEx] enabled/disabled/
[0798] [ServiceProxyChainCred] down-stream proxy credentials
[0799] [WwwImplied] "www." is implied even with virtual services
[0800] ("Host:") not beginning with it (ServiceFindVirtual())
[0801] callout LIFETIME: can accept
[0802] callout SCRIPT-CONTROL:string (see DCL.C)
[0803] logging 'PP' outgoing proxy connection local port
[0804] /DO=ALIGN=.. to allow collection and analysis of Alpha and
[0805] Itanium alignment fault data using HttpdAlignFault() et.al.
[0806] /DO=NET=PURGE[=..] expanded capability
[0807] /DO=WEBSOCKET=DISCONNECT[=..] to disconnect WebSockets
[0808] /PRIORITY= limit increased from 6 to 15
[0809] SesolaInit() default is SSLv2 off and SSLv3/TLSv1 on
[0810] AuthAgentCallout() callout BODY implemented (for PAPI)
[0811] MapOdsUrlTo..() consecutive '/' into a single a la Unix
[0812] ServiceReportNow() service synopsis
[0813] ProxyTunnelChainConnect() chain proxy authorization
[0814] ProxyRequestRebuild() chain proxy authorization (BASIC only)
[0815] ServiceReportNow() add summary to service report
[0816] configuration lines beginning "!#" now allow WATCHable
[0817] during mapping and authorisation processing
[0818] reworked query string handling based on length
[0819] ServiceEntityMatch() processes in-match and if-not-match
[0820] CacheSearch() implement request cache control
[0821] CacheLoadResponse() checks response header for
[0822] "Cache-Control:" directives and adjusts accordingly
[0823] CacheLoadEnd() buffer all content-type data
[0824] (previous behaviour truncated at ';' or white-space)
[0825] MetaConLoad() ensure metacon "lines" are quadword aligned
[0826] __unaligned directive added to pointer macros in a
[0827] (successful) effort to avoid alignment faults
[0828] VM_OFFSET now 8 (quadword alignment) instead of 4
[0829] bugfix; OdsFileExists() parse NAM$M_NOCONCEAL in case of
[0830] multi-valued, concealed logical devices and then convert
[0831] returned status DNF into the functional equivalent FNF
[0832] bugfix; directory listing OdsSearchNoConceal() to
[0833] process concealed, multi-value logical device names
[0834] bugfix; RequestRedirect() only concat '&' if including query
[0835] bugfix; set rule 'CacheSetting' boolean with any CACHE=..
[0836] 02-OCT-2010 MGD v10.0.3,
[0837] command-line checks of configuration files
[0838] /DO=AUTH=CHECK /DO=CONFIG=CHECK (all configuration files)
[0839] /DO=GLOBAL=CHECK /DO=MAP=CHECK /DO=MSG=CHECK
[0840] /DO=SERVICE=CHECK
[0841] TcpIp6..() functions to resolve IPv6 AAAA records
[0842] ProxyRequestParse() improve IPv6 host parsing
[0843] bugfix; regression at 10.0.1 with proxy authorization
[0844] bugfix; SSL_set_info_callback() not SSL_CTX_set..()
[0845] 01-JUL-2010 MGD v10.0.2,
[0846] metacon "file:" and "directory:" to probe file-system
[0847] SET script=lifetime=
[0848] SET put=max= per-path equivalent of [PutMaxKbytes]
[0849] SET put=max=* for (effectively) unlimited upload
[0850] BODY.C significant rework to function()alise common code
[0851] BODY.C improve performance with multiblock of 127 (per JPP)
[0852] BODY.C make MultipartContentType(Ptr) a dynamic structure
[0853] as Microsoft endeavour to include application data
[0854] along with MIME content-type, see ...
[0855] http://msdn.microsoft.com/en-us/library/aa338205.aspx
[0856] and an example (no kidding!) ...
[0857] "application/vnd.ms.powerpoint.template.macroEnabled.12application/x-font"
[0858] FileNextBlocks() change QIO file size from long to quad
[0859] to cater for files greater than 4GB (4GB+ is limited to
[0860] file serving only, no ranges, etc.)
[0861] RequestExecutePostCache() UTF-8 decode WebDAV objects
[0862] RequestRedirect() support WebDAV "Destination:" field (JPP)
[0863] DclAllocateTask() default unconfigured CGIplus lifetime
[0864] SsiDoSet() and SsiGetTagValue() allow '$' in variable names
[0865] Mapurl_ControlReload() rather than Mapurl_Load()
[0866] bugfix; MapUrl_ControlReload()
[0867] bugfix; DclUpdateScriptNameCache() run-time pointer
[0868] bugfix; OdsNamBlockAst() odsptr->NamFileSysNamePtr
[0869] always set to odsptr->SysFileName in case RMS$_FNF, etc.
[0870] bugfix; RequestGet() MAX_REQUEST_HEADER (per JPP)
[0871] bugfix; allow METACON_TOKEN_INCLUDE for [IncludeFile]
[0872] bugfix; MetaConEvaluate() when JustChecking: HTTP header
[0873] fields (e.g. "cookie:")
[0874] bugfix; DavMetaReadName() and DavMetaWriteName()
[0875] allow for typeless file names (e.g. ]AFILE.;)
[0876] bugfix; PutWriteFileOpen() ensure SYSPRV enabled before
[0877] $ERASE() if not WebDAV request (access and ownership) (JPP)
[0878] bugfix; DavWebSlashlessMunge() enable SYSPRV while
[0879] calling OdsFileExists() (per JPP)
[0880] bugfix; do not use REDIRECT for WebDAV request error report
[0881] bugfix; no new token when refreshing existing lock (per JPP)
[0882] bugfix; FileNextBlocks() signed/unsigned comparison
[0883] when calculating buffer size on files larger than 2^31
[0884] bugfix; MapOdsUrlToOds5Vms() MapOdsElementsToVms()
[0885] include '|' and '%' as ODS-5 escaped characters
[0886] bugfix; DirAuthorizationAst() only check access on
[0887] non-empty expanded file names
[0888] bugfix; PutWriteFileOpen() ensure SYSPRV enabled before
[0889] $CREATE() if not WebDAV request (for access and ownership)
[0890] bugfix; FileNextBlocks() signed/unsigned comparison
[0891] when calculating buffer size on files larger than 2^31
[0892] bugfix; MapOdsUrlToOds5Vms() MapOdsElementsToVms()
[0893] include '|' as an ODS-5 escaped character
[0894] bugfix; DirAuthorizationAst() only check access on
[0895] non-empty expanded file names
[0896] bugfix; PutWriteFileOpen() ensure SYSPRV enabled before
[0897] $CREATE() if not WebDAV request (for access and ownership)
[0898] bugfix; DirBegin() "httpd=index&" detection (since v9.3.0)
[0899] bugfix; DirEnd() suppress