Ejemplo n.º 1
0
        /// <summary>
        /// Processes the request.
        /// </summary>
        /// <param name="context">The HttpContext for the incoming HTTP request.</param>
        /// <param name="statusCode">The HTTP Status Code that must be returned to the client.</param>
        /// <returns>The response that must be sent to the client.</returns>
        public override string ProcessRequest(HttpContext context, out HttpStatusCode statusCode)
        {
            if (!AtomPubHelper.ValidatePrecondition(context, base.BaseUri, out statusCode))
            {
                if (HttpStatusCode.PreconditionFailed == statusCode)
                {
                    return(Properties.Resources.ATOMPUB_PRECONDITION_FAILED);
                }
                else
                {
                    return(Properties.Resources.ATOMPUB_RESOURCE_NOT_MODIFIED);
                }
            }

            string errorMessage = string.Empty;
            // used to hold updated member metadata.
            AtomEntryDocument  atomDocument = null;
            AtomPubRequestType requestType  = AtomPubHelper.GetAtomPubRequestType(context, base.BaseUri);

            try
            {
                switch (requestType)
                {
                case AtomPubRequestType.EditMember:
                    atomDocument = UpdateMember(context);
                    break;

                case AtomPubRequestType.EditMedia:
                    atomDocument = UpdateMedia(context);
                    break;

                case AtomPubRequestType.ServiceDocument:
                case AtomPubRequestType.Collection:
                case AtomPubRequestType.CollectionWithPageNo:
                case AtomPubRequestType.Unknwon:
                default:
                    statusCode   = HttpStatusCode.BadRequest;
                    errorMessage = Resources.ATOMPUB_INVALID_URL;
                    break;
                }
            }
            catch (ResourceNotFoundException)
            {
                statusCode = HttpStatusCode.NotFound;
                return(Properties.Resources.ATOMPUB_RESOURCE_NOT_FOUND);
            }

            if (null != atomDocument)
            {
                statusCode = HttpStatusCode.OK;
                string memberId = AtomPubHelper.GetValueOfParameterFromUri(context, base.BaseUri, AtomPubParameterType.Id);
                string eTag     = AtomPubHelper.CalculateETag(memberId);
                context.Response.AddHeader(AtomPubConstants.KeyETag, eTag);
                return(atomDocument.AtomEntry);
            }
            else
            {
                return(errorMessage);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Handles the GET request send to the following uri:
        /// 1. Service Document Uri
        /// 2. Collection Uri
        /// 3. Collection Uri for next / previous page
        /// 4. Member resource Uri
        /// 5. Media Entry resource Uri
        /// The method assumes that the request is already validated using ValidateRequest method.
        /// </summary>
        /// <param name="context">HttpContext containing the request object.</param>
        /// <param name="statusCode">returns the status of the request.</param>
        /// <returns>A string containing the response for the specified AtomPub request.</returns>
        public override string ProcessRequest(HttpContext context, out System.Net.HttpStatusCode statusCode)
        {
            string response = string.Empty;

            AtomPubRequestType requestType = AtomPubHelper.GetAtomPubRequestType(context, base.BaseUri);

            // Get collection name
            string collectionName = AtomPubHelper.GetValueOfParameterFromUri(context, base.BaseUri,
                                                                             AtomPubParameterType.CollectionName);

            statusCode = HttpStatusCode.OK;

            // This assumes that the collection name is verified by ValidateRequest method.
            switch (requestType)
            {
            case AtomPubRequestType.ServiceDocument:
                response = this.GetServiceDocument(context);
                context.Response.ContentType = AtomPubConstants.ServiceDocumentContentType;
                break;

            case AtomPubRequestType.Collection:
                response = this.GetAtomFeed(collectionName);
                break;

            case AtomPubRequestType.CollectionWithPageNo:
                string strPageNo = AtomPubHelper.GetValueOfParameterFromUri(context, base.BaseUri,
                                                                            AtomPubParameterType.PageNo);
                long pageNumber = long.Parse(strPageNo, CultureInfo.InvariantCulture);
                response = this.GetAtomFeed(collectionName, pageNumber);
                context.Response.ContentType = AtomPubConstants.AtomFeedContentType;
                break;

            case AtomPubRequestType.EditMember:
            {
                // Get the requested member type and its id for verifying it existents.
                string memberId = AtomPubHelper.GetValueOfParameterFromUri(context, base.BaseUri,
                                                                           AtomPubParameterType.Id);

                try
                {
                    if (AtomPubHelper.ValidatePrecondition(context, base.BaseUri, out statusCode))
                    {
                        string eTag = AtomPubHelper.CalculateETag(memberId);
                        context.Response.AddHeader(AtomPubConstants.KeyETag, eTag);
                        response = this.GetAtomEntryDocument(collectionName, memberId).AtomEntry;
                        context.Response.ContentType = AtomPubConstants.AtomEntryContentType;
                        statusCode = HttpStatusCode.OK;
                    }
                    else
                    {
                        if (HttpStatusCode.PreconditionFailed == statusCode)
                        {
                            response = Properties.Resources.ATOMPUB_PRECONDITION_FAILED;
                        }
                        else
                        {
                            response = Properties.Resources.ATOMPUB_RESOURCE_NOT_MODIFIED;
                        }
                    }
                }
                catch (ResourceNotFoundException)
                {
                    statusCode = HttpStatusCode.NotFound;
                    response   = Properties.Resources.ATOMPUB_RESOURCE_NOT_FOUND;
                }
            }
            break;

            case AtomPubRequestType.EditMedia:
            {
                // Get the requested member type and its id for verifying it existents.
                string memberId = AtomPubHelper.GetValueOfParameterFromUri(context, base.BaseUri,
                                                                           AtomPubParameterType.Id);
                try
                {
                    if (AtomPubHelper.ValidatePrecondition(context, base.BaseUri, out statusCode))
                    {
                        //context.Response.Clear();
                        string eTag = AtomPubHelper.CalculateETag(memberId);
                        context.Response.AddHeader(AtomPubConstants.KeyETag, eTag);

                        byte[] content = null;

                        // Write the media contents on stream.
                        this.GetMediaResource(collectionName, memberId, out content);
                        context.Response.OutputStream.Write(content, 0, content.Length);

                        string fileExtension = string.Empty;

                        context.Response.ContentType = GetMediaContentType(collectionName, memberId, out fileExtension);

                        string attachedFileName = string.Format(CultureInfo.InvariantCulture, "attachment; filename={0}.{1}", memberId, fileExtension);

                        context.Response.AddHeader("Content-Disposition", attachedFileName);
                        context.Response.AddHeader("Content-Length", content.Length.ToString(CultureInfo.InvariantCulture));
                        statusCode = HttpStatusCode.OK;
                    }
                    else
                    {
                        if (HttpStatusCode.PreconditionFailed == statusCode)
                        {
                            response = Properties.Resources.ATOMPUB_PRECONDITION_FAILED;
                        }
                        else
                        {
                            response = Properties.Resources.ATOMPUB_RESOURCE_NOT_MODIFIED;
                        }
                    }
                }
                catch (ResourceNotFoundException)
                {
                    statusCode = HttpStatusCode.NotFound;
                    response   = Properties.Resources.ATOMPUB_RESOURCE_NOT_FOUND;
                }
            }
            break;

            case AtomPubRequestType.Unknwon:
            default:
                statusCode = HttpStatusCode.BadRequest;
                response   = Properties.Resources.ATOMPUB_BAD_REQUEST;
                break;
            }

            return(response);
        }