O Middleware é um termo geral para software que serve para "colar juntos" programas separados, geralmente complexos e já existentes. Alguns componentes de software frequentemente conectados ao middleware incluem aplicativos corporativos e serviços da Web.
Ref:
* http://searchsoa.techtarget.com/definition/middleware
* http://www.webopedia.com/TERM/M/middleware.html
* http://www.softwareag.com/blog/reality_check/index.php/integration-insights/middleware-for-my-mom-or-kids-guide-to-what-i-do/
* http://www.networkcomputing.com/netdesign/cdmwdef.htm
* https://en.wikipedia.org/wiki/Middleware
O que é middleware?
O middleware é um código que existe entre a solicitação e a resposta e que pode tomar a solicitação de entrada, executar ações com base nela e preencher a resposta ou passar a delegação no próximo middleware na fila.
https://github.com/zendframework/zend-stratigility/blob/master/doc/book/middleware.md
O Middleware HTTP fornece um mecanismo conveniente para filtrar solicitações HTTP inserindo seu aplicativo. Por exemplo, o Laravel inclui um middleware que verifica o usuário do seu aplicativo é autenticado. Se o usuário não for autenticado, o middleware redirecionará o usuário para a tela de login. No entanto, se o usuário for autenticado, o middleware permitirá que a solicitação prossiga mais adiante no aplicativo.
http://laravel.com/docs/master/middleware
O Silex permite executar o código, isso altera o comportamento padrão do SILEX, em diferentes estágios durante o manuseio de uma solicitação através do Middlewares:
http://silex.sensiolabs.org/doc/middlewares.html
O objetivo do middleware é inspecionar, analisar ou modificar o ambiente de aplicativo, a solicitação e a resposta antes e/ou depois que o aplicativo SLIM é chamado.
http://docs.slimframework.com/middleware/overview/
Todas as mensagens HTTP consistem na versão do protocolo HTTP que está sendo usada, cabeçalhos e um corpo de mensagem. Uma solicitação baseia -se na mensagem para incluir o método HTTP usado para fazer a solicitação e o URI ao qual a solicitação é feita. Uma resposta inclui o código de status HTTP e a frase da razão.
...
Seja você um programador ou não, você o viu em toda parte na web. Neste momento, sua barra de endereços de navegadores mostra algo que começa com "http: //". Até o seu primeiro script do Hello World enviou cabeçalhos HTTP sem você perceber. Neste artigo, aprenderemos sobre o básico dos cabeçalhos HTTP e como podemos usá -los em nossos aplicativos da Web.
A resposta HTTP que um servidor envia de volta a um cliente contém cabeçalhos que identificam o tipo de conteúdo no corpo da resposta, o servidor que enviou a resposta, quantos bytes estão no corpo, quando a resposta foi enviada, etc. PHP e Apache normalmente cuidam dos cabeçalhos, identificando o documento como html , calculando a duração do HTML, e a página Sow. A maioria dos aplicativos da Web nunca precisa definir os próprios cabeçalhos. No entanto, se você deseja enviar de volta algo que não seja HTML, defina o tempo de expiração para uma página, redireciona o navegador do cliente ou gera um erro HTTP específico, precisará usar a função Header ().
*How to See HTTP Headers*
* Firebug extensions to analyze HTTP headers.
1. Turn in Firebug
2. Click Net
3. Click Headers
Ref:
* http://docstore.mik.ua/orelly/webprog/php/ch07_05.htm
* http://code.tutsplus.com/tutorials/http-headers-for-dummies--net-8039
*Headers already sent: Why does it happen?*
To understand why headers must be sent before output it's necessary to look at a typical HTTP response. PHP scripts mainly generate HTML content, but also pass a set of HTTP/CGI headers to the webserver:
HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>
The page/output always follows the headers. PHP has to pass the headers to the webserver first. It can only do that once. After the double linebreak it can nevermore amend them.
When PHP receives the first output (print, echo, <html>) it will flush all collected headers. Afterwards it can send all the output it wants. But sending further HTTP headers is impossible then.
O PHP não possui suporte interno para mensagens HTTP.
...
Os fluxos PHP são a maneira mais conveniente e onipresente de enviar solicitações HTTP, mas apresentam várias limitações em relação à configuração adequada do suporte SSL e fornecem uma interface complicada para definir coisas como cabeçalhos. O CURL fornece um conjunto de recursos completo e expandido, mas, como não é uma extensão padrão, muitas vezes não está presente. A extensão HTTP sofre do mesmo problema que o CRO, bem como o fato de ter tradicionalmente ter muito menos exemplos de uso.
A maioria das bibliotecas de clientes HTTP modernas tendem a abstrair a implementação, para garantir que elas possam funcionar em qualquer ambiente em que sejam executadas e em qualquer uma das camadas acima.
Notas:
cURL allows you to connect and communicate to many different types of servers with many different types of protocols.
(http://php.net/manual/en/intro.curl.php)
O PHP usa as APIs do servidor (SAPI) para interpretar solicitações HTTP recebidas, entrada de marechal e passar o manuseio para scripts. O design original do SAPI refletia a interface de gateway comum, que marcaria os dados e o empurraria para variáveis de ambiente antes de passar a delegação para um script; O script retiraria as variáveis do ambiente para processar a solicitação e retornar uma resposta.
O SAPI Design do PHP abstrava fontes de entrada comuns, como cookies, argumentos de string de consulta e conteúdo de postagem codificado por URL via Superglobals ($ _Cookie, $ _Get e $ _Post, respectivamente), fornecendo uma camada de conveniência para desenvolvedores da Web.
...
O uso direto do Superglobals tem várias preocupações. Primeiro, eles são mutáveis, o que possibilita que as bibliotecas e o código alterassem os valores e, assim, alteram o estado para o aplicativo. Além disso, as superglobais dificultam a unidade e o teste de integração, levando à degradação da qualidade da qualidade do código.
...
Finalmente, quando se trata de respostas do lado do servidor, o PHP fica à sua maneira: qualquer conteúdo emitido antes de uma chamada para o cabeçalho () resultará em essa chamada se tornar um não-operatório; Dependendo das configurações de relatórios de erros, isso geralmente significa que os cabeçalhos e/ou o status da resposta não são enviados corretamente. Uma maneira de contornar isso é usar os recursos de buffer de saída do PHP, mas o ninho de buffers de saída pode se tornar problemático e difícil de depurar. Estruturas e aplicações, portanto, tendem a criar abstrações de resposta para agregar cabeçalhos e conteúdo que podem ser emitidos de uma só vez - e essas abstrações são frequentemente incompatíveis.
Ref: http://www.php-fig.org/psr/psr-7/meta/
Você pode usar variáveis superglobais (como $ _get e $ _post), mas elas são um estado mutável global. Juntamente com esta unidade e o teste de integração do seu código se torna difícil.
Por esses motivos, muitas estruturas PHP decidiram implementar uma abstação para representar mensagens HTTP (veja, por exemplo, Symfony Httpfoundation ou Zend http).
Isso levou a uma situação em que qualquer aplicativo foi baseado em uma implementação específica de mensagens HTTP, para que dificilmente fosse utilizável em projetos construídos usando outras estruturas.
É por isso que um conjunto comum de interfaces ajuda a abstrair mensagens HTTP e trabalhar com elas de maneira agnóstica de estrutura.
Ref: http://stackoverflow.com/questions/32805681/php-why-http-message-implementations
O HTTP é usado para transmitir recursos, não apenas arquivos. Um recurso é um pouco de informação que pode ser identificada por um URL (é o R no URL). O tipo de recurso mais comum é um arquivo, mas um recurso também pode ser um resultado de consulta gerado dinamicamente, a saída de um script CGI, um documento disponível em vários idiomas ou outra coisa.
Ref:
* http://www.w3schools.com/tags/ref_httpmessages.asp
* https://www.jmarshall.com/easy/http/