コード例 #1
0
        protected async Task <HttpResponseMessage> CreateItemPutResponse(HttpRequest request, FileSystemInfoBase info, string localFilePath, bool itemExists)
        {
            // Check that we have a matching conditional If-Match request for existing resources
            if (itemExists)
            {
                // Get current etag
                var currentEtag  = CreateEntityTag(info);
                var typedHeaders = request.GetTypedHeaders();
                // Existing resources require an etag to be updated.
                if (typedHeaders.IfMatch == null)
                {
                    var missingIfMatchResponse = CreateResponse(HttpStatusCode.PreconditionFailed, "missing If-Match");
                    return(missingIfMatchResponse);
                }

                bool isMatch = false;
                foreach (var etag in typedHeaders.IfMatch)
                {
                    if (currentEtag.Equals(etag) || etag == Microsoft.Net.Http.Headers.EntityTagHeaderValue.Any)
                    {
                        isMatch = true;
                        break;
                    }
                }

                if (!isMatch)
                {
                    var conflictFileResponse = CreateResponse(HttpStatusCode.PreconditionFailed, "Etag mismatch");
                    conflictFileResponse.Headers.ETag = currentEtag.ToSystemETag();
                    return(conflictFileResponse);
                }
            }

            // Save file
            try
            {
                using (Stream fileStream = GetFileWriteStream(localFilePath, fileExists: itemExists))
                {
                    try
                    {
                        await request.Body.CopyToAsync(fileStream);
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(ex, ex.Message);
                        var conflictResponse = CreateResponse(HttpStatusCode.Conflict, ex);
                        return(conflictResponse);
                    }
                }

                // Return either 204 No Content or 201 Created response
                var successFileResponse = CreateResponse(itemExists ? HttpStatusCode.NoContent : HttpStatusCode.Created);

                // Set updated etag for the file
                info.Refresh();
                successFileResponse.SetEntityTagHeader(CreateEntityTag(info).ToSystemETag(), info.LastWriteTimeUtc);
                return(successFileResponse);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
                var errorResponse = CreateResponse(HttpStatusCode.Conflict, ex);
                return(errorResponse);
            }
        }
コード例 #2
0
ファイル: VfsController.cs プロジェクト: onesmartguy/e13-kudu
        protected override async Task <HttpResponseMessage> CreateItemPutResponse(FileSystemInfoBase info, string localFilePath, bool itemExists)
        {
            // Check that we have a matching conditional If-Match request for existing resources
            if (itemExists)
            {
                // Get current etag
                EntityTagHeaderValue currentEtag = CreateEntityTag(info);

                // Existing resources require an etag to be updated.
                if (Request.Headers.IfMatch == null)
                {
                    HttpResponseMessage missingIfMatchResponse = Request.CreateErrorResponse(
                        HttpStatusCode.PreconditionFailed, Resources.VfsController_MissingIfMatch);
                    return(missingIfMatchResponse);
                }

                bool isMatch = false;
                foreach (EntityTagHeaderValue etag in Request.Headers.IfMatch)
                {
                    if (currentEtag.Equals(etag) || etag == EntityTagHeaderValue.Any)
                    {
                        isMatch = true;
                        break;
                    }
                }

                if (!isMatch)
                {
                    HttpResponseMessage conflictFileResponse = Request.CreateErrorResponse(
                        HttpStatusCode.PreconditionFailed, Resources.VfsController_EtagMismatch);
                    conflictFileResponse.Headers.ETag = currentEtag;
                    return(conflictFileResponse);
                }
            }

            // Save file
            try
            {
                using (Stream fileStream = GetFileWriteStream(localFilePath, fileExists: itemExists))
                {
                    try
                    {
                        await Request.Content.CopyToAsync(fileStream);
                    }
                    catch (Exception ex)
                    {
                        Tracer.TraceError(ex);
                        HttpResponseMessage conflictResponse = Request.CreateErrorResponse(
                            HttpStatusCode.Conflict,
                            RS.Format(Resources.VfsController_WriteConflict, localFilePath, ex.Message),
                            ex);

                        return(conflictResponse);
                    }
                }

                // Return either 204 No Content or 201 Created response
                HttpResponseMessage successFileResponse =
                    Request.CreateResponse(itemExists ? HttpStatusCode.NoContent : HttpStatusCode.Created);

                // Set updated etag for the file
                info.Refresh();
                successFileResponse.Headers.ETag = CreateEntityTag(info);
                return(successFileResponse);
            }
            catch (Exception ex)
            {
                Tracer.TraceError(ex);
                HttpResponseMessage errorResponse =
                    Request.CreateErrorResponse(HttpStatusCode.Conflict,
                                                RS.Format(Resources.VfsController_WriteConflict, localFilePath, ex.Message), ex);

                return(errorResponse);
            }
        }
コード例 #3
0
        protected override async Task <IActionResult> CreateItemPutResponse(FileSystemInfoBase info, string localFilePath, bool itemExists)
        {
            // Check that we have a matching conditional If-Match request for existing resources
            if (itemExists)
            {
                var requestHeaders  = Request.GetTypedHeaders();
                var responseHeaders = Response.GetTypedHeaders();

                // Get current etag
                EntityTagHeaderValue currentEtag = CreateEntityTag(info);

                // Existing resources require an etag to be updated.
                if (requestHeaders.IfMatch == null)
                {
                    return(StatusCode(StatusCodes.Status412PreconditionFailed, Resources.VfsController_MissingIfMatch));
                }

                bool isMatch = false;
                foreach (EntityTagHeaderValue etag in requestHeaders.IfMatch)
                {
                    if (currentEtag.Compare(etag, false) || etag == EntityTagHeaderValue.Any)
                    {
                        isMatch = true;
                        break;
                    }
                }

                if (!isMatch)
                {
                    responseHeaders.ETag = currentEtag;
                    return(StatusCode(StatusCodes.Status412PreconditionFailed, Resources.VfsController_EtagMismatch));
                }
            }

            // Save file
            try
            {
                using (Stream fileStream = GetFileWriteStream(localFilePath, fileExists: itemExists))
                {
                    try
                    {
                        await Request.Body.CopyToAsync(fileStream);
                    }
                    catch (Exception ex)
                    {
                        Tracer.TraceError(ex);
                        return(StatusCode(
                                   StatusCodes.Status409Conflict,
                                   RS.Format(Resources.VfsController_WriteConflict, localFilePath, ex.Message)));
                    }
                }

                // Return either 204 No Content or 201 Created response

                // Set updated etag for the file
                info.Refresh();
                Response.SetEntityTagHeader(CreateEntityTag(info), info.LastWriteTimeUtc);
                return(itemExists ? NoContent() : StatusCode(StatusCodes.Status201Created));
            }
            catch (Exception ex)
            {
                Tracer.TraceError(ex);
                return(StatusCode(StatusCodes.Status409Conflict, RS.Format(Resources.VfsController_WriteConflict, localFilePath, ex.Message)));
            }
        }