[erlang-questions] Any tcp related changes in R15B* that might cause this?
Anthony Molinaro
anthonym@REDACTED
Thu Dec 13 19:38:30 CET 2012
Hi Steve,
It may not be directly caused by your patch, but that was the first
patch that stuck out when I started looking through the readmes for the
releases. I've not been able to untangle mochiweb enough to do a test
without it, so attached is a test file which uses mochiweb.
If you compile it, you should see this with R14B04
Erlang R14B04 (erts-5.8.5) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.5 (abort with ^G)
1> mochi_test:start().
{ok,<0.44.0>}
2> mochi_test:test(10000).
{ok,{{"HTTP/1.1",400,"Bad Request"},
[{"date","Thu, 13 Dec 2012 18:36:06 GMT"},
{"server","MochiWeb/1.0 (Any of you quaids got a smint?)"},
{"content-length","0"}],
[]}}
3>
and this with R15B02
Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9.2 (abort with ^G)
1> mochi_test:start().
{ok,<0.44.0>}
2> mochi_test:test(10000).
{error,socket_closed_remotely}
3>
I used Mochiweb 2.3.1 and compiled it and the test code with R14B04, then
ran the test with the 2 different versions. Discovering the exact errors
consisted of adding some debug output to mochiweb_http:headers/5 and
mochiweb_http:request/2 in the _Other clauses.
After talking with the mochiweb devs on the mochiweb group, I'll probably
submit a patch there to deal with the tcp_error, but it would be interesting
to know what caused the behavior change.
Looking forward to any results you might get,
-Anthony
On Wed, Dec 12, 2012 at 08:35:11PM -0500, Steve Vinoski wrote:
> On Wed, Dec 12, 2012 at 7:24 PM, Anthony Molinaro <
> anthonym@REDACTED> wrote:
>
> > Okay, I found it. Looks like this is the cause
> >
> > OTP-9389 Honor option packet_size for http packet parsing by both TCP
> > socket and erlang:decode_packet. This gives the ability to
> > accept HTTP headers larger than the default setting, but also
> > avoid DoS attacks by accepting lines only up to
> > whatever length you wish to allow. For consistency,
> > packet type line also honor option packet_size. (Thanks
> > to Steve Vinoski)
> >
> > With R14B04 when you have a header which is too long, your process
> > gets a message like
> >
> >
> > {http,#Port<0.120387186>,{http_error,"X2qutbTBbXg7VHgDDhGrEvDbzuxiyDlI7VFloMyAJKVqY2fTEkMc70UchLPRG8Cjowzmib4KszbCRwA5IBbAd2MbRi5X_tK2nfRtheavXdhQv8XbinzmhCM1E9YCeuFAg_9TfqUS0sWUd52mgjkWGqNe4Z9S0IxFYnFtf5..."}}
> >
> > in R15B02 you get a message like
> >
> > {tcp_error,#Port<0.104208233>,emsgsize}
> >
> > The prior case is handled correctly by mochiweb, the latter is not.
> >
>
>
> I just ran a simple test case against the commit prior to 5984409d and then
> against 5984409d, in both cases sending an HTTP header of various lengths,
> and in both cases always received http_error, and never tcp_error. The
> server simply did a receive with the socket in http_bin mode.
>
> How long is the header in your case? Do you have a test case you can send
> me?
>
>
> I'm not sure if the commits for OTP-9389 actually caused this change or if
> > it was some other change. Also, not sure if it was meant to be a backward
> > compatible change or not (the comment on the commit
> >
> > https://github.com/erlang/otp/commit/5984409d1264871cbe61bfec875de53e51713efb
> > seems to suggest it was supposed to be backward compatible, but maybe this
> > was a side effect? It seems like emsgsize is more correct.
> >
>
>
> I think the intent was to be backward compatible; I seem to remember that
> putting the patch together was very difficult and time-consuming due to
> trying to achieve that, with numerous iterations and reviews.
>
> --steve
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
--
------------------------------------------------------------------------
Anthony Molinaro <anthonym@REDACTED>
-------------- next part --------------
-module(mochi_test).
-export([start/0,
stop/0,
handle_http/1,
test/1]).
start() ->
application:start (inets),
mochiweb_http:start([{port, 5678}, {loop, fun(Req) -> handle_http(Req) end}]).
stop() ->
mochiweb_http:stop().
handle_http(Req) ->
Req:respond({ 200,
[ {"Content-Type", "text/html"} ],
[ "<html><body>Hello</body></html>" ]
}).
test (Len) ->
Random =
get_random_string (Len,
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"),
httpc:request (get, {"http://127.0.0.1:5678/",
[{"X-Random", Random}]}, [], []).
% grabbed from
% http://blog.teemu.im/2009/11/07/generating-random-strings-in-erlang/
get_random_string(Length, AllowedChars) ->
lists:foldl(fun(_, Acc) ->
[lists:nth(random:uniform(length(AllowedChars)),
AllowedChars)] ++ Acc
end, [], lists:seq(1, Length)).
More information about the erlang-questions
mailing list