DSheirer / sdrtrunk

A cross-platform java application for decoding, monitoring, recording and streaming trunked mobile and related radio protocols using Software Defined Radios (SDR). Website:
GNU General Public License v3.0
1.55k stars 252 forks source link

Apache Mina HTTP Client Doesn't Handle HTTP 1.0 Response Headers #674

Open DSheirer opened 4 years ago

DSheirer commented 4 years ago

The MINA HttpClientDecoder expects that the response header will have HTTP:x.x format, but Icecast is sending HTTP/1.0 in the response header and this is causing the error message seen below.

See if you can add a response handler to take care of these HTTP/1.0 response and properly display the error message to the user.

15:57:15.859 ERROR i.g.d.a.b.i.IcecastHTTPAudioBroadcaster - HTTP protocol decoder error [68MB/169MB 40%] org.apache.mina.filter.codec.ProtocolDecoderException: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1 (Hexdump: 48 54 54 50 2F 31 2E 30 20 34 30 33 20 46 6F 72 62 69 64 64 65 6E 0D 0A 53 65 72 76 65 72 3A 20 49 63 65 63 61 73 74 20 32 2E 34 2E 33 0D 0A 44 61 74 65 3A 20 54 68 75 2C 20 31 32 20 4D 61 72 20 32 30 32 30 20 32 32 3A 35 37 3A 31 35 20 47 4D 54 0D 0A 43 6F 6E 74 65 6E 74 2D 54 79 70 65 3A 20 74 65 78 74 2F 70 6C 61 69 6E 3B 20 63 68 61 72 73 65 74 3D 75 74 66 2D 38 0D 0A 43 61 63 68 65 2D 43 6F 6E 74 72 6F 6C 3A 20 6E 6F 2D 63 61 63 68 65 0D 0A 45 78 70 69 72 65 73 3A 20 4D 6F 6E 2C 20 32 36 20 4A 75 6C 20 31 39 39 37 20 30 35 3A 30 30 3A 30 30 20 47 4D 54 0D 0A 50 72 61 67 6D 61 3A 20 6E 6F 2D 63 61 63 68 65 0D 0A 41 63 63 65 73 73 2D 43 6F 6E 74 72 6F 6C 2D 41 6C 6C 6F 77 2D 4F 72 69 67 69 6E 3A 20 2A 0D 0A 0D 0A 74 6F 6F 20 6D 61 6E 79 20 73 6F 75 72 63 65 73 20 63 6F 6E 6E 65 63 74 65 64) at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:262) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:641) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48) at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1114) at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:121) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:641) at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:634) at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:539) at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$1200(AbstractPollingIoProcessor.java:68) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.process(AbstractPollingIoProcessor.java:1242) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.process(AbstractPollingIoProcessor.java:1231) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:683) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:830) Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1 at org.apache.mina.http.HttpClientDecoder.parseHttpReponseHead(HttpClientDecoder.java:221) at org.apache.mina.http.HttpClientDecoder.decode(HttpClientDecoder.java:108) at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:253) ... 15 common frames omitted

mattloretitsch-od commented 4 years ago

I am having the same problem here as well.

Wireshark: HTTP/1.1 200 OK

PUT / HTTP/1.1 Authorization: Basic obscured ice-genre: Public Accept: / ice-name: SPD ice-audio-info: samplerate=8000;quality=7;channels=1 User-Agent: sdrtrunk v0.4.0-beta.6 ice-public: 1 ice-bitrate: 16 ice-description: Police Content-Type: audio/mpeg

And the java error that is thrown

16:24:00.125 ERROR i.g.d.a.b.i.IcecastHTTPAudioBroadcaster - HTTP protocol decoder error [41MB/59MB 70%] org.apache.mina.filter.codec.ProtocolDecoderException: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1 (Hexdump: 48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D 0A 0D 0A) at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:262) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:641) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48) at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:1114) at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:121) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:641) at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:634) at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:539) at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$1200(AbstractPollingIoProcessor.java:68) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.process(AbstractPollingIoProcessor.java:1242) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.process(AbstractPollingIoProcessor.java:1231) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:683) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.base/java.lang.Thread.run(Unknown Source) Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1 at org.apache.mina.http.HttpClientDecoder.parseHttpReponseHead(HttpClientDecoder.java:221) at org.apache.mina.http.HttpClientDecoder.decode(HttpClientDecoder.java:108) at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:253)

infecticide commented 3 years ago

Not sure if this is the place to put this or not. This seems to have to do with the HTTP headers so my issue is certainly in the ballpark.

Today I tried to setup a reverse proxy of the Icecast server behind Apache2.

From various other posts on the internet, it seems this should be possible.

The issue I've run into is that the SDRTrunk Icecast client doesn't seem to be sending a "Host" header when it attempts to setup the mounts. This results in the apache proxy returning an HTTP 400 Bad Request.

The Apache logs show this: [Wed Aug 25 11:46:59.811305 2021] [core:debug] [pid 13265:tid 140322403243776] protocol.c(1445): [client 192.168.2.1:7347] AH00569: client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /regp25_worksscale