fix #2766: allow application/json as content-type for post/put requests

this makes creating an api client much nicer

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak 2020-05-29 15:29:00 +02:00 committed by Thomas Lamprecht
parent 779306a757
commit 3e05f16607

View File

@ -44,6 +44,7 @@ use HTTP::Headers;
use HTTP::Request; use HTTP::Request;
use HTTP::Response; use HTTP::Response;
use Data::Dumper; use Data::Dumper;
use JSON;
my $limit_max_headers = 30; my $limit_max_headers = 30;
my $limit_max_header_size = 8*1024; my $limit_max_header_size = 8*1024;
@ -693,7 +694,15 @@ sub extract_params {
my $params = {}; my $params = {};
if ($method eq 'PUT' || $method eq 'POST') { if ($method eq 'PUT' || $method eq 'POST') {
$params = decode_urlencoded($r->content); my $ct;
if (my $ctype = $r->header('Content-Type')) {
$ct = parse_content_type($ctype);
}
if (defined($ct) && $ct eq 'application/json') {
$params = decode_json($r->content);
} else {
$params = decode_urlencoded($r->content);
}
} }
my $query_params = decode_urlencoded($r->url->query()); my $query_params = decode_urlencoded($r->url->query());
@ -1356,7 +1365,7 @@ sub unshift_read_header {
return; return;
} }
if (!$ct || $ct eq 'application/x-www-form-urlencoded') { if (!$ct || $ct eq 'application/x-www-form-urlencoded' || $ct eq 'application/json') {
$reqstate->{hdl}->unshift_read(chunk => $len, sub { $reqstate->{hdl}->unshift_read(chunk => $len, sub {
my ($hdl, $data) = @_; my ($hdl, $data) = @_;
$r->content($data); $r->content($data);