public function handleRequest() { $this->createProviders(); $this->getHost()->validateQueryParameters(); $requestMethod = $this->getOperationContext()->incomingRequest()->getMethod(); if ($requestMethod != HTTPRequestMethod::GET()) { throw ODataException::createNotImplementedError(Messages::onlyReadSupport($requestMethod)); } return UriProcessor::process($this); }
public function handleRequest() { $this->createProviders(); $this->getHost()->validateQueryParameters(); return UriProcessor::process($this); }
/** * Gets the response format for the requested resource. * * @param RequestDescription $request The request submitted by client and it's execution result. * @param UriProcessor $uriProcessor The reference to the UriProcessor. * @param IService $service Reference to the service implementation instance * * @return string the response content-type, a null value means the requested resource * is named stream and IDSSP2::getStreamContentType returned null * * @throws ODataException, HttpHeaderFailure */ public static function getResponseContentType(RequestDescription $request, UriProcessor $uriProcessor, IService $service) { // The Accept request-header field specifies media types which are acceptable for the response $host = $service->getHost(); $requestAcceptText = $host->getRequestAccept(); $requestVersion = $request->getResponseVersion(); //if the $format header is present it overrides the accepts header $format = $host->getQueryStringItem(ODataConstants::HTTPQUERY_STRING_FORMAT); if (!is_null($format)) { //There's a strange edge case..if application/json is supplied and it's V3 if ($format == MimeTypes::MIME_APPLICATION_JSON && $requestVersion == Version::v3()) { //then it's actual minimalmetadata //TODO: should this be done with the header text too? $format = MimeTypes::MIME_APPLICATION_JSON_MINIMAL_META; } $requestAcceptText = ServiceHost::translateFormatToMime($requestVersion, $format); } //The response format can be dictated by the target resource kind. IE a $value will be different then expected //getTargetKind doesn't deal with link resources directly and this can change things $targetKind = $request->isLinkUri() ? TargetKind::LINK() : $request->getTargetKind(); switch ($targetKind) { case TargetKind::METADATA(): return HttpProcessUtility::selectMimeType($requestAcceptText, array(MimeTypes::MIME_APPLICATION_XML)); case TargetKind::SERVICE_DIRECTORY(): return HttpProcessUtility::selectMimeType($requestAcceptText, array(MimeTypes::MIME_APPLICATION_XML, MimeTypes::MIME_APPLICATION_ATOMSERVICE, MimeTypes::MIME_APPLICATION_JSON, MimeTypes::MIME_APPLICATION_JSON_FULL_META, MimeTypes::MIME_APPLICATION_JSON_NO_META, MimeTypes::MIME_APPLICATION_JSON_MINIMAL_META, MimeTypes::MIME_APPLICATION_JSON_VERBOSE)); case TargetKind::PRIMITIVE_VALUE(): $supportedResponseMimeTypes = array(MimeTypes::MIME_TEXTPLAIN); if ($request->getIdentifier() != '$count') { $projectedProperty = $request->getProjectedProperty(); self::assert(!is_null($projectedProperty), '!is_null($projectedProperty)'); $type = $projectedProperty->getInstanceType(); self::assert(!is_null($type) && $type instanceof IType, '!is_null($type) && $type instanceof IType'); if ($type instanceof Binary) { $supportedResponseMimeTypes = array(MimeTypes::MIME_APPLICATION_OCTETSTREAM); } } return HttpProcessUtility::selectMimeType($requestAcceptText, $supportedResponseMimeTypes); case TargetKind::PRIMITIVE(): case TargetKind::COMPLEX_OBJECT(): case TargetKind::BAG(): case TargetKind::LINK(): return HttpProcessUtility::selectMimeType($requestAcceptText, array(MimeTypes::MIME_APPLICATION_XML, MimeTypes::MIME_TEXTXML, MimeTypes::MIME_APPLICATION_JSON, MimeTypes::MIME_APPLICATION_JSON_FULL_META, MimeTypes::MIME_APPLICATION_JSON_NO_META, MimeTypes::MIME_APPLICATION_JSON_MINIMAL_META, MimeTypes::MIME_APPLICATION_JSON_VERBOSE)); case TargetKind::RESOURCE(): return HttpProcessUtility::selectMimeType($requestAcceptText, array(MimeTypes::MIME_APPLICATION_ATOM, MimeTypes::MIME_APPLICATION_JSON, MimeTypes::MIME_APPLICATION_JSON_FULL_META, MimeTypes::MIME_APPLICATION_JSON_NO_META, MimeTypes::MIME_APPLICATION_JSON_MINIMAL_META, MimeTypes::MIME_APPLICATION_JSON_VERBOSE)); case TargetKind::MEDIA_RESOURCE(): if (!$request->isNamedStream() && !$request->getTargetResourceType()->isMediaLinkEntry()) { throw ODataException::createBadRequestError(Messages::badRequestInvalidUriForMediaResource($host->getAbsoluteRequestUri()->getUrlAsString())); } $uriProcessor->execute(); $request->setExecuted(); // DSSW::getStreamContentType can throw error in 2 cases // 1. If the required stream implementation not found // 2. If IDSSP::getStreamContentType returns NULL for MLE $responseContentType = $service->getStreamProviderWrapper()->getStreamContentType($request->getTargetResult(), $request->getResourceStreamInfo()); // Note StreamWrapper::getStreamContentType can return NULL if the requested named stream has not // yet been uploaded. But for an MLE if IDSSP::getStreamContentType returns NULL then StreamWrapper will throw error if (!is_null($responseContentType)) { $responseContentType = HttpProcessUtility::selectMimeType($requestAcceptText, array($responseContentType)); } return $responseContentType; } //If we got here, we just don't know what it is... throw new ODataException(Messages::unsupportedMediaType(), 415); }
public function testProcessRequestForCollectionWithInlineCountProviderHandlesPaging() { $requestURI = new Url('http://host.com/data.svc/Collection/?$inlinecount=allpages'); Phockito::when($this->mockServiceHost->getAbsoluteRequestUri())->return($requestURI); //mock inline count as all pages Phockito::when($this->mockServiceHost->getQueryStringItem(ODataConstants::HTTPQUERY_STRING_INLINECOUNT))->return("allpages"); $this->fakeServiceConfig->setAcceptCountRequests(true); $this->fakeServiceConfig->setMaxDataServiceVersion(ProtocolVersion::V2()); $uriProcessor = UriProcessor::process($this->mockService); $fakeQueryResult = new QueryResult(); $fakeQueryResult->results = array(1, 2, 3); $fakeQueryResult->count = 10; Phockito::when($this->mockProvidersWrapper->getResourceSet(QueryType::ENTITIES_WITH_COUNT(), $this->mockCollectionResourceSetWrapper, null, null, null, null))->return($fakeQueryResult); //indicate that the Provider performs the paging (thus it will use the count in the QueryResult) Phockito::when($this->mockProvidersWrapper->handlesOrderedPaging())->return(true); $uriProcessor->execute(); $request = $uriProcessor->getRequest(); $actual = $request->getTargetResult(); $this->assertEquals(array(1, 2, 3), $actual); $this->assertEquals(10, $request->getCountValue()); }