"Route exception: Bad Content-Length: maybe client disconnect?" with JSON POST and request->content
Hi all, I'm running into an issue that looks like a bug, but I'm unsure where it comes from. Could be in Dancer2, but maybe in Plack::Request, or even in Plack::Test, HTTP::Request, or somewhere else. I'm kinda lost in the woods. I was hoping that a mind greater than mine can shed some light on this. I get an error "Route exception: Bad Content-Length: maybe client disconnect? (xx bytes remaining)" where xx is the total content length of the request body. But only under the following conditions: - (valid) JSON POST to a Dancer2 app - the app is configured with serializer = JSON - in the route there's a call to: request->content - using Plack::Test and HTTP::Request Attached is a minimal test to demonstrate the issue. Test no 5 fails. I cannot reproduce this issue when using f.e. curl, this call works without errors: curl --data-binary '{ "foo": "123" }' --header 'Content-type: application/json' http://localhost:3000/nok I am using the latest version of Dancer (0.200003) and also latest CPAN versions of Plack and HTTP::Request. Any insights? Thanks, Lennart
I'm afraid I didn't get the attachment, so apologies if this guess is out, but are you setting the content-length on your HTTP::Request? If not, have a look at how HTTP::Request::Common does it - https://metacpan.org/source/ETHER/HTTP-Message-6.11/lib/HTTP/Request/Common.... - (or indeed just use HTTP::Request::Common itself). Daniel -----Original Message----- From: dancer-users [mailto:dancer-users-bounces@dancer.pm] On Behalf Of Lennart Hengstmengel Sent: 22 July 2016 12:38 To: dancer-users@dancer.pm Subject: [dancer-users] "Route exception: Bad Content-Length: maybe client disconnect?" with JSON POST and request->content Hi all, I'm running into an issue that looks like a bug, but I'm unsure where it comes from. Could be in Dancer2, but maybe in Plack::Request, or even in Plack::Test, HTTP::Request, or somewhere else. I'm kinda lost in the woods. I was hoping that a mind greater than mine can shed some light on this. I get an error "Route exception: Bad Content-Length: maybe client disconnect? (xx bytes remaining)" where xx is the total content length of the request body. But only under the following conditions: - (valid) JSON POST to a Dancer2 app - the app is configured with serializer = JSON - in the route there's a call to: request->content - using Plack::Test and HTTP::Request Attached is a minimal test to demonstrate the issue. Test no 5 fails. I cannot reproduce this issue when using f.e. curl, this call works without errors: curl --data-binary '{ "foo": "123" }' --header 'Content-type: application/json' http://localhost:3000/nok I am using the latest version of Dancer (0.200003) and also latest CPAN versions of Plack and HTTP::Request. Any insights? Thanks, Lennart
Hi Daniel, Thanks for your reply. I am doing nothing myself with the content length, indeed I am using HTTP::Request::Common to handle everything. Here's the test script inline: #!/usr/bin/env perl package MyApp; use strict; use warnings; use Dancer2; use Data::Dumper; set serializer => 'JSON'; any '/ok' => sub { return {}; }; any '/nok' => sub { my $a = request->content; #print STDERR Dumper $a; #print STDERR Dumper { params('body') }; return {}; }; # dance(); package main; use strict; use warnings; use Test::More; use Plack::Test; use HTTP::Request::Common; use JSON; my $app = MyApp->to_app; isa_ok( $app, 'CODE' ); test_psgi $app, sub { my $cb = shift; my $res = $cb->( GET '/ok' ); ok($res->code == 200, "GET route without request->content call"); $res = $cb->( GET '/nok' ); ok($res->code == 200, "GET route with request->content call"); my $json_data = { foo => 'bar' }; $res = $cb->( POST '/ok', 'Content-Type' => 'application/json', Content => JSON::to_json($json_data), ); ok($res->code == 200, "JSON POST to route without request->content call"); $res = $cb->( POST '/nok', 'Content-Type' => 'application/json', Content => JSON::to_json($json_data), ); # this test fails. ok($res->code == 200, "JSON POST to route with request->content call"); }; done_testing; 1; On 22-07-16 13:44, Daniel Perrett wrote:
I'm afraid I didn't get the attachment, so apologies if this guess is out, but are you setting the content-length on your HTTP::Request? If not, have a look at how HTTP::Request::Common does it - https://metacpan.org/source/ETHER/HTTP-Message-6.11/lib/HTTP/Request/Common.... - (or indeed just use HTTP::Request::Common itself).
Daniel
-----Original Message----- From: dancer-users [mailto:dancer-users-bounces@dancer.pm] On Behalf Of Lennart Hengstmengel Sent: 22 July 2016 12:38 To: dancer-users@dancer.pm Subject: [dancer-users] "Route exception: Bad Content-Length: maybe client disconnect?" with JSON POST and request->content
Hi all,
I'm running into an issue that looks like a bug, but I'm unsure where it comes from. Could be in Dancer2, but maybe in Plack::Request, or even in Plack::Test, HTTP::Request, or somewhere else. I'm kinda lost in the woods. I was hoping that a mind greater than mine can shed some light on this.
I get an error "Route exception: Bad Content-Length: maybe client disconnect? (xx bytes remaining)" where xx is the total content length of the request body. But only under the following conditions:
- (valid) JSON POST to a Dancer2 app - the app is configured with serializer = JSON - in the route there's a call to: request->content - using Plack::Test and HTTP::Request
Attached is a minimal test to demonstrate the issue. Test no 5 fails.
I cannot reproduce this issue when using f.e. curl, this call works without errors:
curl --data-binary '{ "foo": "123" }' --header 'Content-type: application/json' http://localhost:3000/nok
I am using the latest version of Dancer (0.200003) and also latest CPAN versions of Plack and HTTP::Request.
Any insights?
Thanks, Lennart
_______________________________________________ dancer-users mailing list dancer-users@dancer.pm http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
participants (2)
-
Daniel Perrett -
Lennart Hengstmengel