Пример #1
0
        internal static Deserializer CreateDeserializer(System.Data.Services.RequestDescription description, IDataService dataService, bool update, UpdateTracker tracker)
        {
            string   str;
            Encoding encoding;

            HttpProcessUtility.ReadContentType(dataService.OperationContext.Host.RequestContentType, out str, out encoding);
            if (DataServiceActionProviderWrapper.IsServiceActionRequest(description))
            {
                return(new ParameterDeserializer(update, dataService, tracker, description));
            }
            if ((description.TargetKind == RequestTargetKind.OpenPropertyValue) || (description.TargetKind == RequestTargetKind.PrimitiveValue))
            {
                return(new RawValueDeserializer(update, dataService, tracker, description));
            }
            if (description.TargetKind == RequestTargetKind.MediaResource)
            {
                return(new MediaResourceDeserializer(update, dataService, tracker, description));
            }
            if (((description.TargetKind == RequestTargetKind.Primitive) || (description.TargetKind == RequestTargetKind.ComplexObject)) || ((description.TargetKind == RequestTargetKind.Collection) || (description.TargetKind == RequestTargetKind.OpenProperty)))
            {
                return(new PropertyDeserializer(update, dataService, tracker, description));
            }
            if (description.LinkUri)
            {
                return(new EntityReferenceLinkDeserializer(update, dataService, tracker, description));
            }
            if (description.TargetKind != RequestTargetKind.Resource)
            {
                throw new DataServiceException(0x19f, System.Data.Services.Strings.RequestUriProcessor_MethodNotAllowed);
            }
            return(new EntityDeserializer(update, dataService, tracker, description));
        }
Пример #2
0
        internal object HandlePutRequest()
        {
            object             requestValue    = null;
            object             entityResource  = null;
            ResourceSetWrapper entityContainer = null;
            string             str;
            Encoding           encoding;

            HttpProcessUtility.ReadContentType(this.Service.OperationContext.Host.RequestContentType, out str, out encoding);
            System.Data.Services.RequestDescription requestDescription = this.RequestDescription;
            if (((requestDescription.TargetKind == RequestTargetKind.MediaResource) || (requestDescription.TargetKind == RequestTargetKind.OpenPropertyValue)) || (requestDescription.TargetKind == RequestTargetKind.PrimitiveValue))
            {
                requestValue = this.Deserialize(requestDescription.LastSegmentInfo);
            }
            else if (requestDescription.LinkUri)
            {
                Uri    referencedUri        = (Uri)this.Deserialize(null);
                object targetResourceToBind = this.GetTargetResourceToBind(referencedUri, true);
                entityResource  = HandleBindOperation(requestDescription, targetResourceToBind, this.Service, this.Tracker);
                entityContainer = requestDescription.LastSegmentInfo.TargetContainer;
            }
            else
            {
                requestValue = this.ReadEntity();
                if (((requestValue == null) && requestDescription.LastSegmentInfo.HasKeyValues) && (requestDescription.TargetSource == RequestTargetSource.EntitySet))
                {
                    throw DataServiceException.CreateBadRequestError(System.Data.Services.Strings.BadRequest_CannotSetTopLevelResourceToNull(requestDescription.ResultUri.AbsoluteUri));
                }
            }
            if (!requestDescription.LinkUri && IsQueryRequired(requestDescription, requestValue))
            {
                object resourceToBeModified = GetResourceToModify(requestDescription, this.Service, false, out entityResource, out entityContainer, true);
                this.Tracker.TrackAction(entityResource, entityContainer, UpdateOperations.Change);
                ModifyResource(requestDescription, resourceToBeModified, requestValue, this.Service);
            }
            return(entityResource ?? requestValue);
        }
Пример #3
0
        internal static bool GetBoundaryAndEncodingFromMultipartMixedContentType(string contentType, out string boundary, out Encoding encoding)
        {
            boundary = null;
            encoding = null;

            string mime;

            KeyValuePair <string, string>[] parameters = HttpProcessUtility.ReadContentType(contentType, out mime, out encoding);

            if (String.Equals(XmlConstants.MimeMultiPartMixed, mime, StringComparison.OrdinalIgnoreCase))
            {
                if (null != parameters)
                {
                    foreach (KeyValuePair <string, string> parameter in parameters)
                    {
                        if (String.Equals(parameter.Key, XmlConstants.HttpMultipartBoundary, StringComparison.OrdinalIgnoreCase))
                        {
                            if (boundary != null)
                            {
                                boundary = null;
                                break;
                            }

                            boundary = parameter.Value;
                        }
                    }
                }

                if (String.IsNullOrEmpty(boundary))
                {
                    throw Error.BatchStreamMissingBoundary();
                }
            }

            return(null != boundary);
        }
Пример #4
0
        /// <summary>
        /// Read the link media type and validate for non open property types
        /// </summary>
        /// <param name="mediaType">media type as specified on the link element.</param>
        /// <param name="property">property which the link represents.</param>
        /// <returns>returns the type parameters specified in the media link.</returns>
        private static string ValidateTypeParameterForNonOpenTypeProperties(string mediaType, ResourceProperty property)
        {
            string typeParameterValue = null;

            if (!String.IsNullOrEmpty(mediaType))
            {
                string   mime;
                Encoding encoding;
                KeyValuePair <string, string>[] contentTypeParameters = HttpProcessUtility.ReadContentType(mediaType, out mime, out encoding);
                if (mime != XmlConstants.MimeApplicationAtom)
                {
                    throw DataServiceException.CreateBadRequestError(Strings.BadRequest_MimeTypeMustBeApplicationAtom(mime, XmlConstants.MimeApplicationAtom));
                }

                // If the type parameter is specified, make sure its correct. We do the validation for known properties here
                // and for open-properties, the validation is done if the link is expanded. Otherwise, there is no good way of
                // doing the validation.
                typeParameterValue = HttpProcessUtility.GetParameterValue(contentTypeParameters, XmlConstants.AtomTypeAttributeName);
                if (!String.IsNullOrEmpty(typeParameterValue) && property != null)
                {
                    if (property.Kind == ResourcePropertyKind.ResourceReference)
                    {
                        if (typeParameterValue != XmlConstants.AtomEntryElementName)
                        {
                            throw DataServiceException.CreateBadRequestError(Strings.BadRequest_InvalidTypeParameterSpecifiedInMimeType(typeParameterValue, XmlConstants.AtomEntryElementName));
                        }
                    }
                    else if (typeParameterValue != XmlConstants.AtomFeedElementName)
                    {
                        throw DataServiceException.CreateBadRequestError(Strings.BadRequest_InvalidTypeParameterSpecifiedInMimeType(typeParameterValue, XmlConstants.AtomFeedElementName));
                    }
                }
            }

            return(typeParameterValue);
        }