in src/JetBrains.Space.AspNetCore/Experimental/AttachmentProxy/SpaceAttachmentProxyMiddleware.cs [43:104]
public async Task InvokeAsync(HttpContext context, Connection connection)
{
// Check request method
if (!HttpMethods.IsGet(context.Request.Method) && !HttpMethods.IsHead(context.Request.Method))
{
_logger.LogWarning("Request method {RequestMethod} is not supported", context.Request.Method);
WriteStatusCodeAndHeadersTo(context.Response, HttpStatusCode.MethodNotAllowed, _defaultHeaders);
return;
}
// Get route values
var resourceId = context.GetRouteValue("resourceId")?.ToString();
if (string.IsNullOrEmpty(resourceId))
{
_logger.LogWarning("Resource identifier was not provided in the request");
WriteStatusCodeAndHeadersTo(context.Response, HttpStatusCode.NotFound, _defaultHeaders);
return;
}
try
{
// Stream response
var upstreamBlob = await connection.RequestBlobResourceAsync("GET", $"d/{resourceId}", functionName: null);
await using var upstreamResponseStream = upstreamBlob.Stream;
// Not found
if (upstreamResponseStream == null)
{
WriteStatusCodeAndHeadersTo(context.Response, HttpStatusCode.NotFound, _defaultHeaders);
return;
}
// Pass upstream response stream
var headers = new Dictionary<string, string>(_defaultHeaders);
if (upstreamBlob.Etag != null)
{
headers.Add("Etag", upstreamBlob.Etag);
}
if (upstreamBlob.LastModified != null)
{
headers.Add("last-modified", upstreamBlob.LastModified);
}
if (upstreamBlob.ContentType != null)
{
headers.Add("content-type", upstreamBlob.ContentType);
}
WriteStatusCodeAndHeadersTo(context.Response, HttpStatusCode.OK, headers);
await upstreamResponseStream.CopyToAsync(context.Response.Body);
}
catch (NotFoundException ex)
{
WriteStatusCodeAndHeadersTo(context.Response, ex.StatusCode ?? HttpStatusCode.NotFound, _defaultHeaders);
}
catch (AuthenticationRequiredException ex)
{
WriteStatusCodeAndHeadersTo(context.Response, ex.StatusCode ?? HttpStatusCode.Unauthorized, _defaultHeaders);
}
catch (ResourceException)
{
WriteStatusCodeAndHeadersTo(context.Response, HttpStatusCode.BadRequest, _defaultHeaders);
}
}