From 3e05f16607335d87dc026f3172070ac3c03691d6 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Fri, 29 May 2020 15:29:00 +0200 Subject: [PATCH] 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 --- PVE/APIServer/AnyEvent.pm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/PVE/APIServer/AnyEvent.pm b/PVE/APIServer/AnyEvent.pm index 3d755d4..e5f2cb4 100644 --- a/PVE/APIServer/AnyEvent.pm +++ b/PVE/APIServer/AnyEvent.pm @@ -44,6 +44,7 @@ use HTTP::Headers; use HTTP::Request; use HTTP::Response; use Data::Dumper; +use JSON; my $limit_max_headers = 30; my $limit_max_header_size = 8*1024; @@ -693,7 +694,15 @@ sub extract_params { my $params = {}; 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()); @@ -1356,7 +1365,7 @@ sub unshift_read_header { 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 { my ($hdl, $data) = @_; $r->content($data); -- 2.39.2