FLAC does work with HTTP_mode=fixed. UPnPBridge then assigns an arbitrary length defined in its config.xml (eg., <stream_length>1000000000</stream_length>). JRiver fails to advance to the next track in a playlist with gapless set to "yes" or "no," but does work with "force." If you're still interested, I can send traces of these modes to see what's going on.
I got your PM with the new traces. You can see the GET transactions below..
With LMS set to "HTTP Mode fixed" -- the LMS server sends the file with a "munged" Content-Length of 2048000000; the MC renderer accepts this and downloads the full 36 MByte file; AND the MC renderer actually plays the flac track..
GET /bridge-1.flac HTTP/1.1
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 Edge/12.246 JRiver_Internet_Reader/2.0 UPnP/1.0
Icy-Metadata: 1
Host: 192.168.6.142:49154
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: Squeezebox-player=bb%3Abb%3Aa6%3A40%3A7d%3A96
HTTP/1.1 200 OK
Server: squeezebox-bridge
Connection: close
Content-Type: audio/flac
Content-Length: 2048000000
>> flac media data starts here
With LMS NOT set to "HTTP Mode fixed" -- the LMS server sends the file "Chunked"; the MC renderer accepts this and downloads the full 36 MByte file; BUT
the MC renderer does NOT play the flac track.. GET /bridge-1.flac HTTP/1.1
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 Edge/12.246 JRiver_Internet_Reader/2.0 UPnP/1.0
Icy-Metadata: 1
Host: 192.168.6.142:49153
Connection: Keep-Alive
Cache-Control: no-cache
HTTP/1.1 200 OK
Server: squeezebox-bridge
Connection: close
Content-Type: audio/flac
Transfer-Encoding: chunked
8000
>> flac media data starts here
Concerning gapless play: The principle of gapless play is that the Control Point gives the renderer two track URLs to play (the first is sent using SetAVTransportURI, and the second is sent using SetNextAVTransportURI); the renderer plays the first track,
and figures out when it is due to end; it also pre-loads the second track into memory; and at the point the first track is due to end, the renderer can immediately start playing the second one.
Now, if the server is serving the files either with a "munged" Content-Length, or Chunked (i.e. without a Content-Length at all), then the renderer has no way to figure out when the first track is due to end; so it has no way to switch gaplessly to the second track. Period.
If, as above, gapless is not supported, then the Control Point must send the first track using SetAVTransportURI, and then it monitors the renderer's Transport State until it transitions from PLAYING to STOPPED; at which point the Control Point sends the second track using SetAVTransportURI; this transition PLAYING (track 1) => STOPPED => PLAYING (track 2) is what causes the gap.
You pointed out that LMS seems to have a mode setting to "force" gapless play. Actually this is not really proper gapless playback. I cannot figure exactly what it is doing, but I think that rather than LMS monitoring the renderer's Transport State (GetTransportState) it is instead monitoring the renderer's position (GetPositionInfo) so instead of waiting for the transition PLAYING to STOPPED, it already pushes the second track towards the end of playing the first track but before it actually ends. This is a kind of sleight-of-hand trick that may appear to be less gappy than a full PLAYING (track 1) => STOPPED => PLAYING (track 2) transition.