Custom HTTP Headers¶
Sometimes, you need to send custom HTTP headers.
From Twirp’s perspective, “headers” are just metadata since HTTP is a lower level, transport layer. But since Twirp is primarily used with HTTP, sometimes you might need to send or receive some information from that layer too.
Client side¶
Send HTTP Headers with client requests¶
Use Twirp\Context::withHttpRequestHeaders
to attach a map of headers to the context:
<?php
// Given a client ...
$client = new \Twitch\Twirp\Example\HaberdasherClient($addr);
// Given some headers ...
$headers = [
'Twitch-Authorization' => 'uDRlDxQYbFVXarBvmTncBoWKcZKqrZTY',
'Twitch-Client-ID' => 'FrankerZ',
];
// Attach the headers to a context
$ctx = [];
$ctx = \Twirp\Context::withHttpRequestHeaders($ctx, $headers);
// And use the context in the request. Headers will be included in the request!
$resp = $client—>MakeHat($ctx, new \Twitch\Twirp\Example\Size());
Read HTTP Headers from responses¶
Twirp client responses are structs that depend only on the protobuf response. HTTP headers can not be used by the Twirp client in any way.
However, remember that the TwirPHP client is instantiated with a PSR-18 HTTP client, which can be anything that implements the minimal interface. For example you could configure an HTTPlug PluginClient and read the headers in a plugin.
Server side¶
Send HTTP Headers on server responses¶
In your server implementation you can set HTTP headers using Twirp\Context::withHttpResponseHeader
.
<?php
public function MakeHat(array $ctx, \Twitch\Twirp\Example\Size $size): Hat
{
\Twirp\Context::withHttpResponseHeader($ctx, 'Cache-Control', 'public, max-age=60');
$hat = new \Twitch\Twirp\Example\Hat();
return $hat;
}
Read HTTP Headers from requests¶
TwirPHP server methods are abstracted away from HTTP, therefore they don’t have direct access to HTTP Headers.
However, they receive the PSR-7 server attributes as the context that can be modified by HTTP middleware before being used by the Twirp method.
For example, lets say you want to read the ‘User-Agent’ HTTP header inside a twirp server method. You might write this middleware:
<?php
use Psr\Http\Message\ServerRequestInterface;
// class UserAgentMiddleware...
public function handle(ServerRequestInterface $request)
{
$request = $request->withAttribute('user-agent', $request->getHeaderLine('User-Agent'));
return $this->server->handle($request);
}