service = new $service($cache); } } catch (ConfigException $e) { // Do nothing. If invalidate service is not specified in the config file. // All the requests to the handler will throw not implemented exception. } } public function handleItem(RequestItem $requestItem) { try { $method = strtolower($requestItem->getMethod()); $method = 'handle' . ucfirst($method); $this->$method($requestItem); } catch (SocialSpiException $e) { $response = new ResponseItem($e->getCode(), $e->getMessage()); } catch (Exception $e) { $response = new ResponseItem(ResponseError::$INTERNAL_ERROR, "Internal error: " . $e->getMessage()); } return $response; } public function handleDelete(RequestItem $request) { throw new SocialSpiException("Http delete not allowed for invalidation service", ResponseError::$BAD_REQUEST); } public function handlePut(RequestItem $request) { throw new SocialSpiException("Http put not allowed for invalidation service", ResponseError::$BAD_REQUEST); } public function handlePost(RequestItem $request) { $this->handleInvalidate($request); } public function handleGet(RequestItem $request) { $this->handleInvalidate($request); } public function handleInvalidate(RequestItem $request) { $this->checkService(); if (!$request->getToken()->getAppId() && !$request->getToken()->getAppUrl()) { throw new SocialSpiException("Can't invalidate content without specifying application", ResponseError::$BAD_REQUEST); } $isBackendInvalidation = AuthenticationMode::$OAUTH_CONSUMER_REQUEST == $request->getToken()->getAuthenticationMode(); $invalidationKeys = $request->getListParameter('invalidationKeys'); $resources = array(); $userIds = array(); if ($request->getToken()->getViewerId()) { $userIds[] = $request->getToken()->getViewerId(); } foreach($invalidationKeys as $key) { if (strpos($key, 'http') !== false) { if (!$isBackendInvalidation) { throw new SocialSpiException('Cannot flush application resources from a gadget. Must use OAuth consumer request'); } $resources[] = $key; } else { if ($key == '@viewer') { continue; } if (!$isBackendInvalidation) { throw new SocialSpiException('Cannot invalidate the content for a user other than the viewer from a gadget.'); } $userIds[] = $key; } } $this->service->invalidateApplicationResources($resources, $request->getToken()); $this->service->invalidateUserResources($userIds, $request->getToken()); } }