Caio Kawasaki
Caio Kawasaki

Reputation: 2950

Laravel - Using Stream with the new Http client

I'm migrating my old system to the new version of Laravel, and I'm having problems with one of my requests...

Basically on this request I receive any file and simply forward it to the user. Here is the old version using Guzzle:

use Symfony\Component\HttpFoundation\StreamedResponse;

public function getMedia($media)
{
    try {
        $response = $this->client->get('media/' . $media, [
                'stream' => true
            ]
        );

        $contentType = $response->getHeader('Content-Type');

        $body = $response->getBody();

        $stream = new StreamedResponse(function () use ($body) {
            while (!$body->eof()) {
                echo $body->read(1024);
            }
        });

        $stream->headers->set('Content-Type', $contentType);

        return $stream;
    } catch (ClientException $e) {
        return response()->json([
            'errors' => json_decode($e->getResponse()->getBody()->getContents())->errors,
            'message' => 'Unfortunately we could not find the requested file'
        ], 404);
    }
}

And the new code that I tried to write, without success:

use Symfony\Component\HttpFoundation\StreamedResponse;

public function getMedia($media)
{
    $response = Http::withOptions([
        'stream' => true
    ])->get("media/{$media}");

    $contentType = $response->header('Content-Type');

    $body = $response->body();

    $stream = new StreamedResponse(function () use ($body) {
        while (!$body->eof()) {
            echo $body->read(1024);
        }
    });

    $stream->headers->set('Content-Type', $contentType);

    return $stream;
}

Does anyone have any idea how to solve this? I don't know what to do anymore...

Upvotes: 2

Views: 6104

Answers (1)

andresdevr
andresdevr

Reputation: 574

I know, 2 years late, but i'm doing something similar, you should access to the response via the psr

instead of:

$body = $response->body(); // This try to return an string

Use this:

$body = $response->toPsrResponse()->getBody(); // the guzzle response

Then you can use your normal code

I hope someone can find this useful,

Upvotes: 5

Related Questions