Not "I" am fiddling with the Window-Size. It's the device. I'm just watching the traffic happen that way.
A handshake about the next window size is part of EVERY "ACK" package and part of the normal TCP protocol. It's one of the means to keep the traffic in a digestible volume on a fast line. Part of that are "queue full" TCP signals, in case that more data is sent than could be processed since the last ACK. The sender then has to shut up until another "queue empty" and resend the bytes that were not part of the last ACK'ed size. This is how TCP works. Especially with slow devices on a fast lane. This was NOT the case here. Just very small packages, well within any window-size (I think 4K is the smallest possible) and even well within the size of a single TCP frame. Ideally the window-size should be a multiple of the TCP frame payload-size which usually is 1500 minus overhead bytes.
So this is essentially a "You may send up to xxx bytes in a row for your next transmission, then expect another ACK".
If you watch Wireshark protocols, you will notice a "win=xxxxx" part in every TCP header to signal the partner about the capability to receive for the next package.
The problem I suspect is, that the pledge for downsizing of the window-size
done by the device might confuse the web service that in turn stumbles over the next request FROM that device.
A pure guess, as TCP handling should be done correctly on the driver level, not in the application. It might be a mere coincidence, that just the request after such a downsizing handshake is not processed.
That's why I'm asking for ideas how to debug such a situation. Can I get a breakpoint low enough in the stack to catch the "GET" package before the HTTProuter tries to match the URL against the learned routes? Just to be certain it DOES get received anywhere in the application? My first assumption was that the routes are not OK and that there is just no target to receive it.
it does not get deployed to any of the routes ad not to the default route. Instead it gets reset [RST] at a lower level of the stack. But where and why?
The route definition is
HTTPRouter.RegisterRoute('/setupapp/*/search.asp', @GetRadioBrowserSearchedStations, false);
Essentially the same as the route to the login, that preceeds the call ant which is logged:
HTTPRouter.RegisterRoute('/setupapp/*/loginxml.asp', @SetupAppLoginXMLPage, false);
The first line in every routing target is a call to log the incident:
procedure GetRadioBrowserSearchedStations(AReq: TRequest; ARes: TResponse);
var
LRBStations: TRBStations;
begin
Logging(ltDebug, AReq.Method+' '+AReq.URI);
try
if AReq.QueryFields.Values[PATH_PARAM_SSEARCH_TYPE]='3' then // In some cases "3" mean a "Play" option.
...
Neither is the log written nor does a breakpoint on line 5 fire - when there was this [TCP Window Update] frame before the call. And the same is for the "default" route target. I don't arrive there.
Told that - if I try the same calls in the same sequence from SOAPUI or just a browser, the call gets logged and the breakpoint is hit. So it must be something between the device and the service. And since the packet can be traced on the PC that hosts the service, it is probably something between the network driver and the routing target.
Well, I might be totally wrong, but that's how it looks.