[pve-devel] [PATCH http-server 1/2] fix #2766: allow application/json as content-type for post/put requests

Dominik Csapak d.csapak at proxmox.com
Fri May 29 15:29:00 CEST 2020


this makes creating an api client much nicer

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 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.20.1





More information about the pve-devel mailing list