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