Add "json" option
[shpub.git] / src / shpub / Request.php
index 44894c572124a5662042145855eb7d9283129520..0cadc484c6d5391ddde586c107033ec3411e1562 100644 (file)
@@ -6,7 +6,14 @@ class Request
     public $req;
     public $cfg;
 
+    protected $sendAsJson = false;
     protected $uploadsInfo = [];
+    protected $dedicatedBody = false;
+
+    protected $properties = [];
+    protected $type = null;
+    protected $action = null;
+    protected $url = null;
 
     public function __construct($host, $cfg)
     {
@@ -24,7 +31,51 @@ class Request
 
     public function send($body = null)
     {
+        if ($this->sendAsJson) {
+            //application/json
+            if ($body !== null) {
+                throw new \Exception('body already defined');
+            }
+            $this->req->setHeader('Content-Type: application/json');
+            $data = [];
+            if ($this->action !== null) {
+                $data['action'] = $this->action;
+            }
+            if ($this->url !== null) {
+                $data['url'] = $this->url;
+            }
+            if ($this->type !== null) {
+                $data['type'] = 'h-' . $this->type;
+            }
+            if (count($this->properties)) {
+                $data['properties'] = $this->properties;
+            }
+            $body = json_encode($data);
+        } else {
+            //form-encoded
+            if ($this->type !== null) {
+                $this->req->addPostParameter('h', $this->type);
+            }
+            if ($this->action !== null) {
+                $this->req->addPostParameter('action', $this->action);
+            }
+            if ($this->url !== null) {
+                $this->req->addPostParameter('url', $this->url);
+            }
+            foreach ($this->properties as $propkey => $propval) {
+                if (isset($propval['html'])) {
+                    //workaround for content[html]
+                    $propkey = $propkey . '[html]';
+                    $propval = $propval['html'];
+                } else if (count($propval) == 1) {
+                    $propval = reset($propval);
+                }
+                $this->req->addPostParameter($propkey, $propval);
+            }
+        }
+
         if ($body !== null) {
+            $this->dedicatedBody = true;
             $this->req->setBody($body);
         }
         if ($this->cfg->debug) {
@@ -42,17 +93,46 @@ class Request
         return $res;
     }
 
+    public function setAction($action)
+    {
+        $this->action = $action;
+    }
+
+    public function setType($type)
+    {
+        $this->type = $type;
+    }
+
+    public function setUrl($url)
+    {
+        $this->url = $url;
+    }
+
     /**
-     * @param string                $fieldName    name of file-upload field
-     * @param string|resource|array $filename     full name of local file,
+     * @param string                $fieldName name of file-upload field
+     * @param string|resource|array $filename  full name of local file,
      *               pointer to open file or an array of files
      */
     public function addUpload($fieldName, $filename)
     {
+        if ($this->sendAsJson) {
+            throw new \Exception('File uploads do not work with JSON');
+        }
         $this->uploadsInfo[$fieldName] = $filename;
         return $this->req->addUpload($fieldName, $filename);
     }
 
+    /**
+     * Adds a micropub property to the request.
+     *
+     * @param string       $key    Parameter name
+     * @param string|array $values One or multiple values
+     */
+    public function addProperty($key, $values)
+    {
+        $this->properties[$key] = (array) $values;
+    }
+
     protected function printCurl()
     {
         $command = 'curl';
@@ -68,7 +148,15 @@ class Request
 
         if (count($this->uploadsInfo) == 0) {
             foreach ($postParams as $k => $v) {
-                $command .= ' -d ' . escapeshellarg($k . '=' . $v);
+                if (!is_array($v)) {
+                    $command .= ' -d ' . escapeshellarg($k . '=' . $v);
+                } else {
+                    foreach ($v as $ak => $av) {
+                        $command .= ' -d ' . escapeshellarg(
+                            $k . '[' . $ak . ']=' . $av
+                        );
+                    }
+                }
             }
         } else {
             foreach ($postParams as $k => $v) {
@@ -89,8 +177,17 @@ class Request
             }
         }
 
+        if ($this->dedicatedBody) {
+            $command .= ' --data ' . escapeshellarg($this->req->getBody());
+        }
+
         $command .= ' ' . escapeshellarg((string) $this->req->getUrl());
 
-        echo $command . "\n";
+        Log::msg($command);
+    }
+
+    public function setSendAsJson($json)
+    {
+        $this->sendAsJson = $json;
     }
 }
\ No newline at end of file