SlideShare ist ein Scribd-Unternehmen logo
1 von 20
Downloaden Sie, um offline zu lesen
Proxy, Man-In-The-
Middle e testes
Stanislaw Pusep YAPC::Br 2015
Contexto
• Migração de LWP 5.x para LWP 6.x em todo o
sistema
• A partir do LWP 6, vários módulos não mais fazem
parte da distribuição libwww-perl!
• LWP::Protocol::https
• LWP::Protocol::connect
Contexto
• Firewall com whitelist
• Conexões externas somente através do proxy
Squid
• SSL/TLS, pois os requests contém dados pessoais
Desafio
• Message Service faz request HTTP
• request handler acessa os dados
• LWP cria request HTTP(S) para servidor externdo
• Proxy Squid
• API externa
Desafio
• Código legado
• Sem teste para a integração com o serviço externo
• Importante demais para testar em produção
• Sistema distribuído, mas impossível de fazer
deploy gradual
Solução?
• $ua->proxy('http', 'http://proxy:3128');
• GET http://api-remota.com/v1/… HTTP/1.1
• $ua->proxy('https', 'connect://proxy:3128');
• CONNECT api-remota.com:443 HTTP/1.1
Solução?
• SOCKS?
• SOCKS4/SOCKS4a/SOCKS5/SOCKS5h
• LWP::Protocol::socks
Solução
• Melhorar os testes de integração com o proxy!
• Proxy = Servidor + Cliente
• Instalar proxy customizado em DEV?
(ngx_http_proxy_module)
• HTTP::Daemon + HTTP::Proxy
• Plack::Middleware::.*Connect.*
Solução!
Implementação
• Primeiro, implementamos um servidor HTTP
minimalista
• AnyEvent::Socket::tcp_server()
• Responde igualmente tanto “GET / HTTP/1.1”
quanto “GET http://blabla.com/ HTTP/1.1”
• Traduz CONNECT para GET
Implementação
our %pool;
my $srv = tcp_server(
'127.0.0.1' => 0,
sub {
my ($fh, $host, $port) = @_;
# código do servidor
...;
}
);
AE->cv->wait;
Implementação
my $h = AnyEvent::Handle->new(
fh => $fh,
on_eof => &cleanup,
on_error => &cleanup,
timeout => 10,
);
$pool{fileno($fh)} = $h;
Implementação
$h->push_read(regex => qr{(015?012){2}}, sub {
my ($h, $data) = @_;
my ($req, $hdr) = split m{015?012}x, $data, 2;
$req =~ s/s+$//sx;
if ($hdr =~ m{bContent-length:s*(d+)b}is) {
$h->push_read(chunk => int($1), sub {
my ($h, $data) = @_;
reply($h, $req, $hdr, $data);
});
} else {
reply($h, $req, $hdr);
}
});
Implementação
sub cleanup {
my ($h, $fatal, $msg) = @_;
my $id = fileno($h->{fh});
delete $pool{$id} if defined $id;
eval {
no warnings;
shutdown $h->{fh}, 2;
};
$h->destroy;
}
sub reply {
my ($h, $req, $hdr, $content) = @_;
...;
$h->push_write(...);
cleanup($h);
}
Implementação
sub reply {
my ($h, $req, $hdr, $content) = @_;
if ($req =~ m{^CONNECTs+([w.-]+):(d+)s+(HTTP/1.[01])$}ix) {
$h->push_read(tls_autostart => ‘accept’);
}
...;
$h->push_write(...);
cleanup($h);
}
Implementação
• Produto final: Test::HTTP::AnyEvent::Server
• my $server = Test::HTTP::AnyEvent::Server->new;
• Pré-configura @ENV{qw(no_proxy http_proxy https_proxy
ftp_proxy all_proxy)}
• GET /echo/head
• GET /echo/body
• GET /repeat/5/PADDING
• GET /delay/5
Usando…
my $server = Test::HTTP::AnyEvent::Server->new(
    custom_handler => sub {
        my ($response) = @_;
        if ($response->request->uri eq '/hello') {
            $response->content('world');
            return 1;
        }
        return 0; # 404 Not Found
    },
);
my $cv = AE::cv;
$cv->begin;
http_request
    GET     => qq(http://ohhai/hello),
    proxy   => [ $server->address => $server->port ],
sub {
like($_[0], qr{bHosts*:s*ohhaib}isx, q(fake host));
$cv->end;
};
$cv->wait;
Obrigado!
• stas@sysd.org
• https://metacpan.org/pod/Test::HTTP::AnyEvent::Server
• https://gist.github.com/creaktive/781246
We are hiring!
workingatbooking.com

Weitere ähnliche Inhalte

Was ist angesagt?

LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesCarlos Santos
 
Introdução a Redes de Computadores - 8 - Nível de Transporte - Sockets
Introdução a Redes de Computadores - 8 - Nível de Transporte - SocketsIntrodução a Redes de Computadores - 8 - Nível de Transporte - Sockets
Introdução a Redes de Computadores - 8 - Nível de Transporte - SocketsAndre Peres
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7iMasters
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPLuis Gustavo Almeida
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Luis Gustavo Almeida
 
JavaScript - De verdade
JavaScript - De verdadeJavaScript - De verdade
JavaScript - De verdadeLuis Vendrame
 
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisFabrízio Mello
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 

Was ist angesagt? (19)

LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - Funções
 
Introdução a Redes de Computadores - 8 - Nível de Transporte - Sockets
Introdução a Redes de Computadores - 8 - Nível de Transporte - SocketsIntrodução a Redes de Computadores - 8 - Nível de Transporte - Sockets
Introdução a Redes de Computadores - 8 - Nível de Transporte - Sockets
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHP
 
Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
JavaScript - De verdade
JavaScript - De verdadeJavaScript - De verdade
JavaScript - De verdade
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
JasperReports
JasperReportsJasperReports
JasperReports
 
PHP ao Extremo
PHP ao ExtremoPHP ao Extremo
PHP ao Extremo
 
Palestra de PDO
Palestra de PDOPalestra de PDO
Palestra de PDO
 
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
 
SPL Datastructures
SPL DatastructuresSPL Datastructures
SPL Datastructures
 
Php
PhpPhp
Php
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
Aula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQLAula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQL
 
Spring Capitulo 03
Spring Capitulo 03Spring Capitulo 03
Spring Capitulo 03
 
PHP GERAL
PHP GERALPHP GERAL
PHP GERAL
 

Andere mochten auch

Client side exploits
Client side exploitsClient side exploits
Client side exploitsnickyt8
 
Scénarios d'exploitation Metasploit - FR : Scénario 1
Scénarios d'exploitation Metasploit - FR : Scénario 1Scénarios d'exploitation Metasploit - FR : Scénario 1
Scénarios d'exploitation Metasploit - FR : Scénario 1Eric Romang
 
Scénarios d'exploitation Metasploit - FR : Scénario 3
Scénarios d'exploitation Metasploit - FR : Scénario 3Scénarios d'exploitation Metasploit - FR : Scénario 3
Scénarios d'exploitation Metasploit - FR : Scénario 3Eric Romang
 
Attaque metasploite
Attaque metasploiteAttaque metasploite
Attaque metasploiteMajid CHADAD
 
Détecter et neutraliser efficacement les cybermenaces !
Détecter et neutraliser efficacement les cybermenaces !Détecter et neutraliser efficacement les cybermenaces !
Détecter et neutraliser efficacement les cybermenaces !Kyos
 
Palo Alto Networks - Accredited Configuration Engineer (ACE) - PAN-OS 7.0
Palo Alto Networks - Accredited Configuration Engineer (ACE) - PAN-OS 7.0Palo Alto Networks - Accredited Configuration Engineer (ACE) - PAN-OS 7.0
Palo Alto Networks - Accredited Configuration Engineer (ACE) - PAN-OS 7.0Michael Pang
 
Les audits des contrôles de sociétés de services SOC I – SOC II – SOC III
Les audits des contrôles de sociétés de services SOC I – SOC II – SOC IIILes audits des contrôles de sociétés de services SOC I – SOC II – SOC III
Les audits des contrôles de sociétés de services SOC I – SOC II – SOC IIIISACA Chapitre de Québec
 
Accredited Configuration Engineer (ACE) Exam - PAN-OS 7.0 Version
Accredited Configuration Engineer (ACE) Exam - PAN-OS 7.0 VersionAccredited Configuration Engineer (ACE) Exam - PAN-OS 7.0 Version
Accredited Configuration Engineer (ACE) Exam - PAN-OS 7.0 VersionBhupendra Singh
 
VMTurbo presentation used during the SWITCHPOINT NV/SA Quarterly Experience D...
VMTurbo presentation used during the SWITCHPOINT NV/SA Quarterly Experience D...VMTurbo presentation used during the SWITCHPOINT NV/SA Quarterly Experience D...
VMTurbo presentation used during the SWITCHPOINT NV/SA Quarterly Experience D...SWITCHPOINT NV/SA
 
Applciation footprinting, discovery and enumeration
Applciation footprinting, discovery and enumerationApplciation footprinting, discovery and enumeration
Applciation footprinting, discovery and enumerationBlueinfy Solutions
 
EfficientIP presentation used during the SWITCHPOINT NV/SA Quarterly Experien...
EfficientIP presentation used during the SWITCHPOINT NV/SA Quarterly Experien...EfficientIP presentation used during the SWITCHPOINT NV/SA Quarterly Experien...
EfficientIP presentation used during the SWITCHPOINT NV/SA Quarterly Experien...SWITCHPOINT NV/SA
 
Rapport Threat Intelligence Check Point du 21 novembre 2016
Rapport Threat Intelligence Check Point du 21 novembre 2016Rapport Threat Intelligence Check Point du 21 novembre 2016
Rapport Threat Intelligence Check Point du 21 novembre 2016Blandine Delaporte
 
Automated Penetration Testing With Core Impact
Automated Penetration Testing With Core ImpactAutomated Penetration Testing With Core Impact
Automated Penetration Testing With Core ImpactTom Eston
 
Jeudi de l AFAI - Evolutions des menaces et adaptation des SOC
Jeudi de l AFAI - Evolutions des menaces et adaptation des SOCJeudi de l AFAI - Evolutions des menaces et adaptation des SOC
Jeudi de l AFAI - Evolutions des menaces et adaptation des SOCAntoine Vigneron
 
Persistence is Key: Advanced Persistent Threats
Persistence is Key: Advanced Persistent ThreatsPersistence is Key: Advanced Persistent Threats
Persistence is Key: Advanced Persistent ThreatsSameer Thadani
 
Blackhat Workshop
Blackhat WorkshopBlackhat Workshop
Blackhat Workshopwremes
 

Andere mochten auch (20)

Client side exploits
Client side exploitsClient side exploits
Client side exploits
 
Scénarios d'exploitation Metasploit - FR : Scénario 1
Scénarios d'exploitation Metasploit - FR : Scénario 1Scénarios d'exploitation Metasploit - FR : Scénario 1
Scénarios d'exploitation Metasploit - FR : Scénario 1
 
Scénarios d'exploitation Metasploit - FR : Scénario 3
Scénarios d'exploitation Metasploit - FR : Scénario 3Scénarios d'exploitation Metasploit - FR : Scénario 3
Scénarios d'exploitation Metasploit - FR : Scénario 3
 
Attaque metasploite
Attaque metasploiteAttaque metasploite
Attaque metasploite
 
Client Side Exploits using PDF
Client Side Exploits using PDFClient Side Exploits using PDF
Client Side Exploits using PDF
 
Détecter et neutraliser efficacement les cybermenaces !
Détecter et neutraliser efficacement les cybermenaces !Détecter et neutraliser efficacement les cybermenaces !
Détecter et neutraliser efficacement les cybermenaces !
 
Honey net
Honey netHoney net
Honey net
 
Palo Alto Networks - Accredited Configuration Engineer (ACE) - PAN-OS 7.0
Palo Alto Networks - Accredited Configuration Engineer (ACE) - PAN-OS 7.0Palo Alto Networks - Accredited Configuration Engineer (ACE) - PAN-OS 7.0
Palo Alto Networks - Accredited Configuration Engineer (ACE) - PAN-OS 7.0
 
Les audits des contrôles de sociétés de services SOC I – SOC II – SOC III
Les audits des contrôles de sociétés de services SOC I – SOC II – SOC IIILes audits des contrôles de sociétés de services SOC I – SOC II – SOC III
Les audits des contrôles de sociétés de services SOC I – SOC II – SOC III
 
Accredited Configuration Engineer (ACE) Exam - PAN-OS 7.0 Version
Accredited Configuration Engineer (ACE) Exam - PAN-OS 7.0 VersionAccredited Configuration Engineer (ACE) Exam - PAN-OS 7.0 Version
Accredited Configuration Engineer (ACE) Exam - PAN-OS 7.0 Version
 
VMTurbo presentation used during the SWITCHPOINT NV/SA Quarterly Experience D...
VMTurbo presentation used during the SWITCHPOINT NV/SA Quarterly Experience D...VMTurbo presentation used during the SWITCHPOINT NV/SA Quarterly Experience D...
VMTurbo presentation used during the SWITCHPOINT NV/SA Quarterly Experience D...
 
Applciation footprinting, discovery and enumeration
Applciation footprinting, discovery and enumerationApplciation footprinting, discovery and enumeration
Applciation footprinting, discovery and enumeration
 
Defending against Injections
Defending against InjectionsDefending against Injections
Defending against Injections
 
EfficientIP presentation used during the SWITCHPOINT NV/SA Quarterly Experien...
EfficientIP presentation used during the SWITCHPOINT NV/SA Quarterly Experien...EfficientIP presentation used during the SWITCHPOINT NV/SA Quarterly Experien...
EfficientIP presentation used during the SWITCHPOINT NV/SA Quarterly Experien...
 
Rapport Threat Intelligence Check Point du 21 novembre 2016
Rapport Threat Intelligence Check Point du 21 novembre 2016Rapport Threat Intelligence Check Point du 21 novembre 2016
Rapport Threat Intelligence Check Point du 21 novembre 2016
 
Automated Penetration Testing With Core Impact
Automated Penetration Testing With Core ImpactAutomated Penetration Testing With Core Impact
Automated Penetration Testing With Core Impact
 
Jeudi de l AFAI - Evolutions des menaces et adaptation des SOC
Jeudi de l AFAI - Evolutions des menaces et adaptation des SOCJeudi de l AFAI - Evolutions des menaces et adaptation des SOC
Jeudi de l AFAI - Evolutions des menaces et adaptation des SOC
 
EvasionTechniques
EvasionTechniquesEvasionTechniques
EvasionTechniques
 
Persistence is Key: Advanced Persistent Threats
Persistence is Key: Advanced Persistent ThreatsPersistence is Key: Advanced Persistent Threats
Persistence is Key: Advanced Persistent Threats
 
Blackhat Workshop
Blackhat WorkshopBlackhat Workshop
Blackhat Workshop
 

Ähnlich wie Proxy, Man-In-The-Middle e testes

Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e SphinxElton Minetto
 
Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxThiago Paes
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanElton Minetto
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Felipe Mamud
 
Supervisão e Monitorização
Supervisão e MonitorizaçãoSupervisão e Monitorização
Supervisão e MonitorizaçãoSAPO Sessions
 
Conexões SSH com PHP
Conexões SSH com PHPConexões SSH com PHP
Conexões SSH com PHPFelipe Weckx
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2Wilson Júnior
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3Flávio Lisboa
 
Gerência de Configurações com o Puppet
Gerência de Configurações com o PuppetGerência de Configurações com o Puppet
Gerência de Configurações com o Puppetpericles_junior
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPelliando dias
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valorKinn Julião
 
Project HA
Project HAProject HA
Project HAKarpv
 
A Biblioteca cURL
A Biblioteca cURLA Biblioteca cURL
A Biblioteca cURLricardophp
 
Puppet – Torne Seu Datacenter áGil
Puppet – Torne Seu Datacenter áGilPuppet – Torne Seu Datacenter áGil
Puppet – Torne Seu Datacenter áGiljefesrodrigues
 
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...Aécio Pires
 

Ähnlich wie Proxy, Man-In-The-Middle e testes (20)

Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e Sphinx
 
A busca pelo deploy continuo
A busca pelo deploy continuoA busca pelo deploy continuo
A busca pelo deploy continuo
 
Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com Nginx
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
PHP e Redis
PHP e RedisPHP e Redis
PHP e Redis
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?
 
Python 08
Python 08Python 08
Python 08
 
Supervisão e Monitorização
Supervisão e MonitorizaçãoSupervisão e Monitorização
Supervisão e Monitorização
 
Conexões SSH com PHP
Conexões SSH com PHPConexões SSH com PHP
Conexões SSH com PHP
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2
 
Hello SAFE World!!!
Hello SAFE World!!!Hello SAFE World!!!
Hello SAFE World!!!
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3
 
Modern PHP
Modern PHPModern PHP
Modern PHP
 
Gerência de Configurações com o Puppet
Gerência de Configurações com o PuppetGerência de Configurações com o Puppet
Gerência de Configurações com o Puppet
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHP
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
 
Project HA
Project HAProject HA
Project HA
 
A Biblioteca cURL
A Biblioteca cURLA Biblioteca cURL
A Biblioteca cURL
 
Puppet – Torne Seu Datacenter áGil
Puppet – Torne Seu Datacenter áGilPuppet – Torne Seu Datacenter áGil
Puppet – Torne Seu Datacenter áGil
 
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
 

Proxy, Man-In-The-Middle e testes

  • 1. Proxy, Man-In-The- Middle e testes Stanislaw Pusep YAPC::Br 2015
  • 2. Contexto • Migração de LWP 5.x para LWP 6.x em todo o sistema • A partir do LWP 6, vários módulos não mais fazem parte da distribuição libwww-perl! • LWP::Protocol::https • LWP::Protocol::connect
  • 3. Contexto • Firewall com whitelist • Conexões externas somente através do proxy Squid • SSL/TLS, pois os requests contém dados pessoais
  • 4. Desafio • Message Service faz request HTTP • request handler acessa os dados • LWP cria request HTTP(S) para servidor externdo • Proxy Squid • API externa
  • 5. Desafio • Código legado • Sem teste para a integração com o serviço externo • Importante demais para testar em produção • Sistema distribuído, mas impossível de fazer deploy gradual
  • 6. Solução? • $ua->proxy('http', 'http://proxy:3128'); • GET http://api-remota.com/v1/… HTTP/1.1 • $ua->proxy('https', 'connect://proxy:3128'); • CONNECT api-remota.com:443 HTTP/1.1
  • 7.
  • 9. Solução • Melhorar os testes de integração com o proxy! • Proxy = Servidor + Cliente • Instalar proxy customizado em DEV? (ngx_http_proxy_module) • HTTP::Daemon + HTTP::Proxy • Plack::Middleware::.*Connect.*
  • 11. Implementação • Primeiro, implementamos um servidor HTTP minimalista • AnyEvent::Socket::tcp_server() • Responde igualmente tanto “GET / HTTP/1.1” quanto “GET http://blabla.com/ HTTP/1.1” • Traduz CONNECT para GET
  • 12. Implementação our %pool; my $srv = tcp_server( '127.0.0.1' => 0, sub { my ($fh, $host, $port) = @_; # código do servidor ...; } ); AE->cv->wait;
  • 13. Implementação my $h = AnyEvent::Handle->new( fh => $fh, on_eof => &cleanup, on_error => &cleanup, timeout => 10, ); $pool{fileno($fh)} = $h;
  • 14. Implementação $h->push_read(regex => qr{(015?012){2}}, sub { my ($h, $data) = @_; my ($req, $hdr) = split m{015?012}x, $data, 2; $req =~ s/s+$//sx; if ($hdr =~ m{bContent-length:s*(d+)b}is) { $h->push_read(chunk => int($1), sub { my ($h, $data) = @_; reply($h, $req, $hdr, $data); }); } else { reply($h, $req, $hdr); } });
  • 15. Implementação sub cleanup { my ($h, $fatal, $msg) = @_; my $id = fileno($h->{fh}); delete $pool{$id} if defined $id; eval { no warnings; shutdown $h->{fh}, 2; }; $h->destroy; } sub reply { my ($h, $req, $hdr, $content) = @_; ...; $h->push_write(...); cleanup($h); }
  • 16. Implementação sub reply { my ($h, $req, $hdr, $content) = @_; if ($req =~ m{^CONNECTs+([w.-]+):(d+)s+(HTTP/1.[01])$}ix) { $h->push_read(tls_autostart => ‘accept’); } ...; $h->push_write(...); cleanup($h); }
  • 17. Implementação • Produto final: Test::HTTP::AnyEvent::Server • my $server = Test::HTTP::AnyEvent::Server->new; • Pré-configura @ENV{qw(no_proxy http_proxy https_proxy ftp_proxy all_proxy)} • GET /echo/head • GET /echo/body • GET /repeat/5/PADDING • GET /delay/5
  • 18. Usando… my $server = Test::HTTP::AnyEvent::Server->new(     custom_handler => sub {         my ($response) = @_;         if ($response->request->uri eq '/hello') {             $response->content('world');             return 1;         }         return 0; # 404 Not Found     }, ); my $cv = AE::cv; $cv->begin; http_request     GET     => qq(http://ohhai/hello),     proxy   => [ $server->address => $server->port ], sub { like($_[0], qr{bHosts*:s*ohhaib}isx, q(fake host)); $cv->end; }; $cv->wait;