/** * 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); }
/** * 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); }
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; }
/** * 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); } }