/// <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); } }
/// <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); }