[erlang-questions] erlang-questions] Erlang HTTP client is not so fault tollerant...
Ingela Anderton Andin
ingela@REDACTED
Mon Dec 10 09:59:36 CET 2007
Hi!
The code for parsing HTTP is not written defensively, yes we want the
parsing code to crash on bad input. The HTTP-client did not crash
it returned an error-message (so it is fault tolerant!) That in this
case happens to be
the call-stack as it was an unexpected error in some sense.
{error,{badarg,[{erlang,list_to_integer,["301\r\nDate:"]},
{httpc_response,parse_status_code,4},
{httpc_handler,handle_info,2},
{gen_server,handle_msg,5},
{proc_lib,init_p,5}]}}
In this particular case it could be argued the a more "user-friendly"
error-message could be accomplished. It is true that a temporary
process spawned by the http client crashed and was reported to have
done so.
I am considering catching the error in the temporary process
and then letting it terminate normaly to avoid confusion.
Something like {http_parse_error, HTTPMsg}
could be given as reason instead of the call-stack.
This particular error is something that we
will consider accepting in the relaxed mode of the HTTP-client.
Regards Ingela - OTP team
> Hi there,
>
> a normal HTTP 301 response should look like this:
>
> HTTP/1.1 301 Moved Permanently
> Date: Sun, 09 Dec 2007 10:54:02 GMT
> Server: Apache/1.3.37 (Unix) PHP/4.4.4 with Suhosin-Patch
> FrontPage/5.0.2.4803 mod_fastcgi/mod_fastcgi-SNAP-0404142202 mod_ssl/2.8.28
> OpenSSL/0.9.6i
> Location: http://www.spielendverdienen.de/startseite.html
>
> However, some servers return
>
> HTTP/1.1 301
> Date: Sun, 09 Dec 2007 10:52:58 GMT
> Server: Apache/1.3.37 (Unix) FrontPage/5.0.2.2623 mod_ssl/2.8.28
> OpenSSL/0.9.8a
> Location: http://charmed.qanet.de/en/
>
> (notice the first line, in the second response the reason is missing)
>
> When requesting a page from a server that returns the second http-response,
> erlang crashes:
>
> 27> http:request("http://charmed.qanet.de/",foo).
> {error,{badarg,[{erlang,list_to_integer,["301\r\nDate:"]},
> {httpc_response,parse_status_code,4},
> {httpc_handler,handle_info,2},
> {gen_server,handle_msg,5},
> {proc_lib,init_p,5}]}}
>
> =ERROR REPORT==== 9-Dec-2007::14:04:08 ===
> ** Generic server <0.106.0> terminating
> ** Last message in was {tcp,#Port<0.185>,
> <<"HTTP/1.1 301\r\nDate: Sun, 09 Dec 2007
> 13:04:18 G
> MT\r\nServer: Apache/1.3.37 (Unix) FrontPage/5.0.2.2623 mod_ssl/2.8.28
> OpenSSL/0
> .9.8a\r\nLocation: http://charmed.qanet.de/en/\r\nKeep-Alive: timeout=15,
> max=10
> 0\r\nConnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\nContent-Type:
> text/
> html\r\n\r\n">>}
> ** When Server state == {state,
> {request,#Ref<0.0.0.444>,<0.62.0>,0,http,
> {"charmed.qanet.de",80},
> "/",[],get,
> {http_request_h,undefined,"keep-alive",
> undefined,undefined,undefined,undefined,
> undefined,undefined,undefined,undefined,
> undefined,undefined,undefined,undefined,
> undefined,undefined,"charmed.qanet.de",
> undefined,undefined,undefined,undefined,
> undefined,undefined,undefined,undefined,
> undefined,[],undefined,undefined,
> undefined,undefined,"0",undefined,
> undefined,undefined,undefined,undefined,
> undefined,[]},
> {[],[]},
> {http_options,infinity,true,[],undefined,
> false},
> "http://charmed.qanet.de/",[],none,[]},
> {tcp_session,
> {{"charmed.qanet.de",80},<0.106.0>},
> false,http,#Port<0.185>,1},
> undefined,undefined,undefined,
> {httpc_response,parse,[nolimit]},
> {[],[]},
> new,[],nolimit,nolimit,
> {options,
> {undefined,[]},
> 0,2,2,enabled,enabled,false},
> {timers,[],undefined},
> httpc_manager_foo,undefined}
> ** Reason for termination ==
> ** {badarg,[{erlang,list_to_integer,["301\r\nDate:"]},
> {httpc_response,parse_status_code,4},
> {httpc_handler,handle_info,2},
> {gen_server,handle_msg,5},
> {proc_lib,init_p,5}]}
> 28>
>
> Therefore, I'd like to replace the first line of the incoming server
> response from "HTTP/1.1 301\r\n" to "HTTP/1.1 301 Moved Permanently\r\n",
> but I can't seem to find where the appropriate to do so would be...
>
> Can you help me with this?
>
More information about the erlang-questions
mailing list