sequenceDiagram
Client->>Http: Send Request to connect
alt Connection Accepted
Http->>Client: Accept Connection
Http->>Http: Add fd to epoll
else Connection Refused
Http->>Client: Refuse Connection
end
Client->>Http: Send HTTP Request
Http->>Http: recv Parser Request
alt Error on Parser
Http->>Http: Set Parser with <br>flag error
Http->>Server: send request
Server->>Route: send request
Route->>Server: 400 Bad Request
else Parser is Correct
Http->>Server: send request
Server->>Route: send request
alt Http Version is Not 1.1
Route->>Server: 505 HTTP Version Not Supported
else Method Not Implemented
Route->>Server: 501 Not Implemented
else Not allow method
Route->>Server: 405 Method Not Allowed
else Without Content-Length
Route->>Server: 411 Length Required
else Too larger URI
Route->>Server: 414 URI Too Long
else As Redirect
Route->>Server: 308 Permanent Redirect
else Call Methods
alt Call Get
Route->>Server: Process and Response
else Call Post
Route->>Server: Process and Response
else Call Delete
Route->>Server: Process and Response
end
end
end
Server->>Http: return response
Http->>Http : Add fd In EpollOUT mode
alt Is CGI
Http-->>Http: Process CGI
Http-->>Http: Check if the exist and try again
end
Http->>Client: return response
alt Is status 100
Http->>Http: keep client open
Http->>Http : Add fd In EpollIN mode
else
Http->>Http: Close connection <br>and remove from epoll
end
sequenceDiagram
Server->>Route: Send Request
alt AsBody
Route->>Server: 400 Bad request
else Path don't Exist
Route->>Server: 404 Not Found
else
alt Read/Execute Permission and is a directory
alt Without Slash in the end
Route->>Server: 307 Temporary Redirect
else Has a Valid Index
Route->>Server: 307 Temporary redirect
else Autoindex is On
Route->>Server: 200 OK
end
else Read/Execute Permission and CGI
Route->>Route: Execute Children Process
Route->>Server: Is CGI
else Read/Execute Permission and is a Normal File
alt As Content
Route->>Server: 200 OK
else
Route->>Server: 204 No Content
end
else Without Read Or Execute Permission
Route->>Server: 403 Forbidden
end
end
sequenceDiagram
Server->>Route: Send Request
alt Payload Too Large
Route->>Server: 413 Payload Too Large
else Path don't Exist
Route->>Server: 404 Not Found
else Write/Execute Permission and is A Directory
Route->Route: Delete Directory
Route->>Server: 200 OK
else Write/Excute Permission
Route->Route: Delete File
Route->>Server: 200 OK
else Without Write/Excute Permission
Route->>Server: 403 Forbidden
end
sequenceDiagram
Server->>Route: Send Request
alt Payload Too Large
Route->>Server: 413 Payload Too Large
else Path don't Exist
Route->>Server: 404 Not Found
else
alt Read/Execute Permission and is a directory
alt Without Slash in the end
Route->>Server: 307 Temporary Redirect
else Has a Valid Index
Route->>Server: 307 Temporary redirect
else
Route->>Server: 404 Not Found
end
else Read/Execute Permission and CGI
alt Has Expect Header
Route->>Server: 100 Continue
else
Route->>Route: Execute Children Process
Route->>Server: Is CGI
end
else Read/Execute Permission and is a Normal File
alt As Content
Route->>Server: 200 OK
else
Route->>Server: 204 No Content
end
else Without Read Or Execute Permission
Route->>Server: 403 Forbidden
end
end
408 Request Timeout 502 Bad Gateway: O servidor atuando como um gateway ou proxy recebeu uma resposta inválida do servidor upstream.
server_name:
Será o nome DNS dado para o ip.
- pode receber um ou mais nomes que terão como destino esse server.
- Se não por informando um server name padrão é atribuido.
server {
server_name domain.com www.domain.com
}
listen:
Listen recebe dois parametros, IP:PORT, um ip default assume se o IP não for especificado.
server {
listen 192.168.1.100:8081
}
server {
listen 8082; # Sem especificar IP.
}
error_page:
define uma paǵina de erro padrão para o server ou para a location.
- Pode receber um ou mais códigos de erros que fazer referência a um arquivo a ser retornado.
server {
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location /home {
error_page 404 /home/errors/home-404.html;
}
}
- Caso o acesso seja realizado em
/
o 404.html será retornado. - Caso o acesso seja realizado em
/home
o home-404.html será retornado.
client_max_body_size:
Define o tamanho maximo do body de request do client e recebe como paramento o valor e uma letra com a unidade de medida.
K
para Kilo bytes.M
para Mega bytes.G
para Giga bytes.
server {
location /app/crash-limit-m {
client_max_body_size 2M;
}
location /app/crash-limit-g {
client_max_body_size 1G;
}
location /app/crash-limit-k {
client_max_body_size 2K;
}
}
allow_methods:
descreve os metodos permitidos.
- recebe uma lista com os metodos.
server {
allow_methods GET;
location /images {
allow_methods GET POST DELETE;
}
}
rewrite:
redireciona para outro location.
- pode ser definido em server, nesse caso os paramentros são <caminho atual, caminho desejado>
- pode ser definido em location, nesse caso o parametro é o caminho desejado.
server {
rewrite /jogo /games;
location /img {
rewrite /images;
}
location /jogo {
}
location /games {
}
}
root:
define o diretorio que será o root da aplicação.
- recebe como parametro o caminho partindo da raiz do sistema.
- pode ser definido no server e em location.
server {
root /app/
location /images {
/images
}
}
autoindex:
Permite a exibição dos arquivos de um diretorio caso nenhum arquivo de index seja encontrato.
- recebe como paramentro
on
ouoff
. - por padrão vem como
off
. - pode ser definido no server ou em location especificas.
server {
autoindex on;
location /home {
autoindex off;
}
location / {
}
}
index:
Define uma lista de arquivos que podem ser devolvidos caso o caminho seja uma pasta.
- recebe como paramentro uma lista de nomes.
server {
index index.html index.htm default.html;
}
strerror:
gai_strerror:
socketpair:
Usados para converter a ordem dos bytes. (pg 17 Beej's Guide to Network Programming)
htons:
host to network short (uint32_t)
htonl:
host to network long (uint16_t)
ntohs:
network to host short (uint32_t)
ntohl:
network to host long (uint16_t)
Básicamente usado para converter a ordem dos bytes de forma que a estrutura do seu processador possa compreender.
select, poll and epoll:
epoll_create:
epoll_ctl:
epoll_wait:
kqueue:
kevent:
A seções a seguir definem uma ordem de chamdas para um conexão.
Pesquisar no DNS por nome de host - (www.example.com)
getaddrinfo:
Traduz um nome de host (www.google.com) para um ip. Responde com uma struct addrinfo.
int getaddrinfo(const char *node, // Ex. "www.example.com" ou IP
const char *service, // Ex. "http" ou número da porta
const struct addrinfo *hints, // estrutura com informações esperadas do resultado.
struct addrinfo **res // ponteiro para armazena o resultados da função.
);
freeaddrinfo:
Limpa a estrutra de resposta.
struct addrinfo {
int ai_flags; // AI_PASSIVE, AI_CANONNAME, etc.
int ai_family; // AF_INET, AF_INET6, AF_UNSPEC
int ai_socktype; // SOCK_STREAM, SOCK_DGRAM
int ai_protocol; // use 0 para "qualquer"
size_t ai_addrlen; // tamanho de ai_addr em bytes
struct sockaddr *ai_addr; // struct sockaddr_in ou _in6
char *ai_canonname; // nome de host canônico e completo
struct addrinfo *ai_next; // Príximo addrinfo da lista
};
AF_INET:
Força o uso de ipv4.
AF_INET6:
Força o uso de ipv6.
AF_UNSPEC:
Tanto ipv4 quanto ipv6.
SOCK_STREAM:
Implementa o protocolo TCP ( Transmission Control Protocol).
SOCK_DGRAM:
Implementa o protocolo UDP (User Datagram protocol).
struct sockaddr {
unsigned short sa_family; // familia de endereços. (ipv4 | ipv6)
char sa_data[14]; // 14 bytes de endereço do protocolo.
};
struct sockaddr_in {
short int sin_family; // Família de endereços, AF_INET
unsigned short int sin_port; // Número de Porta
struct in_addr sin_addr; // Endereço Internet
unsigned char sin_zero[8]; // Mesmo tamanho que struct sockaddr
};
socket:
retorna um arquivo socket. Similar ao open
e tem a mesma função de abrir um arquivo de I/O.
Exemplo de chamada:
struct protoent ent;
ent = getprotobyname("TCP");
int fd = socket(PF_INET, SOCK_STREAM, ent.p_proto)
Essa familia define a ai-family como PF_INET, o tipo do protocolo e TCP e passa o numero do protocolo TCP.
bind:
Tem a função de relacionar uma struct sockaddr com uma porta do sistema.
struct addrinfo hints, *res;
int sockfd;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC; // tanto faz ser IPv4 ou IPv6
hints.ai_socktype = SOCK_STREAM; // use TCP
hints.ai_flags = AI_CANONNAME; // retorna o nome do host.
getaddrinfo("192.168.0.200", "8080", &hints, &res);
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
bind(sockfd, res->ai_addr, res->ai_addrlen);
Nesse caso teremos um vinculo do socket criando com a porta 8080 do ip 192.168.0.200.
connect:
Estabelece uma vinculo de conecxao com o socket especificado.
listen:
accept:
send:
recv:
chdir bind:
setsockopt:
getsockname:
getprotobyname:
retonar uma struct protoent que ccontém informações do protocolo da chamada. (pg 31 Beej's Guide to Network Programming)
getprotobyname("TCP"); // traz informações do protocolo TCP.
getprotobyname("UDP"); // traz informações do protocolo UDP.
struct protoent {
char *p_name; // nome oficial do protocolo.
char **p_aliases; // lista com alias do protocolo.
int P_proto; // Numero do protocolo.
}
access:
fcntl:
stat:
opendir:
readdir:
closedir:
- Google C++ Style Guide
- GoogleTest
- Beej's Guide to Network Programming
- Internet Protocol
- Transmission Control Protocol
- User Datagram protocol
- Guide to network concepts
- Address Allocation for Private Internets
- CGI RFC 3875
- Unique Local IPv6 Unicast Addresses
- Protocolo HTTP
- Overview of webserver
- I/O Multiplexing
sequenceDiagram
Client Request->>Server: Envio de request CGI
Server->>Server: Deve passar pelo epoll Le a string de request
Server->>CGI: Passa o request para o CGI
CGI->>Processo: Abrir um processo e passar envp
CGI->>CGI: Gera dois sockets novos para o epoll
Processo->>Server: sv[0] para que o Server Leia.
Server->>Server: Deve passar pelo epoll
Server->>Client Request: Responde o cliente