UFO ET IT

최소한 HTTP 요청에 필요한 것은 무엇입니까?

ufoet 2020. 11. 16. 23:18
반응형

최소한 HTTP 요청에 필요한 것은 무엇입니까?


netcat다음을 수행 하여 로컬 서버에 GET 명령을 실행하려고합니다 .

echo -e "GET / HTTP/1.1\nHost: localhost" | nc localhost 80

불행히도 HTTP/1.1 400 Bad Request이에 대한 응답을 받았습니다. HTTP 요청에는 최소한 무엇이 필요합니까?


CRLF 줄 끝을 사용해야하며 \r\n\r\n, 즉 빈 줄로 끝나야합니다 . 이것이 내가 사용하는 것입니다.

printf 'GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: close\r\n\r\n' |
  nc www.example.com 80

또한, 내가 선호하는 printf동안 echo, 나는 가까운 서버 연결을 위해 별도의 헤더를 추가 할 수 있지만 사람들은 필요하지 않습니다.


요청이 "GET / HTTP/1.0\r\n\r\n"다음과 같으면 응답에 본문과 헤더가 포함되고 응답 후 연결이 닫힙니다.

요청이 "GET / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n"다음과 같으면 응답에 본문과 헤더가 포함되고 응답 후 연결이 닫힙니다.

요청이 "GET / HTTP/1.1\r\nHost: host:port\r\n\r\n"다음과 같으면 응답에 본문과 헤더가 포함되며 응답 후에도 연결이 닫히지 않습니다.

요청이 "GET /\r\n\r\n"다음과 같으면 응답에 헤더가없고 본문 만 포함되며 응답 후 연결이 닫힙니다.

요청이 "HEAD / HTTP/1.0\r\n\r\n"다음과 같으면 응답에 헤더 만 포함되고 본문은 포함되지 않으며 응답 후 연결이 닫힙니다.

요청이 "HEAD / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n"다음과 같은 경우 응답에는 헤더 만 포함되고 본문은 포함되지 않으며 응답 후 연결이 닫힙니다.

요청이 "HEAD / HTTP/1.1\r\nHost: host:port\r\n\r\n"다음과 같은 경우 응답에는 헤더 만 포함되고 본문은 포함되지 않으며 응답 후 연결이 닫히지 않습니다.


Wiki : HTTP 클라이언트 요청 (예제)을 참조하십시오 .

다음 사항에 유의하십시오.

클라이언트 요청 (이 경우 요청 줄과 하나의 헤더로 구성됨) 뒤에는 빈 줄이옵니다. 따라서 요청은 각각 캐리지 리턴 형식과 줄 바꿈 형식의 이중 줄 바꿈으로 끝납니다 . "호스트"헤더는 단일 IP 주소를 공유하는 다양한 DNS 이름을 구별하여 이름 기반 가상 호스팅을 허용합니다. HTTP / 1.0에서는 선택 사항 이지만 HTTP / 1.1에서는 필수입니다 .

절대 최소값 (호스트 제거가 허용되는 경우 ;-)은 GET / HTTP/1.0\r\n\r\n입니다.

즐거운 코딩


요청 된 문서 만 사용 하고 응답 헤더없이 Apache 서버에서 응답을받을 수있었습니다.

GET /\r\n

상태 코드를 포함하여 응답 헤더를 원하는 경우 여기에 다른 답변 중 하나가 필요합니다.


의 사실 400 Bad Request오류 자체는 요청이 HTTP 위반하는 것을 의미하지는 않습니다. 서버는 다른 이유로이 응답을 제공 할 수 있습니다.

내가 아는 한 절대 최소 유효 HTTP 요청은 다음과 같습니다.

GET / HTTP/1.0\r\n\r\n

먼저 관련 사양을 읽지 않고 자신의 HTTP 클라이언트를 구현하지 마십시오. RFC 2616 이상을 읽고 완전히 이해했는지 확인하십시오. . (그리고 야심이 있다면 RFC 7230에서 7235까지).

HTTP는 쉬운 프로토콜처럼 보이지만 실제로는 미묘한 점이 많이 있습니다. HTTP 서버를 작성한 사람이라면 누구나 잘못되었지만 널리 배포 된 클라이언트를 처리하기 위해 구현해야하는 해결 방법에 대해 알려줄 것입니다. 사양을 읽지 않는 한 잘 확립 된 클라이언트 라이브러리를 사용하십시오. Curl 은 좋은 선택이지만 다른 것들이 있다고 확신합니다.

직접 구현하려는 경우 :

  • HTTP / 0.9를 사용하지 마십시오.
  • HTTP / 1.0에는 쿼리 줄과 빈 줄이 필요합니다.
  • HTTP / 1.1에서 Host:헤더는 위에 추가로 필수입니다.

Host:HTTP / 1.1에서 헤더를 생략하는 것이 400 오류의 가장 일반적인 원인입니다.


빈 줄을 추가해야합니다. \r\n\r\n

http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Client_request


정말 진짜 베어 최소값은 netcat을 사용하지 않고 bash 자체를 사용하는 것입니다.

user@localhost:~$ exec 3<>/dev/tcp/127.0.0.1/80
user@localhost:~$ echo -e "GET / HTTP/1.1\n" >&3
user@localhost:~$ cat <&3
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/2.7.6
Date: Mon, 13 Oct 2014 17:55:55 GMT
Content-type: text/html; charset=UTF-8
Content-Length: 514

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
<hr>
<ul>
</ul>
<hr>
</body>
</html>
user@localhost:~$ 

참고 URL : https://stackoverflow.com/questions/6686261/what-at-the-bare-minimum-is-required-for-an-http-request

반응형