The Icecast source protocol is built on HTTP. Since Icecast 2.4 it uses the PUT verb which is in the HTTP specs, in the past SOURCE was used. Very old Icecast compatible encoders might also send ICE/ instead of HTTP/. It is best not to check on those.

Icecast specific headers

ice-public this can be either 0 or 1. This tells if the source wants to get listed in the directory or not (ignored in Cast)
ice-name specifies the stream name
ice-description specifies a description for the stream
ice-url is the URL for the radio station
ice-genre is the genre for the station
ice-bitrate tells the bitrate for the stream, this value is optional and informative (can be incorrect) (ignored in Cast)
ice-audio-info gives a POST like key value string with extra info on the audio, this is optional and informative (can be incorrect) (ignored in Cast)

📘

When building an encoder we advise to send the host header too, this allows further deprecation of portnumbers in internet radio to all become the default 80/443.

Responses

200 OK everything is fine, send the audio stream in the body
100 Continue is sent before OK if the Request: 100-continue is set
401 You need to authenticate sent if the login was missing or incorrect
403 Content-type not supported sent if the content is not supported by the server
403 No Content-type given sent if no Content-Type header wan sent
403 internal format allocation problem sent on internal Icecast error
403 too many sources connected sent when connection limit was reached
403 Mountpoint in use sent when the mountpoint is already in use
500 Internal Server Error as the name says

Example

> PUT /live/ HTTP/1.1
> Authorization: Basic BASE64
> Host: example.com:8001
> Accept: */*
> Content-Type: audio/mpeg
> ice-Public: 1
> ice-Name: Test
> ice-Description: This is just a simple test stream
> ice-URL: http://example.com
> ice-Genre: Rock
> Expect: 100-continue
> 
< HTTP/1.1 100 Continue
< HTTP/1.0 200 OK
> [ Stream data sent by cient ]

Read more

https://gist.github.com/ePirat/adc3b8ba00d85b7e3870