/**
  * Tests MessagesHandler->handlePut()
  */
 public function testHandlePut()
 {
     $token = BasicSecurityToken::createFromValues('john.doe', 'john.doe', 'app', 'domain', 'appUrl', '1');
     //Create message
     $request = array();
     $request['url'] = '/messages/@viewer/outbox/1';
     $request['postData'] = 'message 1';
     $requestItem = new RestRequestItem();
     $requestItem->createRequestItemWithRequest($request, $token);
     $response = $this->MessagesHandler->handlePut($requestItem);
     $this->assertEquals(NOT_IMPLEMENTED, $response->getError());
     $this->assertEquals("Not implemented", $response->getErrorMessage());
 }
 /**
  * /people/{userId}/{groupId}/{appId}
  * - fields={field1, field2}
  *
  * examples:
  * /appdata/john.doe/@friends/app?fields=count
  * /appdata/john.doe/@self/app
  *
  * The post data should be a regular json object. All of the fields vars will
  * be pulled from the values and set on the person object. If there are no
  * fields vars then all of the data will be overridden.
  */
 public function handlePost(RestRequestItem $requestItem)
 {
     $requestItem->parseUrlWithTemplate(self::$APP_DATA_PATH);
     // if no ?fields=foo,bar was specified, we try to guess them from the post data
     $postFields = array();
     if ($requestItem->getPostData() != null) {
         $data = $requestItem->getPostData();
         foreach ($data as $key => $val) {
             $postFields[] = $key;
         }
     }
     return $this->service->updatePersonData($requestItem->getUser(), $requestItem->getGroup(), $requestItem->getFieldsWithDefaultValue($postFields), $requestItem->getPostData(), $requestItem->getAppId(), $requestItem->getToken());
 }
 /**
  *
  * @param ResponseItem $responseItem
  * @param RestRequestItem $requestItem
  */
 function outputResponse(ResponseItem $responseItem, RestRequestItem $requestItem)
 {
     $response = $responseItem->getResponse();
     if ($response instanceof RestfulCollection) {
         $itemsPerPage = $requestItem->getCount();
         if ($itemsPerPage > 0) {
             $response->itemsPerPage = $itemsPerPage;
         }
     }
     // several service calls return a null value
     if (!is_null($response)) {
         $this->encodeAndSendResponse($response);
     }
 }
 /**
  * Tests OutputJsonConverter->outputResponse()
  */
 public function testOutputResponse()
 {
     $inputConverter = new InputJsonConverter();
     $outputConverter = new OutputJsonConverter();
     $servletRequest = array('url' => '/people/1/@self');
     $token = BasicSecurityToken::createFromValues('owner', 'viewer', 'app', 'domain', 'appUrl', '1', 'default');
     $requestItem = RestRequestItem::createWithRequest($servletRequest, $token, $inputConverter, $outputConverter);
     $requestItem->applyUrlTemplate("/people/{userId}/{groupId}/{personId}");
     $response = array('entry' => array('isOwner' => false, 'isViewer' => false, 'displayName' => '1 1', 'id' => '1'));
     $responseItem = new ResponseItem(null, null, $response);
     ob_start();
     $outputConverter->outputResponse($responseItem, $requestItem);
     $output = ob_get_clean();
     $expected = '{
     "entry": {
       "isOwner": false,
       "isViewer": false,
       "displayName": "1 1",
       "id": "1"
     }
 }';
     $outputJson = json_decode($output);
     $expectedJson = json_decode($expected);
     $this->assertEquals($expectedJson, $outputJson);
 }
Example #5
0
    /**
     * Tests OutputXmlConverter->outputResponse()
     */
    public function testOutputResponse()
    {
        $inputConverter = new InputXmlConverter();
        $outputConverter = new OutputXmlConverter();
        $servletRequest = array('url' => '/people/1/@self');
        $token = BasicSecurityToken::createFromValues('owner', 'viewer', 'app', 'domain', 'appUrl', '1', 'default');
        $requestItem = RestRequestItem::createWithRequest($servletRequest, $token, $inputConverter, $outputConverter);
        $requestItem->applyUrlTemplate("/people/{userId}/{groupId}/{personId}");
        $entry = array('isOwner' => false, 'isViewer' => false, 'displayName' => '1 1', 'id' => '1');
        $response = array('entry' => $entry);
        $responseItem = new ResponseItem(null, null, $response);
        ob_start();
        $outputConverter->outputResponse($responseItem, $requestItem);
        $output = ob_get_clean();
        $expected = '<?xml version="1.0" encoding="UTF-8"?>
<response>
  <entry>
    <isOwner></isOwner>
    <isViewer></isViewer>
    <displayName>1 1</displayName>
    <id>1</id>
  </entry>
</response>
';
        $outputXml = simplexml_load_string($output);
        $expectedXml = simplexml_load_string($expected);
        $this->assertEquals($expectedXml, $outputXml);
    }
 /**
  * Tests PeopleHandler->handleGet()
  */
 public function testHandleGet()
 {
     $request = array();
     $request['url'] = '/people/@viewer/@self';
     $request['method'] = 'GET';
     $token = BasicSecurityToken::createFromValues('john.doe', 'john.doe', 'app', 'domain', 'appUrl', '1');
     $requestItem = new RestRequestItem();
     $requestItem->createRequestItemWithRequest($request, $token);
     $response = $this->PeopleHandler->handleGet($requestItem);
     $person = $response->getResponse();
     $this->assertEquals('john.doe', $person['id']);
     $this->assertEquals('MALE', $person['gender']['key']);
     $this->assertEquals('Male', $person['gender']['displayValue']);
     $this->assertEquals('Doe', $person['name']['familyName']);
     $this->assertEquals('John', $person['name']['givenName']);
     $this->assertEquals('John Doe', $person['name']['unstructured']);
 }
 /**
  * @param $servletRequest
  * @param SecurityToken $token
  * @param string $inputConverterMethod
  * @param OutputConverter $outputConverter
  * @return RestRequestItem
  */
 public static function createWithRequest($servletRequest, $token, $inputConverterMethod, $outputConverter)
 {
     $restfulRequestItem = new RestRequestItem(self::getServiceFromPath($servletRequest['url']), self::getMethod(), $token, $inputConverterMethod, $outputConverter);
     $restfulRequestItem->setUrl($servletRequest['url']);
     if (isset($servletRequest['params'])) {
         $restfulRequestItem->setParams($servletRequest['params']);
     } else {
         $paramPieces = parse_url($restfulRequestItem->url);
         if (isset($paramPieces['query'])) {
             $params = array();
             parse_str($paramPieces['query'], $params);
             $restfulRequestItem->setParams($params);
         }
     }
     if (isset($servletRequest['postData'])) {
         $restfulRequestItem->setPostData($servletRequest['postData']);
     }
     return $restfulRequestItem;
 }
 function outputResponse(ResponseItem $responseItem, RestRequestItem $requestItem)
 {
     $response = $responseItem->getResponse();
     if ($response instanceof RestfulCollection) {
         $itemsPerPage = $requestItem->getCount();
         if ($itemsPerPage > 0) {
             $response->itemsPerPage = $itemsPerPage;
         }
     }
     // several service calls return a null value
     if (!is_null($response)) {
         if (Config::get('debug')) {
             echo self::json_format(json_encode($response));
             // TODO: add a query option to pretty-print json output
         } else {
             echo json_encode($response);
         }
     }
 }
 public function handleMethod(RestRequestItem $requestItem)
 {
     $token = $requestItem->getToken();
     $method = $requestItem->getMethod();
     if ($token->isAnonymous() && $method != 'GET') {
         // Anonymous requests are only allowed to GET data (not create/edit/delete)
         $response = new ResponseItem(BAD_REQUEST, "[{$method}] not allowed for anonymous users", null);
     } elseif ($method == 'GET') {
         $response = $this->handleGet($requestItem);
     } elseif ($method == 'POST') {
         $response = $this->handlePost($requestItem);
     } elseif ($method == 'DELETE') {
         $response = $this->handleDelete($requestItem);
     } elseif ($method == 'PUT') {
         $response = $this->handlePut($requestItem);
     } else {
         $response = new ResponseItem(BAD_REQUEST, "Unserviced Http method type", null);
     }
     return $response;
 }
 /**
  * Tests RestRequestItem->createWithRequest()
  */
 public function testCreateWithRequest()
 {
     $expectedParams = array('oauth_nonce' => '10075052d8a3cd0087d11346edba8f1f', 'oauth_timestamp' => '1242011332', 'oauth_consumer_key' => 'consumerKey', 'fields' => 'gender,name', 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_signature' => 'wDcyXTBqhxW70G+ddZtw7zPVGyE=');
     $urlencodedParams = array();
     foreach ($expectedParams as $key => $value) {
         $urlencodedParams[] = $key . '=' . urlencode($value);
     }
     $url = '/people/1/@self?' . join('&', $urlencodedParams);
     $outputConverter = new OutputJsonConverter();
     $servletRequest = array('url' => $url);
     $token = BasicSecurityToken::createFromValues('owner', 'viewer', 'app', 'domain', 'appUrl', '1', 'default');
     $requestItem = RestRequestItem::createWithRequest($servletRequest, $token, 'convertJson', $outputConverter);
     $params = $requestItem->getParameters();
     $this->assertEquals($expectedParams, $params);
 }
Example #11
0
 public static function createWithRequest($servletRequest, $token, $inputConverter, $outputConverter)
 {
     $restfulRequestItem = new RestRequestItem(self::getServiceFromPath($servletRequest['url']), self::getMethod(), $token, $inputConverter, $outputConverter);
     $restfulRequestItem->setUrl($servletRequest['url']);
     $restfulRequestItem->setParams($restfulRequestItem->createParameterMap());
     if (isset($servletRequest['postData'])) {
         $restfulRequestItem->setPostData($servletRequest['postData']);
     }
     return $restfulRequestItem;
 }
Example #12
0
    /**
     * Tests OutputAtomConverter->outputResponse()
     */
    public function testOutputResponse()
    {
        $inputConverter = new InputAtomConverter();
        $outputConverter = new OutputAtomConverter();
        $servletRequest = array('url' => '/people/1/@self');
        $token = BasicSecurityToken::createFromValues('owner', 'viewer', 'app', 'domain', 'appUrl', '1', 'default');
        $requestItem = RestRequestItem::createWithRequest($servletRequest, $token, $inputConverter, $outputConverter);
        $requestItem->applyUrlTemplate("/people/{userId}/{groupId}/{personId}");
        $entry = array('isOwner' => false, 'isViewer' => false, 'displayName' => '1 1', 'id' => '1');
        $response = array('entry' => $entry);
        $responseItem = new ResponseItem(null, null, $response);
        ob_start();
        $outputConverter->outputResponse($responseItem, $requestItem);
        $output = ob_get_clean();
        $expected = '<entry xmlns="http://www.w3.org/2005/Atom">
  <title>person entry for shindig:1</title>
  <author>
    <uri>urn:guid:1</uri>
    <name>shindig:1</name>
  </author>
  <id>urn:guid:1</id>
  <updated>2008-12-11T19:58:31+01:00</updated>
  <content type="application/xml">
    <entry xmlns="http://ns.opensocial.org/2008/opensocial">
      <isOwner></isOwner>
      <isViewer></isViewer>
      <displayName>1 1</displayName>
      <id>1</id>
    </entry>
  </content>
</entry>
';
        $outputXml = simplexml_load_string($output);
        $expectedXml = simplexml_load_string($expected);
        $expectedXml->updated = $outputXml->updated;
        // Prefix may be 'shindig' or something else.
        $expectedXml->title = $outputXml->title;
        $expectedXml->author->name = $outputXml->author->name;
        $this->assertEquals($expectedXml, $outputXml);
    }
    /**
     * Tests OutputXmlConverter->outputResponse()
     */
    public function testOutputResponse()
    {
        $inputConverter = new InputXmlConverter();
        $outputConverter = new OutputXmlConverter();
        $servletRequest = array('url' => '/people/1/@self');
        $requestItem = RestRequestItem::createWithRequest($servletRequest, null, $inputConverter, $outputConverter);
        $requestItem->applyUrlTemplate("/people/{userId}/{groupId}/{personId}");
        $response = array('entry' => array('isOwner' => false, 'isViewer' => false, 'displayName' => '1 1', 'id' => '1'));
        $responseItem = new ResponseItem(null, null, $response);
        ob_start();
        $outputConverter->outputResponse($responseItem, $requestItem);
        $output = ob_get_clean();
        $expected = '<?xml version="1.0" encoding="UTF-8"?>
<response>
  <entry>
    <isOwner></isOwner>
    <isViewer></isViewer>
    <displayName>1 1</displayName>
    <id>1</id>
  </entry>
</response>
';
        $this->assertEquals($expected, $output);
    }
 /**
  * Tests ActivitiesHandler->handlePut()
  */
 public function testHandlePut()
 {
     $token = BasicSecurityToken::createFromValues('john.doe', 'john.doe', 'app', 'domain', 'appUrl', '1');
     //Create data
     $request = array();
     $request['url'] = '/appdata/@viewer/@self/@app?fields=count';
     $request['method'] = 'POST';
     $request['postData'] = array();
     $request['postData']['count'] = 'TestHandlePut';
     $requestItem = new RestRequestItem();
     $requestItem->createRequestItemWithRequest($request, $token);
     $this->AppDataHandler->handlePut($requestItem);
     //Validate generated data
     $request = array();
     $request['url'] = '/appdata/@viewer/@self/@app?networkDistance=&fields=count';
     $request['method'] = 'GET';
     $requestItem = new RestRequestItem();
     $requestItem->createRequestItemWithRequest($request, $token);
     $response = $this->AppDataHandler->handleGet($requestItem);
     $response = $response->getResponse();
     $entry = $response->getEntry();
     $this->assertEquals('TestHandlePut', $entry['john.doe']['count']);
 }
 /**
  * Handler for non-batch requests (REST only has non-batch requests)
  */
 private function handleSingleRequest(SecurityToken $token, $inputConverter, $outputConverter)
 {
     //uri example: /social/rest/people/@self   /gadgets/api/rest/cache/invalidate
     $servletRequest = array('url' => substr($_SERVER["REQUEST_URI"], strpos($_SERVER["REQUEST_URI"], '/rest') + 5));
     // Php version 5.2.9(linux) doesn't set HTTP_RAW_POST_DATA properly.
     if (!isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
         $tmp = file_get_contents('php://input');
         if (!empty($tmp)) {
             $GLOBALS['HTTP_RAW_POST_DATA'] = $tmp;
         }
     }
     if (isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
         $servletRequest['postData'] = $GLOBALS['HTTP_RAW_POST_DATA'];
         if (get_magic_quotes_gpc()) {
             $servletRequest['postData'] = stripslashes($servletRequest['postData']);
         }
     }
     $servletRequest['params'] = array_merge($_GET, $_POST);
     $requestItem = RestRequestItem::createWithRequest($servletRequest, $token, $inputConverter, $outputConverter);
     $responseItem = $this->getResponseItem($this->handleRequestItem($requestItem));
     if ($responseItem->getError() == null) {
         $response = $responseItem->getResponse();
         if (!$response instanceof DataCollection && !$response instanceof RestfulCollection && count($response)) {
             $response = array("entry" => $response);
             $responseItem->setResponse($response);
         }
         $outputConverter->outputResponse($responseItem, $requestItem);
     } else {
         $this->sendError($responseItem);
     }
 }
 private function getResponseItem(RestRequestItem $requestItem)
 {
     $path = $this->getRouteFromParameter($requestItem->getUrl());
     $class = false;
     switch ($path) {
         case 'people':
             $class = 'PeopleHandler';
             break;
         case 'activities':
             $class = 'ActivitiesHandler';
             break;
         case 'appdata':
             $class = 'AppDataHandler';
             break;
         case 'messages':
             $class = 'MessagesHandler';
             break;
             //TODO add 'groups' and 'messages' here
         //TODO add 'groups' and 'messages' here
         default:
             $response = new ResponseItem(NOT_IMPLEMENTED, "{$path} is not implemented");
             break;
     }
     if ($class && class_exists($class, true)) {
         $class = new $class(null);
         $response = $class->handleMethod($requestItem);
     }
     if ($response->getError() != null && !$this->isJsonBatchUrl() && !$this->isBatchProxyUrl()) {
         // Can't use http error codes in batch mode, instead we return the error code in the response item
         $this->outputError($response);
     }
     return $response;
 }
 /**
  * /activities/{userId}/@self
  *
  * examples:
  * /activities/@viewer/@self/@app
  * /activities/john.doe/@self
  * - postBody is an activity object
  */
 public function handlePost(RestRequestItem $requestItem)
 {
     $requestItem->parseUrlWithTemplate(self::$ACTIVITY_ID_PATH);
     return $this->service->createActivity($requestItem->getUser(), $requestItem->getPostData(), $requestItem->getToken());
 }
 /**
  * /people/{userId}/{groupId}/{optionalPersonId}
  *
  * examples:
  * /people/john.doe/@all
  * /people/john.doe/@friends
  * /people/john.doe/@self
  */
 public function handleGet(RestRequestItem $requestItem)
 {
     $requestItem->parseUrlWithTemplate(self::$PEOPLE_PATH);
     $parameters = $requestItem->getParameters();
     $optionalPersonId = in_array('personId', $parameters) ? $parameters['personId'] : null;
     $fields = $requestItem->getFieldsWithDefaultValue(self::$DEFAULT_PERSON_FIELDS);
     if ($optionalPersonId || is_object($requestItem->getGroup()) && $requestItem->getGroup()->getType() == 'self') {
         //FIXME same logic as the java code here, but doesn't seem to do much with the optionalPersonId which seems odd
         return $this->service->getPerson($requestItem->getUser(), $requestItem->getGroup(), $fields, $requestItem->getToken());
     }
     return $this->service->getPeople($requestItem->getUser(), $requestItem->getGroup(), $requestItem->getOrderBy(), $requestItem->getFilterBy(), $requestItem->getStartIndex(), $requestItem->getCount(), $fields, $requestItem->getNetworkDistance(), $requestItem->getToken());
 }
 /**
  * /messages/{groupId}/outbox/{msgId}
  *
  * @param RestRequestItem $requestItem
  * @return responseItem
  */
 public function handlePut(RestRequestItem $requestItem)
 {
     $requestItem->parseUrlWithTemplate(self::$MESSAGES_PATH);
     return $this->service->createMessage($requestItem->getUser(), $requestItem->getPostData(), $requestItem->getToken());
 }
 /**
  * Tests ActivitiesHandler->handlePut()
  */
 public function testHandlePut()
 {
     return;
     $token = BasicSecurityToken::createFromValues('john.doe', 'john.doe', 'app', 'domain', 'appUrl', '1');
     //Create activity
     $request = array();
     $request['url'] = '/activities/@viewer/@self/@app?networkDistance=';
     $request['method'] = 'POST';
     $request['postData'] = array();
     $request['postData']['id'] = '3';
     $request['postData']['appId'] = '1';
     $request['postData']['userId'] = 'john.doe';
     $request['postData']['title'] = 'TestPost 3';
     $request['postData']['body'] = 'TestBody 3';
     $requestItem = new RestRequestItem();
     $requestItem->createRequestItemWithRequest($request, $token);
     $this->ActivitiesHandler->handlePut($requestItem);
     //Validate generated activity
     $request = array();
     $request['url'] = '/activities/@viewer/@self/@app';
     $request['method'] = 'GET';
     $requestItem = new RestRequestItem();
     $requestItem->createRequestItemWithRequest($request, $token);
     $response = $this->ActivitiesHandler->handleGet($requestItem);
     $response = $response->getResponse();
     $entry = $response->getEntry();
     $this->assertEquals('2', $response->getTotalResults());
     //First Entry
     $this->assertEquals('1', $entry[0]['id']);
     $this->assertEquals('john.doe', $entry[0]['userId']);
     $this->assertEquals('yellow', $entry[0]['title']);
     $this->assertEquals('what a color!', $entry[0]['body']);
     //Second Entry
     $this->assertEquals('3', $entry[1]['id']);
     $this->assertEquals('john.doe', $entry[1]['userId']);
     $this->assertEquals('TestPost 3', $entry[1]['title']);
     $this->assertEquals('TestBody 3', $entry[1]['body']);
 }
 /**
  * Tests RestRequestItem->getNetworkDistance()
  */
 public function testGetNetworkDistance()
 {
     $this->assertEquals('1', $this->RestRequestItem->getNetworkDistance());
 }
 /**
  * Handler for non-batch requests (REST only has non-batch requests)
  */
 private function handleSingleRequest(SecurityToken $token, $inputConverter, $outputConverter)
 {
     $servletRequest = array('url' => substr($_SERVER["REQUEST_URI"], strlen(Config::get('web_prefix') . '/social/rest')));
     if (isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
         $servletRequest['postData'] = $GLOBALS['HTTP_RAW_POST_DATA'];
         if (get_magic_quotes_gpc()) {
             $servletRequest['postData'] = stripslashes($servletRequest['postData']);
         }
     }
     $servletRequest['params'] = array_merge($_GET, $_POST);
     $requestItem = RestRequestItem::createWithRequest($servletRequest, $token, $inputConverter, $outputConverter);
     $responseItem = $this->getResponseItem($this->handleRequestItem($requestItem));
     if ($responseItem->getError() == null) {
         $response = $responseItem->getResponse();
         if (!$response instanceof DataCollection && !$response instanceof RestfulCollection && count($response)) {
             $response = array("entry" => $response);
             $responseItem->setResponse($response);
         }
         $outputConverter->outputResponse($responseItem, $requestItem);
     } else {
         $this->sendError($responseItem);
     }
 }