public async Task InvokeAsync()

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