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