• Stars
    star
    44
  • Rank 612,736 (Top 13 %)
  • Language
    PHP
  • License
    MIT License
  • Created over 7 years ago
  • Updated over 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

PSR-15 middleware to implement content negotiation

middlewares/negotiation

Latest Version on Packagist Software License Testing Total Downloads

Middleware using wildurand/Negotiation to implement content negotiation. Contains the following components:

Requirements

Installation

This package is installable and autoloadable via Composer as middlewares/negotiation.

composer require middlewares/negotiation

Example

Dispatcher::run([
    new Middlewares\ContentType(),
    new Middlewares\ContentLanguage(['en', 'gl', 'es']),
    new Middlewares\ContentEncoding(['gzip', 'deflate']),
]);

ContentType

To detect the preferred mime type using the Accept header and the file extension and edit the header with this value. A Content-Type header is also added to the response if it's missing.

Define the formats to negotiate sorted by priority in the first argument. By default uses these

//Use the default types
$negotiator = new Middlewares\ContentType();

//Use only few types
$negotiator = new Middlewares\ContentType(['html', 'json']);

//Use only few types and configure some of them
$negotiator = new Middlewares\ContentType([
    'html',
    'json',
    'txt' => [
        'extension' => ['txt'],
        'mime-type' => ['text/plain'],
        'charset' => true,
    ]
]);

errorResponse

If no format matches the negotiation, by default the middleware use the first value in the list of available formats (by default text/html). Use this option to return a 406 error. Optionally, you can provide a Psr\Http\Message\ResponseFactoryInterface that will be used to create the response. If it's not defined, Middleware\Utils\Factory will be used to detect it automatically.

$responseFactory = new MyOwnResponseFactory();

//Use default html format (the first provided) if no valid format was detected (By default)
$negotiator = new Middlewares\ContentType(['html', 'json']);

//Return a 406 response if no valid format was detected
$negotiator = (new Middlewares\ContentType(['html', 'json']))->errorResponse();

//Return a 406 response using a specific responseFactory if no valid format was detected
$negotiator = (new Middlewares\ContentType(['html', 'json']))->errorResponse($responseFactory);

charsets

The available charsets to negotiate with the Accept-Charset header. By default is UTF-8.

$negotiator = (new Middlewares\ContentType())->charsets(['UTF-8', 'ISO-8859-1']);

noSniff

Adds the X-Content-Type-Options: nosniff header, to mitigating MIME confusiรณn attacks.. Enabled by default.

//Disable noSniff header
$negotiator = (new Middlewares\ContentType())->noSniff(false);

attribute

To store the format name (json, html, css etc) in an attribute of the ServerRequest.

ContentLanguage

To detect the preferred language using the Accept-Language header or the path prefix and edit the header with this value. A Content-Language header is also added to the response if it's missing.

The first argument is an array with the available languages to negotiate sorted by priority. The first value will be used as default if no other languages is choosen in the negotiation.

$request = Factory::createServerRequest('GET', '/')
    ->withHeader('Accept-Language', 'gl-es, es;q=0.8, en;q=0.7');

Dispatcher::run([
    new Middlewares\ContentLanguage(['es', 'en']),

    function ($request) {
        $language = $request->getHeaderLine('Accept-Language');

        switch ($language) {
            case 'es':
                return 'Hola mundo';
            case 'en':
                return 'Hello world';
        }
    }
], $request);

usePath

By enabling this option, the base path will be used to detect the language. This is useful if you have different paths for each language, for example /gl/foo and /en/foo.

Note: the language in the path has preference over the Accept-Language header.

$request = Factory::createServerRequest('GET', '/en/hello-world');

Dispatcher::run([
    (new Middlewares\ContentLanguage(['es', 'en']))->usePath(),

    function ($request) {
        $language = $request->getHeaderLine('Accept-Language');

        switch ($language) {
            case 'es':
                return 'Hola mundo';
            case 'en':
                return 'Hello world';
        }
    }
], $request);

redirect

Used to return a 302 responses redirecting to the path containing the language. This only works if usePath is enabled, so for example, if the request uri is /welcome, returns a redirection to /en/welcome.

$responseFactory = new MyOwnResponseFactory();

//Use not only the Accept-Language header but also the path prefix to detect the language
$negotiator = (new Middlewares\ContentLanguage(['es', 'en']))->usePath();

//Returns a redirection with the language in the path if it's missing
$negotiator = (new Middlewares\ContentLanguage(['es', 'en']))->usePath()->redirect();

//Returns a redirection using a specific response factory
$negotiator = (new Middlewares\ContentLanguage(['es', 'en']))->usePath()->redirect($responseFactory);

ContentEncoding

To detect the preferred encoding type using the Accept-Encoding header and edit the header with this value.

$request = Factory::createServerRequest('GET', '/')
    ->withHeader('Accept-Encoding', 'gzip,deflate');

Dispatcher::run([
    new Middlewares\ContentEncoding(['gzip']),

    function ($request) {
        echo $request->getHeaderLine('Accept-Encoding'); //gzip
    }
], $request);

Please see CHANGELOG for more information about recent changes and CONTRIBUTING for contributing details.

The MIT License (MIT). Please see LICENSE for more information.

More Repositories

1

psr15-middlewares

Collection of PSR-15 middlewares
398
star
2

awesome-psr15-middlewares

A curated list of awesome PSR-15 HTTP Middleware resources
317
star
3

fast-route

PSR-15 middleware to use FastRoute
PHP
95
star
4

utils

Common utils used by PSR-15 middlewares
PHP
51
star
5

request-handler

PSR-15 middleware to execute request handlers
PHP
44
star
6

http-authentication

PSR-15 middleware to implement Basic and Digest Http authentication
PHP
37
star
7

whoops

PSR-15 middleware to use Whoops as error handler
PHP
32
star
8

payload

PSR-15 middleware to parse the body of the request with support for json, csv and url-encode
PHP
30
star
9

trailing-slash

PSR-15 middleware to normalize the trailing slash of the uri path
PHP
27
star
10

proxy

PSR-15 middleware to forward requests and return responses
PHP
21
star
11

access-log

PSR-15 middleware to generate access logs
PHP
20
star
12

minifier

Middleware to minify Html, CSS and Javascript responses
PHP
17
star
13

cache

PSR-15 middleware with various cache utilities
PHP
16
star
14

client-ip

PSR-15 middleware to detect the client ip and save it as a request attribute.
PHP
16
star
15

debugbar

PSR-15 middleware to insert PHP DebugBar automatically in html responses
PHP
16
star
16

response-time

PSR-15 middleware to save the response time into the X-Response-Time header
PHP
14
star
17

error-handler

PSR-15 middleware to handle http errors
PHP
14
star
18

https

PSR-15 middleware to redirect to https and adds the Strict-Transport-Security header
PHP
14
star
19

php-session

PSR-15 middleware to create a php session using the request data
PHP
13
star
20

csp

PSR-15 middleware to add the Content-Security-Policy header to the response
PHP
13
star
21

honeypot

PSR-15 middleware to implement a honeypot spam prevention
PHP
13
star
22

referrer-spam

PSR-15 middleware to block referrer spammers
PHP
12
star
23

cors

PSR-15 middleware to implement Cross-Origin Resource Sharing (CORS)
PHP
12
star
24

firewall

Middleware to provide IP filtering
PHP
11
star
25

geolocation

PSR-15 middleware to geolocate the client using the ip address
PHP
11
star
26

image-manipulation

PSR-15 middleware to manipulate images on-demand
PHP
10
star
27

filesystem

PSR-15 middleware to write or read responses from files
PHP
10
star
28

aura-router

PSR-15 middleware to use Aura.Router
PHP
8
star
29

skeleton

A skeleton repository for PSR-15 middleware packages
PHP
7
star
30

encoder

PSR-15 middleware to encode the response body to gzip or deflate
PHP
6
star
31

recaptcha

PSR-15 middleware to use Google reCAPTCHA for spam prevention
PHP
6
star
32

redirect

Middleware to redirect old urls to new urls SEO friendly
PHP
6
star
33

aura-session

PSR-15 middleware to manage sessions using Aura.Session
PHP
6
star
34

uuid

PSR-15 middleware to generate an UUID and save it in the X-Uuid header
PHP
5
star
35

shutdown

PSR-15 middleware to display a 503 maintenance page
PHP
5
star
36

csv-payload

PSR-15 middleware to parse the CSV body of the request
PHP
5
star
37

ideas

Need a Middleware or looking for ideas?
5
star
38

json-exception-handler

Middleware to catch exceptions and output them as JSON
PHP
5
star
39

reporting-logger

PSR-15 middleware to log server-side reportings
PHP
5
star
40

method-override

PSR-15 middleware to override the request method using the X-Http-Method-Override header
PHP
5
star
41

error-response

Middleware to create responses with error status code (4xx-5xx)
PHP
5
star
42

robots

PSR-15 middleware to enable/disable the robots of the search engines
PHP
4
star
43

emitter

Middleware to send (or emit) a PSR-7 response object using header() and echo
PHP
4
star
44

www

PSR-15 middleware to add or remove the www subdomain
PHP
4
star
45

base-path

PSR-15 middleware to remove the prefix from the uri path of the request
PHP
4
star
46

base-path-router

PSR-15 middleware to assign request handlers based on path prefixes
PHP
4
star
47

content-length

PSR-15 middleware to inject the Content-Length header into the response
PHP
3
star
48

lowercase

PSR-15 middleware to convert the URI path to lowercase
PHP
2
star