dlal66 has asked for the wisdom of the Perl Monks concerning the following question:

I need some wisdom regarding how to handle a problem. I have code that sends and receives responses using JSON::RPC::Client. We changed our HTTPServer to nginx and now my program does not work.

I get the message:

malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "Content-Type: applic...") at /root/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/JSON/RPC/Client.pm line 186.

My application call looks like:
my $callobj = { method => "$cmd", version => '2.0', id => '3232', }; my $res = $client->call( $uri, $callobj, ); if ($res->is_success) { print "Success\n"; } else { print "Error\n"; }

I do see in wireshark the response and it is properly decoded by wireshark. My program simply crashes at:

my $res = $client->call( $uri, $callobj, );

and I have no way of "seeing" what the response is. If I use "curl" to send the same request using command line, that works. What can I do to troubleshoot/bypass/fix this issue? Thanks

Replies are listed 'Best First'.
Re: JSON RPC
by Your Mother (Archbishop) on Jan 15, 2016 at 15:52 UTC

    This is a stab in the dark but the error line is my $content = ( $json || JSON->new->utf8 )->decode( $obj->content ); and the error/bad JSON is "Content-Type..." so to me it looks like perhaps you are double printing headers from your application. Something like–

    HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Type: application/json Content-Length: 13 {"oh":"hai!"}
      No. I am having JSON::RPC::Client handle everything. I can see on wireshark that the request sent and received both have no double headers".

        Well the error is pretty clear that it's attempting to parse a Content-Type line as JSON so... If I were you, I'd add some debug printing to the module to see what *it* is getting (server bug or unexpected response) or what it thinks it's getting and subsequently handling incorrectly (module bug).

Re: JSON RPC
by neilwatson (Priest) on Jan 15, 2016 at 15:39 UTC

    You say curl gives you a response, but is that response the same from HTTPServer and Nginx? If not, what is the difference?

    Neil Watson
    watson-wilson.ca

      The headers are different between nginx and the older http server. Other than that, the json response is the same. Curl works with both the HTTP Servers
Re: JSON RPC
by Anonymous Monk on Jan 15, 2016 at 23:46 UTC