protected async Task CreateItemPutResponse()

in src/WebJobs.Script.WebHost/Management/VirtualFileSystem.cs [360:424]


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