TIL (Today I Learned)/Network
[Network] HTTP/2 μ§μμ¬λΆ νλ¨ Cλ‘ κ΅¬ν
loki d
2021. 9. 13. 16:39
728x90
HTTP/2 check ν΄μ£Όλ Cλ‘ κ΅¬ν
HTTP Request Header
HTTP Status Code
1xx
- 100 Continue
μ§ν μ€μμ μλ―Ένλ μλ΅μ½λμ λλ€. νμ¬κΉμ§μ μ§νμνμ λ¬Έμ κ° μμΌλ©°, ν΄λΌμ΄μΈνΈκ° κ³μν΄μ μμ²μ νκ±°λ μ΄λ―Έ μμ²μ μλ£ν κ²½μ°μλ 무μν΄λ λλ κ²μ μλ €μ€λλ€. - 101 Switching Protocol
101μ ν΄λΌμ΄μΈνΈμ μν΄ λ³΄λΈ μ κ·Έλ μ΄λ μμ² ν€λμ λν μλ΅μΌλ‘ 보λ΄μ§λλ€. μ΄ μλ΅ μ½λλ ν΄λΌμ΄μΈνΈκ° λ³΄λΈ Upgrade μμ² ν€λμ λν μλ΅μ λ€μ΄κ°λ©°, μλ²μμ νλ‘ν μ½μ λ³κ²½ν κ²μμ μλ €μ€λλ€. ν΄λΉ μ½λλ Websocket νλ‘ν μ½ μ ν μμ μ¬μ©λ©λλ€. - 102 Processing(WebDAV)
μ΄ μλ΅ μ½λλ μλ²κ° μμ²μ μμ νμμΌλ©° μ΄λ₯Ό μ²λ¦¬νκ³ μμ§λ§, μμ§ μ λλ‘ λ μλ΅μ μλ €μ€ μ μμμ μλ €μ€λλ€.
2xx
- 200 OK
μμ²μ΄ μ±κ³΅μ μΌλ‘ λμμ΅λλ€. μ 보λ μμ²μ λ°λ₯Έ μλ΅μΌλ‘ λ°νλ©λλ€. - 201 Created
μμ²μ΄ μ±κ³΅μ μ΄μμΌλ©° κ·Έ κ²°κ³Όλ‘ μλ‘μ΄ λ¦¬μμ€κ° μμ±λμμ΅λλ€. μ΄ μλ΅μ μΌλ°μ μΌλ‘ POST μμ² λλ μΌλΆ PUT μμ² μ΄νμ λ°λΌμ΅λλ€. - 202 Accepted
μμ²μ μμ νμμ§λ§, κ·Έμ μνμ¬ νλν μ μμ΅λλ€. μ΄ μλ΅μ μμ² μ²λ¦¬μ λν κ²°κ³Όλ₯Ό μ΄νμ HTTPλ‘ λΉλκΈ° μλ΅μ 보λ΄λ κ²μ λν΄μ λͺ ννκ² λͺ μνμ§ μμ΅λλ€. μ΄κ²μ λ€λ₯Έ νλ‘μΈμ€μμ μ²λ¦¬ λλ μλ²κ° μμ²μ λ€λ£¨κ³ μκ±°λ λ°°μΉ νλ‘μΈμ€λ₯Ό νκ³ μλ κ²½μ°λ₯Ό μν΄ λ§λ€μ΄μ‘μ΅λλ€.
3xx
- 300 Multiple Choices
μ΅λ λ€μ― κ°μ λ§ν¬λ₯Ό 골λΌμ μ΄λν μ μλ μν - 301 Moved Permanently
μ΄ μλ΅ μ½λλ μμ²ν 리μμ€μ URIκ° λ³κ²½λμμμ μλ―Έν©λλ€. μλ‘μ΄ URIκ° μλ΅μμ μλ§λ μ£Όμ΄μ§ μ μμ΅λλ€. - 302 Found
μ΄ μλ΅ μ½λλ μμ²ν 리μμ€μ URIκ° μΌμμ μΌλ‘ λ³κ²½λμμμ μλ―Έν©λλ€. μλ‘κ² λ³κ²½λ URIλ λμ€μ λ§λ€μ΄μ§ μ μμ΅λλ€. κ·Έλ¬λ―λ‘, ν΄λΌμ΄μΈνΈλ ν₯νμ μμ²λ λ°λμ λμΌν URIλ‘ ν΄μΌν©λλ€. - 303 See Other
ν΄λΌμ΄μΈνΈκ° μμ²ν 리μμ€λ₯Ό λ€λ₯Έ URIμμ GET μμ²μ ν΅ν΄ μ»μ΄μΌ ν λ, μλ²κ° ν΄λΌμ΄μΈνΈλ‘ μ§μ 보λ΄λ μλ΅μ λλ€. - 304 Not Modified
μ΄κ²μ μΊμλ₯Ό λͺ©μ μΌλ‘ μ¬μ©λ©λλ€. μ΄κ²μ ν΄λΌμ΄μΈνΈμκ² μλ΅μ΄ μμ λμ§ μμμμ μλ €μ£Όλ©°, κ·Έλ¬λ―λ‘ ν΄λΌμ΄μΈνΈλ κ³μν΄μ μλ΅μ μΊμλ λ²μ μ μ¬μ©ν μ μμ΅λλ€. - 305 Use Proxy
μ΄μ λ²μ μ HTTP κΈ°μ μ¬μμμ μ μλμμΌλ©°, μμ²ν μλ΅μ λ°λμ νλ‘μλ₯Ό ν΅ν΄μ μ μν΄μΌ νλ κ²μ μλ €μ€λλ€. μ΄κ²μ νλ‘μμ in-bandμ€μ μ λν 보μμμ κ±±μ μΌλ‘ μΈνμ¬ μ¬λΌμ Έκ°κ³ μμ΅λλ€.
4xx
- 400 Bad Request
μλ΅μ μλͺ»λ λ¬Έλ²μΌλ‘ μΈνμ¬ μλ²κ° μμ²νμ¬ μ΄ν΄ν μ μμμ μλ―Έν©λλ€. - 401 Unauthorized
λΉλ‘ HTTP νμ€μμλ 'λ―ΈμΉμΈ(unauthorized)'λ₯Ό λͺ νν νκ³ μμ§λ§, μλ―Έμ μ΄ μλ΅μ 'λΉμΈμ¦(unauthenticated)'λ₯Ό μλ―Έν©λλ€. ν΄λΌμ΄μΈνΈλ μμ²ν μλ΅μ λ°κΈ° μν΄μλ λ°λμ μ€μ€λ‘λ₯Ό μΈμ¦ν΄μΌ ν©λλ€. - 402
μ΄ μλ΅ μ½λλ λμ€μ μ¬μ©λ κ²μ λλΉν΄ μμ½λμμ΅λλ€. 첫 λͺ©νλ‘λ λμ§νΈ κ²°μ μμ€ν μ μ¬μ©νκΈ° μνμ¬ λ§λ€μ΄μ‘μ§λ§ μ§κΈ μ¬μ©λκ³ μμ§λ μμ΅λλ€. - 403 Forbidden
ν΄λΌμ΄μΈνΈλ μ½ν μΈ μ μ κ·Όν κΆλ¦¬λ₯Ό κ°μ§κ³ μμ§ μμ΅λλ€. μλ₯Ό λ€μ΄, κ·Έλ€μ λ―ΈμΉμΈμ΄μ΄μ μλ²λ κ±°μ μ μν μ μ ν μλ΅μ 보λ λλ€. 401κ³Ό λ€λ₯Έ μ μ μλ²κ° ν΄λΌμ΄μΈνΈκ° λꡬμΈμ§ μκ³ μμ΅λλ€. - 404 Not Found
μλ²λ μμ²λ°μ 리μμ€λ₯Ό μ°Ύμ μ μμ΅λλ€. λΈλΌμ°μ μμλ μλ €μ§μ§ μμ URLμ μλ―Έν©λλ€. μ΄κ²μ APIμμ μ’ μ μ μ μ νμ§λ§ 리μμ€ μ체λ μ‘΄μ¬νμ§ μμμ μλ―Έν μ μμ΅λλ€. μλ²λ€μ μΈμ¦λ°μ§ μμ ν΄λΌμ΄μΈνΈλ‘λΆν° 리μμ€λ₯Ό μ¨κΈ°κΈ° μνμ¬ μ΄ μλ΅μ 403 λμ μ μ μ‘ν μλ μμ΅λλ€. μ΄ μλ΅ μ½λλ μΉμμ λ°λ³΅μ μΌλ‘ λ°μνκΈ° λλ¬Έμ κ°μ₯ μ λͺ ν μ§λ λͺ¨λ¦ λλ€.
5xx
- 500 Internal Server Error
μΉ μ¬μ΄νΈ μλ²μ λ¬Έμ κ° μμμ μλ―Ένμ§λ§ μλ²λ μ νν λ¬Έμ μ λν΄ λ ꡬ체μ μΌλ‘ μ€λͺ ν μ μμ΅λλ€. - 501 Not Implemented
μλ²κ° μμ²μ μ΄ννλ λ° νμν κΈ°λ₯μ μ§μνμ§ μμμ λνλ λλ€. - 502 Bad Gateway
μλ²κ° κ²μ΄νΈμ¨μ΄λ‘λΆν° μλͺ»λ μλ΅μ μμ νμμ μλ―Έν©λλ€. μΈν°λ·μμ μλ²κ° λ€λ₯Έ μλ²λ‘λΆν° μ ν¨νμ§ μμ μλ΅μ λ°μ κ²½μ° λ°μν©λλ€.μ²μ μλ
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
char buffer[BUFSIZ];
int main(int argc, char *argv[]){
int status;
struct addrinfo hints;
struct addrinfo *servinfo, *tmp; // κ²°κ³Όλ₯Ό μ μ₯ν λ³μ
char host[256];
int c_socket;
struct sockaddr_in c_addr;
int len;
char rcvBuffer[BUFSIZ];
int n;
c_socket = socket(PF_INET, SOCK_STREAM, 0);
memset(&hints, 0, sizeof(hints)); // hints ꡬ쑰체μ λͺ¨λ κ°μ 0μΌλ‘ μ΄κΈ°ν
hints.ai_family = AF_UNSPEC; // IPv4 IPv6 μκ΄μμ΄ κ²°κ³Ό λͺ¨λ λ°ν
hints.ai_socktype = SOCK_STREAM; // TCP stream sockets
if(argc ==1){
printf("Enter Domain\n ");
return -1;
}
status = getaddrinfo(argv[1], "80", &hints, &servinfo);
tmp = servinfo;
getnameinfo(tmp->ai_addr, tmp->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
sprintf(buffer, "GET / HTTP/1.1\r\nHost: %s\r\nConnection: %s\r\nUpgrade: %s\r\nHTTP2-Settings: %s\r\n\r\n", argv[1], "Upgrade, HTTP2-Settings", "h2c", "<base64url encoding of HTTP/2 SETTINGS payload>");
memset(&c_addr, 0, sizeof(c_addr));
c_addr.sin_addr.s_addr = inet_addr(host);
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(80);
printf("hostname : %s\n", host);
if(connect(c_socket, (struct sockaddr *) &c_addr, sizeof(c_addr)) == -1){
printf("Can not connect\n");
close(c_socket);
return -1;
}
write(c_socket, buffer, strlen(buffer)+1);
memset(rcvBuffer, 0, sizeof(rcvBuffer));
while((n=read(c_socket, rcvBuffer, BUFSIZ)) > 0){
printf("%s", rcvBuffer);
memset(rcvBuffer, 0, sizeof(rcvBuffer));
}
close(c_socket);
freeaddrinfo(servinfo);
}
- λλΆλΆμ μ¬μ΄νΈλ HTTPSλ₯Ό μ°μ μ μΌλ‘ νμΈνκΈ° λλ¬Έμ λ§μ ν¨ν·μ λμ‘μ κ²½μ° μνλ κ²°κ³Όλ₯Ό Response ν΄μ£Όμ§ μλλ€.
- 301 μλ¬ Moved Permanently (REDIRECTION) μλ¬κ° λνλλ€.
HTTPλ‘ Request μ μλ΅μ ν΄μ£Όλ μ¬μ΄νΈ : ghttp2.org
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
char buffer[BUFSIZ];
int main(int argc, char *argv[]){
int status;
struct addrinfo hints;
struct addrinfo *servinfo, *tmp; // κ²°κ³Όλ₯Ό μ μ₯ν λ³μ
char host[256];
int c_socket;
struct sockaddr_in c_addr;
int len;
int i=0;
char *ptr;
char rcvBuffer[BUFSIZ];
int n;
c_socket = socket(PF_INET, SOCK_STREAM, 0);
memset(&hints, 0, sizeof(hints)); // hints ꡬ쑰체μ λͺ¨λ κ°μ 0μΌλ‘ μ΄κΈ°ν
hints.ai_family = AF_UNSPEC; // IPv4 IPv6 μκ΄μμ΄ κ²°κ³Ό λͺ¨λ λ°ν
hints.ai_socktype = SOCK_STREAM; // TCP stream sockets
if(argc ==1){
printf("Enter Domain\n ");
return -1;
}
status = getaddrinfo(argv[1], "80", &hints, &servinfo);
tmp = servinfo;
getnameinfo(tmp->ai_addr, tmp->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
sprintf(buffer, "GET / HTTP/1.1\r\nHost: %s\r\nConnection: %s\r\nUpgrade: %s\r\nHTTP2-Settings: %s\r\n\r\n", argv[1], "Upgrade, HTTP2-Settings", "h2c", "<base64url encoding of HTTP/2 SETTINGS payload>");
memset(&c_addr, 0, sizeof(c_addr));
c_addr.sin_addr.s_addr = inet_addr(host);
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(80);
if(connect(c_socket, (struct sockaddr *) &c_addr, sizeof(c_addr)) == -1){
printf("Can not connect\n");
close(c_socket);
return -1;
}
write(c_socket, buffer, strlen(buffer)+1);
memset(rcvBuffer, 0, sizeof(rcvBuffer));
read(c_socket, rcvBuffer, 20);
ptr = strstr(rcvBuffer, "101");
if(ptr != NULL){
printf("%s : HTTP/2 is enabled.\n", argv[1]);
}
else
printf("%s : HTTP/2 Not Found.\n", argv[1]);
close(c_socket);
freeaddrinfo(servinfo);
}