WebHub Object Pascal Components
- StartEXE deprecated v3.240
- StartEXE is deprecated. Use Launch instead.
- StartEXE now calls Launch instead of WinExec and
works on Windows 10.
- Source: ucShell.pas
- LongInt v3.240
- LongInt changed to FixedUInt throughout TPack, except in a few cases (txtGridVCL.pas)
where the declaration is controlled by the VCL.
- SendFile v3.240
- TwhListResponse.SendFile no longer supports sending partial files via comma in the "file spec".
- ZaphodsMap: D17 to D23, FPC3 v3.240
- The aim for ZaphodsMap is now to support D17 to D23 plus FreePascal 3.0. Support for Delphi Dot Net has been dropped.
- DUnit tests pass for NativeXml and ZaphodsMap for D17 to D23 as of WebHub v3.240, 13-Dec-2015. FPC3 support is pending.
- EMail v3.240
- Unused code for Delphi D16 and earlier has been removed from webMailV and related units. Indy is used for email now.
- The CC: and BCC: prefixes are no longer added to distribution lists. Those were required by the original email subsystem
as written by HREF Tools. They are not required by the Indy implementation.
- Parentils are supported for expansion within the Subject field only.
- Allowing for slower service start v3.240
- Services taking more than 3.5 seconds to start had been considered faulty by TtpProject. This is no longer the case.
As long as the net start syntax is correct, there is no longer a time limit on startup. If you wish to see detail on
LogTpProject to your list of compiler defines.
- Win2003, WinXP phased out v3.241
- In TPack, the IsProcessRunning function no longer supports Win2003 and WinXP. This is used by WebHub core.
- Main panels appear v3.242
- There was a problem in v3.241 only where the main panel stayed empty. This has been fixed. If you want to patch v3.241,
edit utMainFc.pas line 181; remove 'not' from the if expression; recompile.
- Icons loaded better v3.242
- The syntax has been changed for loading icons for the various states supported by WebHub: A_MAINICON, STOPPED, RESTORED, etc.
- See source in TPack unit: utTrayFm.pas
- Caption no longer reports 'SUSPENDED'v3.242
- The code that changed the application caption based on whether the EXE was processing a request has been trimmed to a
minimum. There is no longer an attempt to include the word SUSPENDED; this was relevant in WebHub v2. For WebHub v3, Cover an AppID
if you wish to take it offline.
- See source: whgui_Menu.pas
- Avoid A/V in PREVENTGUI modev3.243
- A core fix has gone into TPack unit updateOK.pas, to avoid an access violation during Destroy -- only when compiled with
- WebHub PageErrors v3.245
- If there are any errors found during page creation, they are logged in a single statement (rather than in a series of statements, as was done previously).
The messages are logged as a Warning because, especially for notes about undefined stringvars, you may have a reason for the lack
of data. To control this, you can set
pWebApp.Debug.SilentUnrecognizedExpressions to True.
- Eval/Lite License Violation v3.245
- If usage outside the limits of the evaluation or lite license is detected, some details will be logged as errors to
CodeSite if available.
- GetVersionDigits: on arbitrary file v3.245
- You can optionally obtain the version details for an arbitrary filespec, not just
for the currently running DLL or EXE. See source in tpack ucVers.pas.
- utWinMailslot no longer shippingv3.245
- This unit has been removed from TPack: utWinMailslot.pas
- TwhdbListBox: use DataSet property v3.245
- TwhdbListBox.DataSource property had been deprecated and is now
unsupported. Use the DataSet property.
- icon: use default resource name v3.246
- LoadIconResource automatically loads MAINICON when A_MAINICON not found
- MAINICON is the icon name used by the Delphi IDE. A_MAINICON can be used to override
- WebMailForm v3.246
- Parentils are respected around all fields in the application-level XML for webmailform now. Previously, only the Subject
field supported expansion within parentils.
- non-gui google sitemap generation v3.246
- New datamodule: whsample_dmGoogleSitemap.pas can be used when you do not want to instantiate a form but still want to
generate a sitemap based on the WebHub page definitions.
- The xsd date for the application-level XML changed from 201311 to 201601.
- If your application-level XML file(s) mention the googlesitemap module, please move it from GUI to GUIOptional.
<Module name="googlesitemap" status="enabled-gui"/>
- With v3.246 and v3.247, make one fix to whcfg_App.pas: line 2241 should read
for idm := moduleEMail to moduleGoogleSiteMap do This fix is included in v3.248.
- Fix relevant to early shutdown v3.246
- The TwhWebAction.Notification method has been improved to avoid access violations during shutdown when pWebApp is nil before
all TwhWebAction components have been destroyed. Source: webLink.pas
- For example, if during project startup with TtpProject, the custom logic decided there was a fatal error and
startup should not continue, in the past, an access violation could occur.
- TwhRequest: 0 verbs v3.247
- Cleanup: the 9 verbs that had been present/unusable on TwhRequest have been removed.
- Comments stripped v3.247
- Two types of comments are completey stripped
from .whteko files before they are loaded into droplets etc.
- Lines starting with '// ' two slashes followed by space
- Anything contained in a WebHub comment (an HTML comment starting with triple-dash)
- (1) eliminates a parsing problem as well as a false-positive report in the syntax check report. (2) represents a change only
to the syntax check report.
- TPack Panel Detach v3.247
- A new global boolean named
TPackAllowDetach in unit utPanFrm controls whether the Detach
feature is active or blocked. The detach feature causes tabbed-in panels to be able to float out as separate windows when
a certain area of the toolbar containing them is clicked.
- By default, the feature works the same as it has since 1995 which is that Detach is active. To block it,
TPackAllowDetach := False; // uses utPanFrm
- Speed: Avoid Disk I/O for ReadOnly Session v3.248
- Only take action in these functions if not a ReadOnly session:
SaveToDisk, SavePlaceHolder, LoadFromDisk, TouchSession, SaveToFile.
- Source: webVars.pas
- Http Status Line v3.248
- Custom calls to WebHubHttpPrologue now correctly use the status description rather than the status reason when making the
status line in the HTTP prologue.
- Source: webPrologue.pas; this change can be patched into earlier versions.
- SendAuthRequest discontinued v3.248
- Support for Response.SendAuthRequest has been discontinued. Modern web applications use login forms and session data,
or access control provided by the operating system.
- Prologue separated from Response File v3.248
- For any custom WebHub applications or components that had been writing to Response.Stream.Text and included an http
prologue followed by a double sLineBreak, a different technique is required now.
- Write the prologue to this file: pWebApp.Response.PrologueFilespec.
- Include the two trailing line breaks in that file.
- Do NOT start the prologue with HTTP/1.1. Do not include a status line. Start with Content-Length and include the Content-Type.
- Save the progloue file in UTF-8 without a BOM.
- Example source: wdbChart.pas and webPict.pas
- Please use v3.249+
- TwhStream discontinued v3.248
- Source for this old class, TwhStream, was refactored for v3.248 and left as a comment in the webPict.pas unit.
- Blank SessionFirstIP ignored for WebRobots and ReadOnly Sessionsv3.249
- Ordinarily, when pages execute, a blank SessionFirstIP value causes SessionReject.
This is no longer done for WebRobot and ReadOnly sessions.
- HTTP Status other than 200 v3.249
- There was a problem in v3.248 if a custom WebHub app tried to use a status code other
than 200. Fixed in v3.249.
- SendCustomError v3.249
- The use-case for this feature is simulating error situations, in particular, the extreme case of system overload which
causes the WebHub isapi runner to send status 500.13.
- There is a new method,
Response.SendCustomError, with which you can trigger the use of the
ISAPI function for sending a custom error. There are no http headers or content involved. You can specify the
status text (e.g. 'WHBusy'), the major status code (e.g. 500) and the substatus code (e.g. 13).
- No page content is relevant so if the Delphi code calls this method, the page execution will stop.
- For anyone writing error handling using JQuery, note that
jqXHR.Status gives the number (e.g. 500), and
jqXHR.StatusText gives the text (e.g. 'WHBusy'). The substatus code is, by default IIS configuration, only
visible on localhost, not over the WAN.
- The substatus code will appear in IIS logs, but, the main status code will be transformed to '200' even if you specify 500.
- SimulateAppNotRunning etc. v3.249
- All the Simulate... methods on pWebApp.Response now close the output document as soon as the simulated error message has been sent.
- These Simulate... methods now include the X-Status-Reason header with the situation abbreviation such as AppNotRunning.
- Response.HTTPStatusReason property removed v3.249
- The HTTPStatusReason property on the TwhResponse component has been removed.
- Smaller RAM footprint: hub.exe v3.241
- Compared to wh v3.238..v3.240, the Hub will take less memory when it runs.
- This Hub v3.241 is only compatible with runners and custom WebHub apps built with the same version. Please do not mix versions.
- Command Line Client: whadmin.exe v3.241
- WebHubAdmin (with GUI) has been transformed to whadmin.exe 64-bit command line client. For usage details, use --help, i.e.
- This obviates the need WebHubAdmin plus two other utilities, ShutdownWHApps and WHCoverMgmt. Here is the syntax that handles
the features of those two utilities:
whadmin app instances stop all
whadmin app instances stop --appid=adv
whadmin app instances set-count --appid=adv --count=3|min|max
whadmin app cover --appid=adv --minutes=3 "--reason=full database backup"
whadmin app cover all --minutes=5 "--reason=full database backup"
whadmin app uncover --appid=adv
whadmin app uncover all
- To view license details:
whadmin config license view
- To add or change license details:
whadmin config license add-metadata --licensee=__ --serialno=__
- To control The Hub service:
whadmin hub start
whadmin hub stop
whadmin hub restart
- To see which processes have connected to The Hub:
whadmin report connected
- All parameters are case sensitive.
- No longer shipping: ShutdownWHApps and WHCoverMgmt. While these utilities continue
to work with v3.241, it is recommended that you change your server scripts to use the new whadmin.exe utility.
- whadmin.exe v3.243
- Re whadmin.exe app instances set-count --appid=__ --count=__, when this relates to a service
for which more than 1 instance can run, whadmin will fill in "gaps". For example, say you start 3 instances and then stop
instance #2. If you then ask whadmin to set the count to 3, it will start service instance #2 so that the total comes back
- Code signed: SHA256 v3.248
- Binaries shipped with v3.248 are code signed with a newly issued SHA256 certificate.
- Logging v3.240
- The ISAPI runner can log warnings, errors and exceptions if CodeSite Dispatcher is started before the IIS worker process.
For best results, install CSDispatcher as a service with automatic start.
- To enable logging within a particular runner, set the LoggingLevel for the relevant RunnerID using ZMAdmin.
By default, the logging level is 'none'. See hints in ZMAdmin for details.
- The xsd date for WHNetworkInfo.xml is 201512.
- First 512 bytes v3.244
- The runner sends the first 512 bytes then the balance in 16kb blocks.
- HSE_IO_SYNC v3.246
- Internally, when calling the ISAPI WriteClient function, the runner explicitly sets the dwSync to HSE_IO_SYNC.
This is supported by IIS 6 and higher.
- ISAPI callback change v3.247
- For performance reasons, the isapi runner now uses a different callback function when sending back a
response calculated by a custom WebHub application.
- The larger the page size, the faster this will be compared to v3.246 and earlier versions.
- Remember to use the same version of WebHub Components
for your custom EXEs as Runtime, i.e. v3.247.
- HEAD response v3.247
- The verb "HEAD" is now fully supported by the runner.
- A Content-Length header is NOT included because the custom application may decide not to bother calculating
a real response for a HEAD request.
- Note that webpagetest.org always issues a HEAD request prior to doing its GET test of your page (as reviewed in February 2016).
- Upgrading to v3.247 is recommended for anyone attempting to measure their TTFB speed using webpagetest.org.
- r:echo etc v3.248
- The r: and h: command pages including r:echo will only give a '-' response unless you
test on localhost or on the authority defined for testing of your runner.
- Speed v3.248
- Runner uses a more efficient technique to find out how the Hub scheduled the page request with the App.
The result is that parallel client requests can be processed much faster and more reliably.
- Major portions of the ISAPI extension were rewritten and optimized. Consider carefully testing any of
the following and report any issues to techsupport (at href dot com).
If you wish to report a problem, please try to include data about test results with an earlier version of WebHub and specify
all platform details including IIS version and WebHub version.
- Hub not running; hub stop and start between tests while keeping apps running
- IISRESET then first request versus 2nd+ requests
- Requests from parallel clients, either through an IFRAME or apache benchmark or powershell or other testing tools.
An IFRAME testing example is in
webhubdemos\Live\WebHub\WHTML\Shared WHTML\sharepgs.whteko on PageID
- Requests directly to the runner (r:echo, r:vers, r:version, r:pcv, r:ipc) versus directly to the hub (h:vers, h:ipc, h:nct)
versus to WebHub applications.
- Requests to pages whose size is less than 512 bytes, or more than 16kbytes, or more than 150kbytes.
- Requests to extremely fast versus extremely slow pages.
- Any pages with custom content types, whether that is set in WHTEKO or Delphi.
- In IIS Manager, AppPool identity as LocalSystem or something else. (We recommend using LocalSystem.)
- In IIS Manager, AppPool queue length of 500, 1000 or other.
- In IIS Manager, AppPool having 1 or more AppIDs; and whether there is sharing of 1 or 2+ runner files within the AppPool.
- The logging level for the runner and hub. We recommend "warning,error,exception" or if you want to troubleshoot in depth, use "all" or just add "infotype" and/or "note" depending on how much detail you wish to see.
- All binaries should have digital signature details from HREF Tools Corp., including the Setup.exe, hub.exe, runisa.dll and whadmin.exe.
- File upload including uploading files larger than the limit.
- Bounces especially when combined with session deletion.
- Reliability v3.248
- If you have been seeing wp.exe crashes in the Windows event log, make a separate IIS AppPool for each
AppID that is active on your server.
- Runner writes to the Windows event log if it does not have sufficient resources to parse the request and
perform minimal initial processing. The return response will be status 503 with a Content-Length of 0 bytes.
- Direct ISAPI bounces v3.248
- Optional: in the runner flags, you can add
hseurl and that will cause runisa.dll to avoid
the HSE_REQ_SEND_URL_REDIRECT_RESP function within the worker process when BOUNCEs are processed.
- Only add this flag if you have trouble with status 302 bounces.
- To add the flag, use ZMAdmin and go to
- The use of HSE_REQ_SEND_URL_REDIRECT_RESP is active by default, because that is the quickest way to
have IIS process the bounce.
- Long query strings v3.248
- Query strings longer than 30 characters are now passed through the request input file, without the use of a
separate .qs file.
- cgi-bin v3.248
- The cgi-bin runner is not supported at this time. Use the isapi runner.
- ISAPI runner v3.249
- In case of overload, this version sends status 500.13 (not 503 as v3.248 did).
- This version does not report itself unhealthy (as v3.248 did, which led to an immediate recycle of the AppPool, which requires even more resources).
- This version terminates using a different/better/faster technique.