Sua app Ruby
end to end
Willian Molinari (a.k.a PotHix)
Aviso
Willian Molinari
a.k.a PotHix
Plaev.github.io
Motivação
Escrevi um livro!
https://desconstruindoaweb.com.br
315 horas
de pesquisa e dedicação
8 meses
de duração de escrita
127 re...
Essa talk se baseia em
https://gurusp.org
https://gurusp.org
https://gurusp.org
https://gurusp.org
https://gurusp.org
É uma URL?
https://gurusp.org
“O que significa PotHix”
“O que significa PotHix”
https://gurusp.org
É uma URL!
https://gurusp.org
https://gurusp.org
https://gurusp.org
Tem HSTS?
Strict-Transport-Security
https://gurusp.org
https://gurusp.org
Tem HSTS?
Strict-Transport-Security
config.force_ssl = true
https://gurusp.org
Tem cache?
Expires Cache-Control
https://gurusp.org
ETag
Protocolo: https://
Domínio: gurusp.org
Path: /
Tem cache de
DNS?
Sem
cache
Com
cache
Chrome
Faz cache de DNS
http://aosabook.org/en/posa/high-performance-networking-in-chrome.html
getaddrinfo()
sistema
operacional
glibc
I’m watching you!
n
u
glibc -> /etc/hosts
nss/nss_files/files-hosts.c
glibc -> getaddrinfo()
sysdeps/posix/getaddrinfo.c
2321 getaddrinfo (const char *name, const char *service,
2322 const str...
getaddrinfo()
Tem nscd para
cache de DNS?
Internet
- glibc
POSIX
Aplicação
Apresentação
Sessão
Transporte
Rede
Enlace
Físico
Modelo
OSI
Aplicação
Apresentação
Sessão
Transporte
Rede
Enlace
Físico
Modelo
OSI
S
R
L
Y
?
Aplicação
Transporte
Rede
Enlace
Físico
Sessão
Apresentação
Aplicação
Transporte
Rede
Enlace
Físico
Aplicação
Transporte
Rede
Enlace
Físico
SO
user
TCP / UDP
DNSAplicação
Transporte
Rede
Enlace
Físico
IP
Ethernet / Wi-Fi
010101001011
DNS
TCP / UDP
Aplicação
Transporte
Rede
Enlace
Físico
IP
Ethernet / Wi-Fi
010101001011
código disponível em: chromium/src/net/dns
getaddrinfo()
__socket() & __connect()
sysdeps/posix/getaddrinfo.c
2515 fd = __socket (af, SOCK_DGRAM, IPPROTO_IP);
[...]
...
terminal
$ sudo strace -f -e socket,connect -p $(ps aux | grep chromium | grep -v nacl |
awk '{ print $2}' | xargs echo | ...
terminal
request
UDP
ipv4
$ sudo strace -f -e socket,connect -p $(ps aux | grep chromium | grep -v nacl |
awk '{ print $2}...
Happy eyebals (rfc6555):
https://www.ietf.org/mail-archive/web/v6ops/current/msg22455.html
AAAA
A
Browser
sitev6
sitev4
Happy eyeballs de acordo com a rfc6555
AAAA
A
Browser
sitev6
sitev4
Happy eyeballs de acordo com a rfc6555
AAAA
A
Browser
sitev6
sitev4RST
Happy eyeballs de acordo com a rfc6555
DNSAplicação
Transporte
Rede
Enlace
Físico
TCP / UDP
IP
Ethernet / Wi-Fi
010101001011
UDP/IP
linux/blob/master/net/ipv4/udp.c
UDP
Conteúdo
Endereço (IP)
?
DNSAplicação
Transporte
Rede
Enlace
Físico
TCP / UDP
IP
Ethernet / Wi-Fi
010101001011
DNSAplicação
Transporte
Rede
Enlace
Físico
TCP / UDP
IP
Mágica, bro!
A visual explanation of how dns lookups work
Via dnstracer: `dnstracer -s . -4 -o -c gurusp.org`
A.ROOT-SERVERS.NET [.]
(198.41.0.4)
d0.org.afilias-nst.org [org] (199....
Internet
glibc
DNS
TCP/IP
UDP/IP
POSIX
Internet
glibc
DNS
TCP/IP
UDP/IP
POSIX
HTTP
HTTP/HTTPS
TCP / UDP
IP
Ethernet / Wi-Fi
010101001011
Aplicação
Transporte
Rede
Enlace
Físico
HTTP/HTTPS
TCP / UDP
IP
Ethernet / Wi-Fi
010101001011
Aplicação
Transporte
Rede
Enlace
Físico
TCP
linux/blob/master/net/ipv4/tcp.c
https://en.wikipedia.org/wiki/Transmission_Control_Protocol
Three-way handshake
Estabelecendo uma conexão
LISTENINGSYN
LISTENSYNSENT
SYN+ACK
LISTEN
SYN
RECEIVED
SYNSENT
SYN
RECEIVED
SYNSENTESTABLISHED
ACK
ESTABLISHEDSYNSENTESTABLISHED
É NÓIS! É NÓIS!
HTTP/HTTPS
TCP / UDP
IP
Ethernet / Wi-Fi
010101001011
Aplicação
Transporte
Rede
Enlace
Físico
HTTPS
TLS = fork(SSLv3)
SSLv3 is no longer supported in chrome
HTTP/HTTPS
TCP / UDP
IP
Ethernet / Wi-Fi
010101001011
Aplicação
Transporte
Rede
Enlace
Físico
TLS
TLS
conexão estabelecida
client hello
(CIPHERS, URL)
Os primeiros milisegundos de uma conexão HTTPS
https://cc.dcsec.uni-hannover.de/
conexão estabelecida
Server hello
(certificado, CIPHER)
TLS_RSA_WITH_RC4_128_MD5
Criptografia
assimétrica
Criptografia
sim...
conexão estabelecida
Data válida?
CA confiável?
Assinatura válida?
URL esperada?
conexão estabelecida
conexão estabelecida
Gerei uma parada aqui
(pre_master secret)
!^*@#$&!@(#$&!@#)$^$^
TLS_RSA_WITH_RC4_128_MD5
conexão estabelecida
!!@U#$N!Y*@#$*
master secret
TLS_RSA_WITH_RC4_128_MD5
conexão estabelecida
É NÓIS!
TLS_RSA_WITH_RC4_128_MD5
criptografia
dos dados
verificação contra
conteúdo “batizado”
É NÓIS!
TLSHTTP HTTP
Internetheaders
cookies
params
URLs
sessions
form data
headers
cookies
params
URLs
sessions
form data
HTTP/HTTP2
chromium - net/http & net/spdy
Rafael Rinaldi
Dissecando o protocolo HTTP/2
HTTP 1x via telnet
$ telnet gurusp.org 80
Trying 173.233.93.210...
Connected to gurusp.org.
Escape character is '^]'.
GET ...
HTTP/HTTPS
TCP / UDP
IP
Ethernet / Wi-Fi
010101001011
Aplicação
Transporte
Rede
Enlace
Físico
Aplicação
Transporte
Rede
Enlace
Físico
papers/Vipin_Analysis_of_open_source_WLAN_driver_paper.pdf
➔ net/ipv4/tcp.c
➔ include/net/cfg80211.h
➔ net/wireless/nl8021...
Internetglibc
DNS
TCP/IP
UDP/IP
HTTP
POSIX
a/b/g/n/ac
glibc
DNS
TCP/IP
UDP/IP
HTTP
POSIX
Internet
# traceroute -T gurusp.org
traceroute to gurusp.org (173.233.93.210), 30 hops max, 60 byte packets
1 palantir (192.168.1.1...
Internet
Nginx conf file
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tm...
Internet
assets
TCP
http://12factor.net/port-binding
HTTP parsing
ragel vindo lá do velho mongrel*
*de acordo com o documento de design do unicorn
Internet
assets
TCP
Webserver -> Framework
baseado no PEP3333
Internet
TCP
assets
lib/rails/application.rb
Rack -> Rails
mais informações no post do timaro no omniref
É um Rack application
...
# Implements call according to the Rack API. It simply
# dispatches the request to the underlyin...
E um Rails::Engine
Todas as apps são Engines
mais informações no post do timaro no omniref
mais informações no post do timaro no omniref
Informações que vem do Rack
{"GATEWAY_INTERFACE"=>"CGI/1.1",
"PATH_INFO"=>"/...
mais informações no post do timaro no omniref
Passa por vários Rack middlewares
[
Rack::Sendfile,
ActionDispatch::Static, ...
ActionDispatch
::Journey::Router
a primeira parte do seu código a ser tocada
mais informações no post do timaro no omniref...
ActionDispatch::Routing
::RouteSet::Dispatcher
achando o controller via rotas
mais informações no post do timaro no omnire...
ActionController::Metal
prepara o request e manda processar
mais informações no post do timaro no omniref
def dispatch(nam...
AbstractController::Base
encaminha para o seu controller
mais informações no post do timaro no omniref
def process(action,...
Internet
TCP
MV
VM
C
assets
Internet
TCP
MV
VM
C
assets
Internet
TCP
MV
VM
C
assets
pega aí Rack -> [status, header, body]
mais informações no post do timaro no omniref
ActionDispatch
::Journey::Router
Internet
assets
TCP
MV
VM
C
Internet
TCP
MV
VM
C
assets
Internet
TCP
MV
VM
C
assets
Internet
TCP
MV
VM
C
assets
glibc
DNS
TCP/IP
UDP/IP
HTTP
POSIX
Internet
glibc
DNS
TCP/IP
UDP/IP
HTTP
POSIX
Internet
glibc
DNS
TCP/IP
UDP/IP
HTTP
POSIX
Internet
glibc
DNS
TCP/IP
UDP/IP
HTTP
POSIX
Internet
glibc
DNS
TCP/IP
UDP/IP
HTTP
POSIX
Internet
c-c-c-combo breaker
HTML
exemplos retirados do post “How browsers work”
algoritmo de parsing
implementado no webkit do chrome
HTML syntax error
<img src=”http://pothix.com/avatar.gif”> thread
<img src=”http://pothix.com/esperanto.png”> thread
<img src=”http://pothix...
<img src=”http://pothix.com/avatar.gif”> thread
<img src=”http://pothix.com/esperanto.png”> thread
<img src=”http://pothix...
exemplos retirados do post “How browsers work”
exemplos retirados do post “How browsers work”
Diego Eis: DOM, CSSOM e RenderThree - Introdução ao Browser Render Path
Resumindo
essa bagaça
glibc
MV
VM
C
Internet
Internet
Não acredite em mágica
entenda como funciona de verdade
ceeeeerto.
Perguntas?
Willian Molinari
@PotHix
pothix@pothix.com
Slides: http://cege.la/k8GNKr
TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end
TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end
TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end
TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end
TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end
TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end
TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end
TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end
TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end
TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end
Próxima SlideShare
Cargando en…5
×

TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end

36 visualizaciones

Publicado el

Sua aplicação ruby end to end

Publicado en: Educación
  • Sé el primero en comentar

TDC2017|SP - Trilha Ruby Sua aplicacao ruby end to end

  1. 1. Sua app Ruby end to end Willian Molinari (a.k.a PotHix)
  2. 2. Aviso
  3. 3. Willian Molinari a.k.a PotHix
  4. 4. Plaev.github.io
  5. 5. Motivação
  6. 6. Escrevi um livro! https://desconstruindoaweb.com.br 315 horas de pesquisa e dedicação 8 meses de duração de escrita 127 referências sabe aquelas famosas RFCs? Então...
  7. 7. Essa talk se baseia em
  8. 8. https://gurusp.org https://gurusp.org
  9. 9. https://gurusp.org https://gurusp.org
  10. 10. https://gurusp.org É uma URL? https://gurusp.org
  11. 11. “O que significa PotHix” “O que significa PotHix”
  12. 12. https://gurusp.org É uma URL! https://gurusp.org
  13. 13. https://gurusp.org https://gurusp.org Tem HSTS? Strict-Transport-Security
  14. 14. https://gurusp.org https://gurusp.org Tem HSTS? Strict-Transport-Security config.force_ssl = true
  15. 15. https://gurusp.org Tem cache? Expires Cache-Control https://gurusp.org ETag
  16. 16. Protocolo: https:// Domínio: gurusp.org Path: / Tem cache de DNS?
  17. 17. Sem cache
  18. 18. Com cache
  19. 19. Chrome Faz cache de DNS
  20. 20. http://aosabook.org/en/posa/high-performance-networking-in-chrome.html
  21. 21. getaddrinfo()
  22. 22. sistema operacional
  23. 23. glibc I’m watching you! n u
  24. 24. glibc -> /etc/hosts nss/nss_files/files-hosts.c
  25. 25. glibc -> getaddrinfo() sysdeps/posix/getaddrinfo.c 2321 getaddrinfo (const char *name, const char *service, 2322 const struct addrinfo *hints, struct addrinfo **pai) 2323 {
  26. 26. getaddrinfo() Tem nscd para cache de DNS?
  27. 27. Internet - glibc POSIX
  28. 28. Aplicação Apresentação Sessão Transporte Rede Enlace Físico Modelo OSI
  29. 29. Aplicação Apresentação Sessão Transporte Rede Enlace Físico Modelo OSI
  30. 30. S R L Y ?
  31. 31. Aplicação Transporte Rede Enlace Físico Sessão Apresentação
  32. 32. Aplicação Transporte Rede Enlace Físico
  33. 33. Aplicação Transporte Rede Enlace Físico SO user
  34. 34. TCP / UDP DNSAplicação Transporte Rede Enlace Físico IP Ethernet / Wi-Fi 010101001011
  35. 35. DNS TCP / UDP Aplicação Transporte Rede Enlace Físico IP Ethernet / Wi-Fi 010101001011
  36. 36. código disponível em: chromium/src/net/dns
  37. 37. getaddrinfo() __socket() & __connect() sysdeps/posix/getaddrinfo.c 2515 fd = __socket (af, SOCK_DGRAM, IPPROTO_IP); [...] 2526 [...] && __connect (fd, q->ai_addr, q->ai_addrlen) == 0
  38. 38. terminal $ sudo strace -f -e socket,connect -p $(ps aux | grep chromium | grep -v nacl | awk '{ print $2}' | xargs echo | sed 's/ /,/g') [...] [pid 8739] socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 134 [pid 8739] connect(134, {sa_family=AF_INET6, sin6_port=htons(53), inet_pton(AF_INET6, "2001:4860:4860::8888", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 ENETUNREACH (Network is unreachable) [pid 9010] socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 134 [pid 9010] connect(134, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("8.8.8.8")}, 16) = 0 [pid 8739] socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 134 [pid 8739] connect(134, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("173.233.93.210")}, 16) = -1 EINPROGRESS (Operation now in progress) [...] Syscalls in action! (*stripped)
  39. 39. terminal request UDP ipv4 $ sudo strace -f -e socket,connect -p $(ps aux | grep chromium | grep -v nacl | awk '{ print $2}' | xargs echo | sed 's/ /,/g') [...] [pid 8739] socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 134 [pid 8739] connect(134, {sa_family=AF_INET6, sin6_port=htons(53), inet_pton(AF_INET6, "2001:4860:4860::8888", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 ENETUNREACH (Network is unreachable) [pid 9010] socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 134 [pid 9010] connect(134, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("8.8.8.8")}, 16) = 0 [pid 8739] socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 134 [pid 8739] connect(134, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("173.233.93.210")}, 16) = -1 EINPROGRESS (Operation now in progress) [...] Syscalls in action! (*stripped) UDP para ipv6 nope :(
  40. 40. Happy eyebals (rfc6555): https://www.ietf.org/mail-archive/web/v6ops/current/msg22455.html
  41. 41. AAAA A Browser sitev6 sitev4 Happy eyeballs de acordo com a rfc6555
  42. 42. AAAA A Browser sitev6 sitev4 Happy eyeballs de acordo com a rfc6555
  43. 43. AAAA A Browser sitev6 sitev4RST Happy eyeballs de acordo com a rfc6555
  44. 44. DNSAplicação Transporte Rede Enlace Físico TCP / UDP IP Ethernet / Wi-Fi 010101001011
  45. 45. UDP/IP linux/blob/master/net/ipv4/udp.c
  46. 46. UDP
  47. 47. Conteúdo
  48. 48. Endereço (IP)
  49. 49. ?
  50. 50. DNSAplicação Transporte Rede Enlace Físico TCP / UDP IP Ethernet / Wi-Fi 010101001011
  51. 51. DNSAplicação Transporte Rede Enlace Físico TCP / UDP IP Mágica, bro!
  52. 52. A visual explanation of how dns lookups work
  53. 53. Via dnstracer: `dnstracer -s . -4 -o -c gurusp.org` A.ROOT-SERVERS.NET [.] (198.41.0.4) d0.org.afilias-nst.org [org] (199.19.57.1) ns2ckr.name.com [gurusp.org] (98.124.246.1) Got authoritative answer ns3fqs.name.com (98.124.246.2) gurusp.org -> 173.233.93.210 ns1dhl.name.com (184.172.60.181) gurusp.org -> 173.233.93.210 ns2ckr.name.com (98.124.246.1) gurusp.org -> 173.233.93.210
  54. 54. Internet glibc DNS TCP/IP UDP/IP POSIX
  55. 55. Internet glibc DNS TCP/IP UDP/IP POSIX HTTP
  56. 56. HTTP/HTTPS TCP / UDP IP Ethernet / Wi-Fi 010101001011 Aplicação Transporte Rede Enlace Físico
  57. 57. HTTP/HTTPS TCP / UDP IP Ethernet / Wi-Fi 010101001011 Aplicação Transporte Rede Enlace Físico
  58. 58. TCP linux/blob/master/net/ipv4/tcp.c
  59. 59. https://en.wikipedia.org/wiki/Transmission_Control_Protocol
  60. 60. Three-way handshake Estabelecendo uma conexão
  61. 61. LISTENINGSYN LISTENSYNSENT
  62. 62. SYN+ACK LISTEN SYN RECEIVED SYNSENT
  63. 63. SYN RECEIVED SYNSENTESTABLISHED ACK
  64. 64. ESTABLISHEDSYNSENTESTABLISHED É NÓIS! É NÓIS!
  65. 65. HTTP/HTTPS TCP / UDP IP Ethernet / Wi-Fi 010101001011 Aplicação Transporte Rede Enlace Físico
  66. 66. HTTPS
  67. 67. TLS = fork(SSLv3) SSLv3 is no longer supported in chrome
  68. 68. HTTP/HTTPS TCP / UDP IP Ethernet / Wi-Fi 010101001011 Aplicação Transporte Rede Enlace Físico TLS
  69. 69. TLS
  70. 70. conexão estabelecida client hello (CIPHERS, URL) Os primeiros milisegundos de uma conexão HTTPS
  71. 71. https://cc.dcsec.uni-hannover.de/
  72. 72. conexão estabelecida Server hello (certificado, CIPHER) TLS_RSA_WITH_RC4_128_MD5 Criptografia assimétrica Criptografia simétrica hash
  73. 73. conexão estabelecida Data válida? CA confiável? Assinatura válida? URL esperada?
  74. 74. conexão estabelecida
  75. 75. conexão estabelecida Gerei uma parada aqui (pre_master secret) !^*@#$&!@(#$&!@#)$^$^ TLS_RSA_WITH_RC4_128_MD5
  76. 76. conexão estabelecida !!@U#$N!Y*@#$* master secret TLS_RSA_WITH_RC4_128_MD5
  77. 77. conexão estabelecida É NÓIS! TLS_RSA_WITH_RC4_128_MD5 criptografia dos dados verificação contra conteúdo “batizado” É NÓIS!
  78. 78. TLSHTTP HTTP Internetheaders cookies params URLs sessions form data headers cookies params URLs sessions form data
  79. 79. HTTP/HTTP2 chromium - net/http & net/spdy
  80. 80. Rafael Rinaldi Dissecando o protocolo HTTP/2
  81. 81. HTTP 1x via telnet $ telnet gurusp.org 80 Trying 173.233.93.210... Connected to gurusp.org. Escape character is '^]'. GET / HTTP/1.1 HOST: gurusp.org HTTP/1.1 301 Moved Permanently Location: https://gurusp.org/ terminal
  82. 82. HTTP/HTTPS TCP / UDP IP Ethernet / Wi-Fi 010101001011 Aplicação Transporte Rede Enlace Físico
  83. 83. Aplicação Transporte Rede Enlace Físico
  84. 84. papers/Vipin_Analysis_of_open_source_WLAN_driver_paper.pdf ➔ net/ipv4/tcp.c ➔ include/net/cfg80211.h ➔ net/wireless/nl80211.c ➔ include/net/mac80211.h ➔ drivers/net/wireless/iwlwifi/
  85. 85. Internetglibc DNS TCP/IP UDP/IP HTTP POSIX
  86. 86. a/b/g/n/ac
  87. 87. glibc DNS TCP/IP UDP/IP HTTP POSIX Internet
  88. 88. # traceroute -T gurusp.org traceroute to gurusp.org (173.233.93.210), 30 hops max, 60 byte packets 1 palantir (192.168.1.1) 5.698 ms 5.697 ms 5.697 ms 2 10.14.128.1 (10.14.128.1) 458.092 ms 458.104 ms 462.246 ms 3 200.189.80.1 (200.189.80.1) 462.984 ms 462.986 ms 462.985 ms 4 embratel-T0-1-0-0-uacc02.spo.embratel.net.br (200.231.241.9) 465.114 ms embratel-T0-3-1-0-tacc01.spo.embratel.net.br (189.86.58.29) 469.047 ms embratel-T0-0-1-3-uacc01.spolp.embratel.net.br (200.178.80.13) 469.027 ms 5 ebt-T0-3-0-1-tcore01.spo.embratel.net.br (200.230.158.54) 587.308 ms ebt-H0-1-0-0-tcore01.spomb.embratel.net.br (200.244.212.75) 470.475 ms ebt-T0-3-0-1-tcore01.spo.embratel.net.br (200.230.158.54) 587.323 ms 6 ebt-B11151-intl01.atl.embratel.net.br (200.230.230.32) 590.492 ms ebt-B10851-intl01.atl.embratel.net.br (200.230.230.36) 584.693 ms ebt-B11151-intl01.atl.embratel.net.br (200.230.230.32) 584.711 ms 7 hu0-9-0-1.ccr41.atl04.atlas.cogentco.com (38.88.194.105) 581.785 ms 605.417 ms 607.792 ms 8 be2848.ccr42.atl01.atlas.cogentco.com (154.54.6.117) 603.762 ms 604.337 ms 604.350 ms 9 be2113.ccr42.dca01.atlas.cogentco.com (154.54.24.221) 613.834 ms 611.769 ms 601.983 ms 10 be2807.ccr42.jfk02.atlas.cogentco.com (154.54.40.109) 602.241 ms 604.763 ms 604.756 ms 11 be2916.ccr22.alb02.atlas.cogentco.com (154.54.41.61) 607.982 ms 612.526 ms 612.805 ms 12 xe-2-3-0.edge1.ny01.as40244.net (38.104.52.90) 701.213 ms 701.161 ms 700.555 ms 13 xe-1-0-1.core123.ny01.as40244.net (66.206.33.196) 612.066 ms 611.781 ms 618.261 ms 14 173-233-93-210.static.as40244.net (173.233.93.210) 618.297 ms 618.291 ms 618.248 ms TCP meu router Backbone Congent Hospedagem backbone embratel NET Rede interna do provedor router condomínio
  89. 89. Internet
  90. 90. Nginx conf file upstream backend { server backend1.example.com weight=5; server backend2.example.com:8080; server unix:/tmp/backend3; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup; } ... http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server TCP Unix Socket
  91. 91. Internet assets TCP http://12factor.net/port-binding
  92. 92. HTTP parsing ragel vindo lá do velho mongrel* *de acordo com o documento de design do unicorn
  93. 93. Internet assets TCP
  94. 94. Webserver -> Framework baseado no PEP3333
  95. 95. Internet TCP assets
  96. 96. lib/rails/application.rb Rack -> Rails mais informações no post do timaro no omniref
  97. 97. É um Rack application ... # Implements call according to the Rack API. It simply # dispatches the request to the underlying middleware stack. def call(env) env["ORIGINAL_FULLPATH"] = build_original_fullpath(env) env["ORIGINAL_SCRIPT_NAME"] = env["SCRIPT_NAME"] super(env) end ...
  98. 98. E um Rails::Engine Todas as apps são Engines mais informações no post do timaro no omniref
  99. 99. mais informações no post do timaro no omniref Informações que vem do Rack {"GATEWAY_INTERFACE"=>"CGI/1.1", "PATH_INFO"=>"/", "QUERY_STRING"=>"", "REMOTE_ADDR"=>"127.0.0.1", "REMOTE_HOST"=>"localhost.localdomain", "REQUEST_METHOD"=>"GET", "REQUEST_URI"=>"http://localhost:9292/favicon.ico" , "SCRIPT_NAME"=>"", "SERVER_NAME"=>"localhost", "SERVER_PORT"=>"9292", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/2.2.3/2015-08-18)", "HTTP_HOST"=>"localhost:9292", "HTTP_CONNECTION"=>"keep-alive", "HTTP_USER_AGENT"=>"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36", "HTTP_ACCEPT"=>"*/*", "HTTP_REFERER"=>"http://localhost:9292/", "HTTP_ACCEPT_ENCODING"=>"gzip, deflate, sdch", "HTTP_ACCEPT_LANGUAGE"=>"en-US,en;q=0.8,pt-BR;q=0. 6,pt;q=0.4,es;q=0.2,eo;q=0.2", "rack.version"=>[1, 2], "rack.multithread"=>true, "rack.multiprocess"=>false, "rack.run_once"=>false, "rack.url_scheme"=>"http", "HTTP_VERSION"=>"HTTP/1.1", "REQUEST_PATH"=>"/favicon.ico"}
  100. 100. mais informações no post do timaro no omniref Passa por vários Rack middlewares [ Rack::Sendfile, ActionDispatch::Static, Rack::Lock, #<ActiveSupport::Cache::Strategy::LocalCache::Midd leware:0x000000028fa168>, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, Rails::Rack::Logger, ActionDispatch::ShowExceptions, WebConsole::Middleware, ActionDispatch::DebugExceptions, ActionDispatch::RemoteIp, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActiveRecord::ConnectionAdapters::ConnectionManage ment, ActiveRecord::QueryCache, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, Rack::Head, Rack::ConditionalGet, Rack::ETag ]
  101. 101. ActionDispatch ::Journey::Router a primeira parte do seu código a ser tocada mais informações no post do timaro no omniref req.path_parameters => {:controller=>"pages", :action=>"index"}
  102. 102. ActionDispatch::Routing ::RouteSet::Dispatcher achando o controller via rotas mais informações no post do timaro no omniref ActiveSupport::Dependencies.constantize("#{params[:controller].camelize}Controller") => PagesController
  103. 103. ActionController::Metal prepara o request e manda processar mais informações no post do timaro no omniref def dispatch(name, request) #:nodoc: [...] process(name)
  104. 104. AbstractController::Base encaminha para o seu controller mais informações no post do timaro no omniref def process(action, *args) [...] process_action(action_name, *args) # que no fim é só um `send`
  105. 105. Internet TCP MV VM C assets
  106. 106. Internet TCP MV VM C assets
  107. 107. Internet TCP MV VM C assets
  108. 108. pega aí Rack -> [status, header, body] mais informações no post do timaro no omniref ActionDispatch ::Journey::Router
  109. 109. Internet assets TCP MV VM C
  110. 110. Internet TCP MV VM C assets
  111. 111. Internet TCP MV VM C assets
  112. 112. Internet TCP MV VM C assets
  113. 113. glibc DNS TCP/IP UDP/IP HTTP POSIX Internet
  114. 114. glibc DNS TCP/IP UDP/IP HTTP POSIX Internet
  115. 115. glibc DNS TCP/IP UDP/IP HTTP POSIX Internet
  116. 116. glibc DNS TCP/IP UDP/IP HTTP POSIX Internet
  117. 117. glibc DNS TCP/IP UDP/IP HTTP POSIX Internet c-c-c-combo breaker
  118. 118. HTML
  119. 119. exemplos retirados do post “How browsers work” algoritmo de parsing implementado no webkit do chrome
  120. 120. HTML syntax error
  121. 121. <img src=”http://pothix.com/avatar.gif”> thread <img src=”http://pothix.com/esperanto.png”> thread <img src=”http://pothix.com/fotodasferias.scr”> thread <script src=”http://pothix.com/marotagem.js”> sincrono <link href=”http://pothix.com/estiloso.css”> thread <script src=”http://pothix.com/javaescrito.js”> sincrono <img src=”http://pothix.com/fotodasferias.jpg”>
  122. 122. <img src=”http://pothix.com/avatar.gif”> thread <img src=”http://pothix.com/esperanto.png”> thread <img src=”http://pothix.com/fotodasferias.scr”> <script src=”http://pothix.com/marotagem.js”> sincrono <img src=”http://pothix.com/fotodasferias.jpg”> <link href=”http://pothix.com/estiloso.css”> thread <script src=”http://pothix.com/javaescrito.js”> sincrono thread
  123. 123. exemplos retirados do post “How browsers work”
  124. 124. exemplos retirados do post “How browsers work”
  125. 125. Diego Eis: DOM, CSSOM e RenderThree - Introdução ao Browser Render Path
  126. 126. Resumindo essa bagaça
  127. 127. glibc MV VM C Internet Internet
  128. 128. Não acredite em mágica entenda como funciona de verdade ceeeeerto.
  129. 129. Perguntas? Willian Molinari @PotHix pothix@pothix.com Slides: http://cege.la/k8GNKr

×