Parsing an incoming Shoutcast request

Thomas Lindgren thomasl_erlang@REDACTED
Mon May 29 16:38:54 CEST 2006



--- Andrew Lentvorski <bsder@REDACTED> wrote:

> Another newbie question.
> 
> I'm trying to do something very similar to the
> Shoutcast server sample 
> code from Practical Common Lisp.  The initial
> request from an MP3 client 
> to the streaming server (which I want to write in
> Erlang) looks very 
> much like HTTP.
> 
> GET / HTTP/1.1\r\n
> Host: 127.0.0.1:33669\r\n
> User-Agent: VLC media player - version 0.8.5 Janus -
> VideoLAN team\r\n
> Range: bytes=0-\r\n
> Icy-MetaData: 1\r\n
> Connection: Close\r\n
> \r\n
> 
> Now, I know have to do the gen_tcp:listen and
> gen_tcp:accept to get the 
> actual connection socket.
> 
> Once, I have that socket, though, I either need to
> do something with 
> messages and {active, once} or gen_tcp:recv() and
> {active, false}.
> 
> I can't see a particularly obvious way to structure
> this for pattern 
> matches to make things easy.

Start with setting the socket in {packet,line} mode,
which delivers messages in units of "lines". See "man
inet" for details.

You can then match on each incoming line, something
like this (OK, I haven't checked that this actually
works, but the principle should be clear):

match_header_line(<<"\r\n">>, State) ->
   header_done(State);
match_header_line(<<"User agent:", Name/binary>>,
State) ->
   add_user_agent(Name, State);
...

Alternatively, and even simpler: if the protocol is
close enough to HTTP, there is the semi-secret
{packet, http} mode.

Best,
Thomas


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 



More information about the erlang-questions mailing list