/** * Process the request Uri and creates an instance of * RequestDescription from the processed uri. * * @param IService $service Reference to the data service instance. * * @return RequestDescription * * @throws ODataException If any exception occurs while processing the segments * or in case of any version incompatibility. */ public static function process(IService $service) { $host = $service->getHost(); $absoluteRequestUri = $host->getAbsoluteRequestUri(); $absoluteServiceUri = $host->getAbsoluteServiceUri(); $requestUriSegments = array_slice($absoluteRequestUri->getSegments(), $absoluteServiceUri->getSegmentCount()); $segments = SegmentParser::parseRequestUriSegments($requestUriSegments, $service->getProvidersWrapper(), true); $request = new RequestDescription($segments, $absoluteRequestUri, $service->getConfiguration()->getMaxDataServiceVersion(), $host->getRequestVersion(), $host->getRequestMaxVersion()); $kind = $request->getTargetKind(); if ($kind == TargetKind::METADATA() || $kind == TargetKind::BATCH() || $kind == TargetKind::SERVICE_DIRECTORY()) { return $request; } if ($kind == TargetKind::PRIMITIVE_VALUE() || $kind == TargetKind::MEDIA_RESOURCE()) { // http://odata/NW.svc/Orders/$count // http://odata/NW.svc/Orders(123)/Customer/CustomerID/$value // http://odata/NW.svc/Employees(1)/$value // http://odata/NW.svc/Employees(1)/ThumbNail_48X48/$value $request->setContainerName($segments[count($segments) - 2]->getIdentifier()); } else { $request->setContainerName($request->getIdentifier()); } if ($request->getIdentifier() === ODataConstants::URI_COUNT_SEGMENT) { if (!$service->getConfiguration()->getAcceptCountRequests()) { throw ODataException::createBadRequestError(Messages::configurationCountNotAccepted()); } $request->queryType = QueryType::COUNT(); // use of $count requires request DataServiceVersion // and MaxDataServiceVersion greater than or equal to 2.0 $request->raiseResponseVersion(2, 0); $request->raiseMinVersionRequirement(2, 0); } else { if ($request->isNamedStream()) { $request->raiseMinVersionRequirement(3, 0); } else { if ($request->getTargetKind() == TargetKind::RESOURCE()) { if (!$request->isLinkUri()) { $resourceSetWrapper = $request->getTargetResourceSetWrapper(); //assert($resourceSetWrapper != null) $hasNamedStream = $resourceSetWrapper->hasNamedStreams($service->getProvidersWrapper()); $hasBagProperty = $resourceSetWrapper->hasBagProperty($service->getProvidersWrapper()); if ($hasNamedStream || $hasBagProperty) { $request->raiseResponseVersion(3, 0); } } } else { if ($request->getTargetKind() == TargetKind::BAG()) { $request->raiseResponseVersion(3, 0); } } } } return $request; }
/** * Create SegmentDescriptor for the first segment * * @param string $segmentIdentifier The identifier part of the first segment * @param string $keyPredicate The predicate part of the first segment if any else NULL * @param boolean $checkRights Whether to check the rights on this segment * * @return SegmentDescriptor Descriptor for the first segment * * @throws ODataException Exception if any validation fails */ private function _createFirstSegmentDescriptor($segmentIdentifier, $keyPredicate, $checkRights) { $descriptor = new SegmentDescriptor(); $descriptor->setIdentifier($segmentIdentifier); if ($segmentIdentifier === ODataConstants::URI_METADATA_SEGMENT) { $this->_assertion(is_null($keyPredicate)); $descriptor->setTargetKind(TargetKind::METADATA()); return $descriptor; } if ($segmentIdentifier === ODataConstants::URI_BATCH_SEGMENT) { $this->_assertion(is_null($keyPredicate)); $descriptor->setTargetKind(TargetKind::BATCH()); return $descriptor; } if ($segmentIdentifier === ODataConstants::URI_COUNT_SEGMENT) { throw ODataException::createBadRequestError(Messages::segmentParserSegmentNotAllowedOnRoot(ODataConstants::URI_COUNT_SEGMENT)); } if ($segmentIdentifier === ODataConstants::URI_LINK_SEGMENT) { throw ODataException::createBadRequestError(Messages::segmentParserSegmentNotAllowedOnRoot(ODataConstants::URI_LINK_SEGMENT)); } $resourceSetWrapper = $this->providerWrapper->resolveResourceSet($segmentIdentifier); if ($resourceSetWrapper === null) { throw ODataException::createResourceNotFoundError($segmentIdentifier); } $descriptor->setTargetResourceSetWrapper($resourceSetWrapper); $descriptor->setTargetResourceType($resourceSetWrapper->getResourceType()); $descriptor->setTargetSource(TargetSource::ENTITY_SET); $descriptor->setTargetKind(TargetKind::RESOURCE()); if ($keyPredicate !== null) { $keyDescriptor = $this->_createKeyDescriptor($segmentIdentifier . '(' . $keyPredicate . ')', $resourceSetWrapper->getResourceType(), $keyPredicate); $descriptor->setKeyDescriptor($keyDescriptor); if (!$keyDescriptor->isEmpty()) { $descriptor->setSingleResult(true); } } if ($checkRights) { $resourceSetWrapper->checkResourceSetRightsForRead($descriptor->isSingleResult()); } return $descriptor; }
/** * Test with request uri where TargetKind is NONE. TargetKind will be * NONE for service directory, metadata and batch. */ public function testUriProcessorWithRequestUriOfNoneTargetSourceKind() { //Request for service directory $hostInfo = array('AbsoluteRequestUri' => new Url('http://localhost:8083/NorthWindDataService.svc'), 'AbsoluteServiceUri' => new Url('http://localhost:8083/NorthWindDataService.svc'), 'QueryString' => null); $host = new ServiceHostTestFake($hostInfo); $dataService = new NorthWindService2(); $dataService->setHost($host); $uriProcessor = $dataService->handleRequest(); $requestDescription = $uriProcessor->getRequest(); $this->assertEquals($requestDescription->getTargetSource(), TargetSource::NONE); $this->assertEquals($requestDescription->getTargetKind(), TargetKind::SERVICE_DIRECTORY()); //Request for metadata $hostInfo = array('AbsoluteRequestUri' => new Url('http://localhost:8083/NorthWindDataService.svc/$metadata'), 'AbsoluteServiceUri' => new Url('http://localhost:8083/NorthWindDataService.svc'), 'QueryString' => null); $host = new ServiceHostTestFake($hostInfo); $dataService = new NorthWindService2(); $dataService->setHost($host); $uriProcessor = $dataService->handleRequest(); $requestDescription = $uriProcessor->getRequest(); $this->assertEquals($requestDescription->getTargetSource(), TargetSource::NONE); $this->assertEquals($requestDescription->getTargetKind(), TargetKind::METADATA()); //Request for batch $hostInfo = array('AbsoluteRequestUri' => new Url('http://localhost:8083/NorthWindDataService.svc/$batch'), 'AbsoluteServiceUri' => new Url('http://localhost:8083/NorthWindDataService.svc'), 'QueryString' => null); $host = new ServiceHostTestFake($hostInfo); $dataService = new NorthWindService2(); $dataService->setHost($host); $uriProcessor = $dataService->handleRequest(); $requestDescription = $uriProcessor->getRequest(); $this->assertEquals($requestDescription->getTargetSource(), TargetSource::NONE); $this->assertEquals($requestDescription->getTargetKind(), TargetKind::BATCH()); }