From 059c6ab77b8e63210b9afc266d62c9f543d4d7ae Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Thu, 15 Sep 2016 22:31:16 +0200 Subject: [PATCH] Add "json" option --- src/shpub/Command/AbstractProps.php | 24 +++++++- src/shpub/Command/Article.php | 10 ++-- src/shpub/Command/Bookmark.php | 6 +- src/shpub/Command/Delete.php | 6 +- src/shpub/Command/Like.php | 4 +- src/shpub/Command/Note.php | 4 +- src/shpub/Command/Reply.php | 6 +- src/shpub/Command/Repost.php | 4 +- src/shpub/Command/Rsvp.php | 8 +-- src/shpub/Command/Undelete.php | 6 +- src/shpub/Request.php | 86 ++++++++++++++++++++++++++--- src/shpub/Validator.php | 2 +- 12 files changed, 130 insertions(+), 36 deletions(-) diff --git a/src/shpub/Command/AbstractProps.php b/src/shpub/Command/AbstractProps.php index 822fc77..c9ea8bb 100644 --- a/src/shpub/Command/AbstractProps.php +++ b/src/shpub/Command/AbstractProps.php @@ -104,11 +104,27 @@ class Command_AbstractProps 'default' => [], ) ); + static::addOptJson($cmd); + } + + protected static function addOptJson(\Console_CommandLine_Command $cmd) + { + $cmd->addOption( + 'json', + array( + 'long_name' => '--json', + 'description' => 'Send request data as JSON', + 'action' => 'StoreTrue', + 'default' => false, + ) + ); } protected function handleGenericOptions( \Console_CommandLine_Result $cmdRes, Request $req ) { + $this->handleOptJson($cmdRes, $req); + if ($cmdRes->options['published'] !== null) { $req->req->addPostParameter( 'published', $cmdRes->options['published'] @@ -146,7 +162,7 @@ class Command_AbstractProps $postParams = []; foreach ($cmdRes->options['x'] as $xproperty) { list($propkey, $propval) = explode('=', $xproperty, 2); - if (!isset($postParams[$propkey] )) { + if (!isset($postParams[$propkey])) { $postParams[$propkey] = []; } $postParams[$propkey][] = $propval; @@ -157,6 +173,12 @@ class Command_AbstractProps } } + protected function handleOptJson( + \Console_CommandLine_Result $cmdRes, Request $req + ) { + $req->setSendAsJson($cmdRes->options['json']); + } + protected function handleFiles( \Console_CommandLine_Result $cmdRes, Request $req ) { diff --git a/src/shpub/Command/Article.php b/src/shpub/Command/Article.php index 9f40daf..8445af4 100644 --- a/src/shpub/Command/Article.php +++ b/src/shpub/Command/Article.php @@ -38,14 +38,14 @@ class Command_Article extends Command_AbstractProps public function run(\Console_CommandLine_Result $cmdRes) { $req = new Request($this->cfg->host, $this->cfg); - $req->req->addPostParameter('h', 'entry'); - $req->req->addPostParameter('name', $cmdRes->args['title']); + $req->setType('entry'); + $req->addProperty('name', $cmdRes->args['title']); if ($cmdRes->options['html']) { - $req->req->addPostParameter( - 'content[html]', $cmdRes->args['text'] + $req->addProperty( + 'content', ['html' => $cmdRes->args['text']] ); } else { - $req->req->addPostParameter('content', $cmdRes->args['text']); + $req->addProperty('content', $cmdRes->args['text']); } $this->handleGenericOptions($cmdRes, $req); diff --git a/src/shpub/Command/Bookmark.php b/src/shpub/Command/Bookmark.php index e25365c..bdbe0f3 100644 --- a/src/shpub/Command/Bookmark.php +++ b/src/shpub/Command/Bookmark.php @@ -32,11 +32,11 @@ class Command_Bookmark extends Command_AbstractProps } $req = new Request($this->cfg->host, $this->cfg); - $req->req->addPostParameter('h', 'entry'); - $req->req->addPostParameter('bookmark-of', $url); + $req->setType('entry'); + $req->addProperty('bookmark-of', $url); if ($cmdRes->args['text']) { - $req->req->addPostParameter('content', $cmdRes->args['text']); + $req->addProperty('content', $cmdRes->args['text']); } diff --git a/src/shpub/Command/Delete.php b/src/shpub/Command/Delete.php index a13775a..7735e21 100644 --- a/src/shpub/Command/Delete.php +++ b/src/shpub/Command/Delete.php @@ -6,6 +6,7 @@ class Command_Delete extends Command_AbstractProps public static function opts(\Console_CommandLine $optParser) { $cmd = $optParser->addCommand('delete'); + static::addOptJson($cmd); $cmd->addArgument( 'url', [ @@ -23,8 +24,9 @@ class Command_Delete extends Command_AbstractProps } $req = new Request($this->cfg->host, $this->cfg); - $req->req->addPostParameter('action', 'delete'); - $req->req->addPostParameter('url', $url); + $this->handleOptJson($cmdRes, $req); + $req->setAction('delete'); + $req->setUrl($url); $res = $req->send(); Log::info('Post deleted from server'); diff --git a/src/shpub/Command/Like.php b/src/shpub/Command/Like.php index 65020dc..ad19b8f 100644 --- a/src/shpub/Command/Like.php +++ b/src/shpub/Command/Like.php @@ -24,8 +24,8 @@ class Command_Like extends Command_AbstractProps } $req = new Request($this->cfg->host, $this->cfg); - $req->req->addPostParameter('h', 'entry'); - $req->req->addPostParameter('like-of', $url); + $req->setType('entry'); + $req->addProperty('like-of', $url); $this->handleGenericOptions($cmdRes, $req); $res = $req->send(); diff --git a/src/shpub/Command/Note.php b/src/shpub/Command/Note.php index 2e07e9d..c7683f3 100644 --- a/src/shpub/Command/Note.php +++ b/src/shpub/Command/Note.php @@ -20,8 +20,8 @@ class Command_Note extends Command_AbstractProps public function run(\Console_CommandLine_Result $cmdRes) { $req = new Request($this->cfg->host, $this->cfg); - $req->req->addPostParameter('h', 'entry'); - $req->req->addPostParameter('content', $cmdRes->args['text']); + $req->setType('entry'); + $req->addProperty('content', $cmdRes->args['text']); $this->handleGenericOptions($cmdRes, $req); $res = $req->send(); diff --git a/src/shpub/Command/Reply.php b/src/shpub/Command/Reply.php index 493d587..6b3bc94 100644 --- a/src/shpub/Command/Reply.php +++ b/src/shpub/Command/Reply.php @@ -32,9 +32,9 @@ class Command_Reply extends Command_AbstractProps } $req = new Request($this->cfg->host, $this->cfg); - $req->req->addPostParameter('h', 'entry'); - $req->req->addPostParameter('content', implode(' ', $cmdRes->args['text'])); - $req->req->addPostParameter('in-reply-to', $url); + $req->setType('entry'); + $req->addProperty('content', implode(' ', $cmdRes->args['text'])); + $req->addProperty('in-reply-to', $url); $this->handleGenericOptions($cmdRes, $req); $res = $req->send(); diff --git a/src/shpub/Command/Repost.php b/src/shpub/Command/Repost.php index 3c39178..6d78609 100644 --- a/src/shpub/Command/Repost.php +++ b/src/shpub/Command/Repost.php @@ -24,8 +24,8 @@ class Command_Repost extends Command_AbstractProps } $req = new Request($this->cfg->host, $this->cfg); - $req->req->addPostParameter('h', 'entry'); - $req->req->addPostParameter('repost-of', $url); + $req->setType('entry'); + $req->addProperty('repost-of', $url); $this->handleGenericOptions($cmdRes, $req); $res = $req->send(); diff --git a/src/shpub/Command/Rsvp.php b/src/shpub/Command/Rsvp.php index 5ed8ecd..69602d9 100644 --- a/src/shpub/Command/Rsvp.php +++ b/src/shpub/Command/Rsvp.php @@ -47,11 +47,11 @@ class Command_Rsvp extends Command_AbstractProps } $req = new Request($this->cfg->host, $this->cfg); - $req->req->addPostParameter('h', 'entry'); - $req->req->addPostParameter('in-reply-to', $url); - $req->req->addPostParameter('rsvp', $rsvp); + $req->setType('h', 'entry'); + $req->addProperty('in-reply-to', $url); + $req->addProperty('rsvp', $rsvp); if ($cmdRes->args['text'] != '') { - $req->req->addPostParameter('content', $cmdRes->args['text']); + $req->addProperty('content', $cmdRes->args['text']); } $this->handleGenericOptions($cmdRes, $req); diff --git a/src/shpub/Command/Undelete.php b/src/shpub/Command/Undelete.php index ad3525f..55dd6b9 100644 --- a/src/shpub/Command/Undelete.php +++ b/src/shpub/Command/Undelete.php @@ -6,6 +6,7 @@ class Command_Undelete extends Command_AbstractProps public static function opts(\Console_CommandLine $optParser) { $cmd = $optParser->addCommand('undelete'); + static::addOptJson($cmd); $cmd->addArgument( 'url', [ @@ -23,8 +24,9 @@ class Command_Undelete extends Command_AbstractProps } $req = new Request($this->cfg->host, $this->cfg); - $req->req->addPostParameter('action', 'undelete'); - $req->req->addPostParameter('url', $url); + $this->handleOptJson($cmdRes, $req); + $req->setAction('undelete'); + $req->setUrl($url); $res = $req->send(); Log::info('Post restored at server'); diff --git a/src/shpub/Request.php b/src/shpub/Request.php index cbcc57e..0cadc48 100644 --- a/src/shpub/Request.php +++ b/src/shpub/Request.php @@ -6,9 +6,15 @@ 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) { $this->cfg = $cfg; @@ -25,6 +31,49 @@ 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); @@ -44,30 +93,44 @@ 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); } /** - * Add one or multiple POST parameters. - * Automatically adds them as array or as string. + * Adds a micropub property to the request. * * @param string $key Parameter name * @param string|array $values One or multiple values */ - public function addPostParameter($key, $values) + public function addProperty($key, $values) { - if (count($values) == 1) { - $values = reset($values); - } - $this->req->addPostParameter($key, $values); + $this->properties[$key] = (array) $values; } protected function printCurl() @@ -122,4 +185,9 @@ class Request Log::msg($command); } + + public function setSendAsJson($json) + { + $this->sendAsJson = $json; + } } \ No newline at end of file diff --git a/src/shpub/Validator.php b/src/shpub/Validator.php index 283604d..c751595 100644 --- a/src/shpub/Validator.php +++ b/src/shpub/Validator.php @@ -35,7 +35,7 @@ class Validator if (false === array_search($answer, $allowed)) { Log::err( 'Invalid RSVP answer given; allowed are: ' - . implode (', ', $allowed) + . implode(', ', $allowed) ); return false; } -- 2.30.2