파이썬 소켓 만 사용하여 수동으로 GET 요청을 만들기 위해이 코드를 작성했습니다. 내가 작성했을 때 2016에서 완벽하게 작동했지만 이제 다시 필요하며 오류 코드 400 잘못된 요청이 계속 나타납니다. 파이썬 버전 전환을 시도했지만 여전히 동일합니다. 나는 Stackoverflow 질문을 통해 내가하는 것과 거의 똑같은 것을 묻고 있었지만 작동하도록 할 수 없습니다. 누군가 나를 도울 수 있다면 감사하겠습니다. 내 코드는 다음과 같습니다. 모든 IO를 제거하고 네트워킹 코드 만 게시했습니다.
URL_PATTERN = re.compile("^(.*://)?([A-Za-z0-9\-\.]+)(:[0-9]+)?(.*)$")
HEADER_END = re.compile("\r\n\r\n")
URL_DATA = re.match(URL_PATTERN, INPUT_URL)
PROTOCOL = URL_DATA.groups()[0][:-3]
HOSTNAME = URL_DATA.groups()[1]
PATHNAME = URL_DATA.groups()[3] if URL_DATA.groups()[3] != "" else "/"
PORT = 80 if PROTOCOL == "http" else 443
BUFFER_SIZE = 4096
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOSTNAME, PORT))
s.send("GET " + PATHNAME + " HTTP/1.1\r\nHost: " + HOSTNAME + "\r\nConnection: close\r\n\r\n")
resp = s.recv(BUFFER_SIZE)
HEADER_INDEX = re.search(HEADER_END, resp).start()
HTTP_RESPONSE_HEADER = resp[:HEADER_INDEX]
s.close()
URL https://doc.rust-lang.org/book/2018-edition/foreword.html 에서 프로그램을 실행할 때
내 프로그램의 변수에는 다음과 같은 값이 있습니다.
포트 : 443
프로토콜 : https
호스트 이름 : doc.rust-lang.org
경로 이름 : /book/2018-edition/foreword.html
그런 다음 400 개의 잘못된 요청 코드를 다시받습니다. 내가 뭘 잘못하고 있는지 이해가 안되며 도움을받을 수 있으면 감사하겠습니다.
SSL에 관한 모든 것입니다. 참고로이 질문을 확인할 수 있습니다. Python socket server handle HTTPS request .
다음을 사용하는 것이 좋습니다.
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
보안 소켓을 만듭니다.
s_sock = context.wrap_socket(s, server_hostname=HOSTNAME)
s_sock.connect((HOSTNAME, PORT))
또한 메시지를 인코딩해야 할 수도 있습니다.
마지막에 코드는 다음과 같이 보일 수 있습니다.
import re
import socket
import ssl
URL_PATTERN = re.compile("^(.*://)?([A-Za-z0-9\-\.]+)(:[0-9]+)?(.*)$")
HEADER_END = re.compile("\r\n\r\n")
INPUT_URL = "https://doc.rust-lang.org/book/2018-edition/foreword.html"
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
URL_DATA = re.match(URL_PATTERN, INPUT_URL)
PROTOCOL = URL_DATA.groups()[0][:-3]
HOSTNAME = URL_DATA.groups()[1]
PATHNAME = URL_DATA.groups()[3] if URL_DATA.groups()[3] != "" else "/"
PORT = 80 if PROTOCOL == "http" else 443
BUFFER_SIZE = 4096
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s_sock = context.wrap_socket(s, server_hostname=HOSTNAME)
s_sock.connect((HOSTNAME, PORT))
message = "GET " + PATHNAME + " HTTP/1.1\r\nHost: " + HOSTNAME + "\r\nConnection: close\r\n\r\n"
s_sock.send(message.encode('utf-8'))
resp = bytearray()
while True:
part = s_sock.recv(BUFFER_SIZE)
if not part:
break
resp += part
s_sock.close()
resp_string = str(resp, 'utf-8')
HEADER_INDEX = re.search(HEADER_END, resp_string).start()
HTTP_RESPONSE_HEADER = resp_string[:HEADER_INDEX]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다