Permalink
Browse files

Use Request/Response objects instead of direct printing. Create dedic…

…ated Message object when necessary
  • Loading branch information...
1 parent 01c7533 commit bbe3ee1f9edcc79d38dc96c5703c9feec39cbcdd @cdujeu cdujeu committed Jun 1, 2016
@@ -115,19 +115,21 @@ protected function serializeData($data, $serializer){
}else if($serializer == self::SERIALIZER_TYPE_XML){
$wrap = true;
$buffer = "";
+ $charset = null;
foreach ($data as $serializableItem){
if(!$serializableItem instanceof XMLSerializableResponseChunk){
continue;
}
$buffer .= $serializableItem->toXML();
if($serializableItem instanceof XMLDocSerializableResponseChunk){
$wrap = false;
+ $charset = $serializableItem->getCharset();
}
}
if($wrap){
return XMLWriter::wrapDocument($buffer);
}else{
- return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>".$buffer;
+ return "<?xml version=\"1.0\" encoding=\"".$charset."\"?>".$buffer;
}
}
return "";
@@ -20,11 +20,10 @@
*/
namespace Pydio\Core\Http\Response;
-use Pydio\Core\Http\Response\XMLSerializableResponseChunk;
defined('AJXP_EXEC') or die('Access not allowed');
interface XMLDocSerializableResponseChunk extends XMLSerializableResponseChunk
{
-
+ public function getCharset();
}
@@ -98,9 +98,6 @@ function tryToLogUser(\Psr\Http\Message\ServerRequestInterface &$request, \Psr\H
}
$response = $response->withHeader("Content-type", "application/xml");
$response->getBody()->write(XMLWriter::loggingResult($loggingResult, $rememberLogin, $rememberPass, $secureToken, false));
- //XMLWriter::header();
- //XMLWriter::loggingResult($loggingResult, $rememberLogin, $rememberPass, $secureToken);
- //XMLWriter::close();
if($loggingResult > 0 && $loggedUser != null){
@@ -127,14 +127,6 @@ function tryToLogUser(\Psr\Http\Message\ServerRequestInterface &$request, \Psr\H
protected function breakAndSendError($exceptionMsg){
throw new \Pydio\Core\Exception\AuthRequiredException($exceptionMsg);
- /*
- XMLWriter::header();
- XMLWriter::loggingResult(-1, null, null, null);
- XMLWriter::sendMessage("ERROR", $exceptionMsg);
- XMLWriter::close();
- //throw new AJXP_Exception($exceptionMsg);
- exit();
- */
}
@@ -166,4 +166,9 @@ public function jsonSerializableKey()
{
return $this->parentNode->getPath();
}
+
+ public function getCharset()
+ {
+ return "UTF-8";
+ }
}
@@ -0,0 +1,75 @@
+<?php
+/*
+ * Copyright 2007-2016 Abstrium <contact (at) pydio.com>
+ * This file is part of Pydio.
+ *
+ * Pydio is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Pydio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Pydio. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The latest code can be found at <https://pydio.com/>.
+ */
+
+defined('AJXP_EXEC') or die('Access not allowed');
+
+
+class EmlXmlMessage implements \Pydio\Core\Http\Response\XMLDocSerializableResponseChunk
+{
+
+ protected $charset;
+ protected $html;
+ protected $text;
+
+ /**
+ * EmlXmlMessage constructor.
+ * @param string $charset
+ * @param bool $html
+ * @param bool $text
+ */
+ public function __construct($charset = "UTF-8", $html = false, $text = false)
+ {
+ $this->charset = $charset;
+ $this->html = $html;
+ $this->text = $text;
+ }
+
+ /**
+ * @return string
+ */
+ public function toXML()
+ {
+ $buffer = "";
+ if (isSet($this->charset)) {
+ header('Content-Type: text/xml; charset='.$this->charset);
+ }
+ $buffer .= '<email_body>';
+ if ($this->html!==false) {
+ $buffer .= '<mimepart type="html"><![CDATA[';
+ $buffer .= $this->html->body;
+ $buffer .= "]]></mimepart>";
+ }
+ if ($this->text!==false) {
+ $buffer .= '<mimepart type="plain"><![CDATA[';
+ $buffer .= $this->text->body;
+ $buffer .= "]]></mimepart>";
+ }
+ $buffer .= "</email_body>";
+ return $buffer;
+
+ }
+
+ public function getCharset()
+ {
+ return $this->charset;
+ }
+
+}
@@ -37,32 +37,32 @@
<actions>
<action name="eml_get_xml_structure">
<processing>
- <serverCallback methodName="switchAction"></serverCallback>
+ <serverCallback methodName="switchAction"/>
</processing>
</action>
<action name="eml_get_bodies">
<processing>
- <serverCallback methodName="switchAction"></serverCallback>
+ <serverCallback methodName="switchAction"/>
</processing>
</action>
<action name="eml_dl_attachment">
<processing>
- <serverCallback methodName="switchAction"></serverCallback>
+ <serverCallback methodName="switchAction"/>
</processing>
</action>
<action name="eml_cp_attachment">
<processing>
- <serverCallback methodName="switchAction"></serverCallback>
+ <serverCallback methodName="switchAction"/>
</processing>
</action>
<action name="ls" dirDefault="true">
<post_processing>
- <serverCallback methodName="lsPostProcess" capture="true"></serverCallback>
+ <serverCallback methodName="lsPostProcess" capture="true"/>
</post_processing>
</action>
</actions>
<hooks>
- <serverCallback hookName="node.info" methodName="extractMimeHeaders"></serverCallback>
+ <serverCallback hookName="node.info" methodName="extractMimeHeaders"/>
</hooks>
</registry_contributions>
<dependencies>
@@ -20,6 +20,7 @@
*/
use Pydio\Access\Core\Model\AJXP_Node;
+use Pydio\Core\Http\Message\UserMessage;
use Pydio\Core\Services\AuthService;
use Pydio\Core\Services\ConfService;
use Pydio\Core\Utils\VarsFilter;
@@ -132,24 +133,38 @@ public function indexationEnds($parentNode){
}
}
- public function applyAction($actionName, $httpVars, $fileVars)
+ public function applyAction(\Psr\Http\Message\ServerRequestInterface $requestInterface, \Psr\Http\Message\ResponseInterface &$responseInterface)
{
+ $actionName = $requestInterface->getAttribute("action");
+ $httpVars = $requestInterface->getParsedBody();
+
$messages = ConfService::getMessages();
$repoId = $this->accessDriver->repository->getId();
+ $x = new \Pydio\Core\Http\Response\SerializableResponseStream();
+ $nodesList = new \Pydio\Access\Core\Model\NodesList();
+ $responseInterface = $responseInterface->withBody($x);
+ $x->addChunk($nodesList);
+
if ($actionName == "search") {
// TMP
if (strpos($httpVars["query"], "keyword:") === 0) {
$parts = explode(":", $httpVars["query"]);
- $this->applyAction("search_by_keyword", array("field" => $parts[1]), array());
- return;
+ $requestInterface = $requestInterface->withAttribute("action", "search_by_keyword")->withParsedBody(["field" => $parts[1]]);
+ $this->applyAction($requestInterface, $responseInterface);
+ return null;
}
try {
$this->loadIndex($repoId, false);
} catch (Exception $ex) {
- $this->applyAction("index", array(), array());
- throw new Exception($messages["index.lucene.7"]);
+ if (ConfService::backgroundActionsSupported() && !ConfService::currentContextIsCommandLine()) {
+ $task = \Pydio\Tasks\TaskService::actionAsTask("index", []);
+ $responseInterface = \Pydio\Tasks\TaskService::getInstance()->enqueueTask($task, $requestInterface, $responseInterface);
+ $x->addChunk(new UserMessage($messages["index.lucene.7"]));
+ }else{
+ $x->addChunk(new UserMessage($messages["index.lucene.12"]));
+ }
}
$textQuery = $httpVars["query"];
@@ -244,7 +259,6 @@ public function applyAction($actionName, $httpVars, $fileVars)
$this->logDebug(__FUNCTION__,"Search finished. ");
$hits = $result->getResults();
- XMLWriter::header();
foreach ($hits as $hit) {
$source = $hit->getSource();
@@ -262,11 +276,9 @@ public function applyAction($actionName, $httpVars, $fileVars)
}
$tmpNode->search_score = sprintf("%0.2f", $hit->getScore());
- XMLWriter::renderAjxpNode($tmpNode);
+ $nodesList->addBranch($tmpNode);
}
- XMLWriter::close();
-
} else if ($actionName == "search_by_keyword") {
$scope = "user";
@@ -330,8 +342,8 @@ public function applyAction($actionName, $httpVars, $fileVars)
$this->logDebug(__FUNCTION__,"Search finished. ");
$hits = $result->getResults();
- XMLWriter::header();
foreach ($hits as $hit) {
+
if ($hit->serialized_metadata!=null) {
$meta = unserialize(base64_decode($hit->serialized_metadata));
$tmpNode = new AJXP_Node(TextEncoder::fromUTF8($hit->node_url), $meta);
@@ -344,9 +356,9 @@ public function applyAction($actionName, $httpVars, $fileVars)
continue;
}
$tmpNode->search_score = sprintf("%0.2f", $hit->score);
- XMLWriter::renderAjxpNode($tmpNode);
+ $nodesList->addBranch($tmpNode);
+
}
- XMLWriter::close();
}
}
@@ -67,15 +67,24 @@ public function initMeta($accessDriver)
}
}
- public function applyActions($actionName, $httpVars, $fileVars)
+ /**
+ * @param \Psr\Http\Message\ServerRequestInterface $requestInterface
+ * @param \Psr\Http\Message\ResponseInterface $responseInterface
+ */
+ public function applyActions(\Psr\Http\Message\ServerRequestInterface $requestInterface, \Psr\Http\Message\ResponseInterface &$responseInterface)
{
+ $actionName = $requestInterface->getAttribute("action");
+ $httpVars = $requestInterface->getParsedBody();
+ $x = new \Pydio\Core\Http\Response\SerializableResponseStream();
+ $responseInterface = $responseInterface->withBody($x);
+
$git = new VersionControl_Git($this->repoBase);
switch ($actionName) {
case "git_history":
+ $nodesList = new \Pydio\Access\Core\Model\NodesList();
$file = Utils::decodeSecureMagic($httpVars["file"]);
$file = ltrim($file, "/");
$res = $this->gitHistory($git, $file);
- XMLWriter::header();
$ic = Utils::mimetype($file, "image", false);
$index = count($res);
$mess = ConfService::getMessages();
@@ -84,10 +93,13 @@ public function applyActions($actionName, $httpVars, $fileVars)
$commit["icon"] = $ic;
$commit["index"] = $index;
$commit["EVENT"] = $mess["meta.git.".$commit["EVENT"]];
+ $commit["text"] = basename($commit["FILE"]);
$index --;
- XMLWriter::renderNode("/".$commit["ID"], basename($commit["FILE"]), true, $commit);
+ $n = new AJXP_Node("/".$commit["ID"], $commit);
+ $n->setLeaf(true);
+ $nodesList->addBranch($n);
}
- XMLWriter::close();
+ $x->addChunk($nodesList);
break;
break;
@@ -109,9 +121,9 @@ public function applyActions($actionName, $httpVars, $fileVars)
$this->executeCommandInStreams($git, $commandLine, $outputStream);
fclose($outputStream);
$this->commitChanges();
- XMLWriter::header();
- XMLWriter::reloadDataNode();
- XMLWriter::close();
+ $diff = new \Pydio\Access\Core\Model\NodesDiff();
+ $diff->update(new AJXP_Node("pydio://".$this->accessDriver->repository->getId().$file));
+ $x->addChunk($diff);
break;
@@ -131,30 +143,36 @@ public function applyActions($actionName, $httpVars, $fileVars)
$command->addArgument($commitId.":".$file);
$commandLine = $command->createCommandString();
- if ($attach == "inline") {
- $fileExt = substr(strrchr(basename($file), '.'), 1);
- if (empty($fileExt)) {
- $fileMime = "application/octet-stream";
- } else {
- $regex = "/^([\w\+\-\.\/]+)\s+(\w+\s)*($fileExt\s)/i";
- $lines = file( AJXP_INSTALL_PATH."/".AJXP_PLUGINS_FOLDER."/editor.browser/resources/other/mime.types");
- foreach ($lines as $line) {
- if(substr($line, 0, 1) == '#')
- continue; // skip comments
- $line = rtrim($line) . " ";
- if(!preg_match($regex, $line, $matches))
- continue; // no match to the extension
- $fileMime = $matches[1];
+ $reader = function() use ($git, $commandLine, $attach, $file, $size){
+ if ($attach == "inline") {
+ $fileExt = substr(strrchr(basename($file), '.'), 1);
+ if (empty($fileExt)) {
+ $fileMime = "application/octet-stream";
+ } else {
+ $regex = "/^([\w\+\-\.\/]+)\s+(\w+\s)*($fileExt\s)/i";
+ $lines = file( AJXP_INSTALL_PATH."/".AJXP_PLUGINS_FOLDER."/editor.browser/resources/other/mime.types");
+ foreach ($lines as $line) {
+ if(substr($line, 0, 1) == '#')
+ continue; // skip comments
+ $line = rtrim($line) . " ";
+ if(!preg_match($regex, $line, $matches))
+ continue; // no match to the extension
+ $fileMime = $matches[1];
+ }
}
+ if(empty($fileMime)) $fileMime = "application/octet-stream";
+ HTMLWriter::generateInlineHeaders(basename($file), $size, $fileMime);
+ } else {
+ HTMLWriter::generateAttachmentsHeader(basename($file), $size, false, false);
}
- if(empty($fileMime)) $fileMime = "application/octet-stream";
- HTMLWriter::generateInlineHeaders(basename($file), $size, $fileMime);
- } else {
- HTMLWriter::generateAttachmentsHeader(basename($file), $size, false, false);
- }
- $outputStream = fopen("php://output", "a");
- $this->executeCommandInStreams($git, $commandLine, $outputStream);
- fclose($outputStream);
+ $outputStream = fopen("php://output", "a");
+ $this->executeCommandInStreams($git, $commandLine, $outputStream);
+ fclose($outputStream);
+ };
+
+ $async = new \Pydio\Core\Http\Response\AsyncResponseStream($reader);
+ $responseInterface = $responseInterface->withBody($async);
+
break;
break;
Oops, something went wrong.

0 comments on commit bbe3ee1

Please sign in to comment.