2014-10-04 3 views
3

그래서이 요청에 대해 잠시 후 서버 시간 제한을 설정하는 부분적인 GET 요청에 대해 읽었습니다. 어떻게 부분 GET 요청을 보내겠습니까? ...파이썬 - "불완전한"GET 요청 보내기

import socket, sys 
host = sys.argv[1] 

request = "GET/HTTP/1.1\nHost: "+host+"\n\nUser-Agent:Mozilla 5.0\n" #How could I make this into a partial request? 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host, 80)) 
s.sendto(request, (host, 80)) 
response = s.recv(1024) 

어떻게하면됩니까?

+0

왜 'urllib','requests' 등의 모듈을 사용하지 않습니까? – falsetru

+0

처음에는 그런 식으로 만들었지 만 사람들이 GET 요청을 잘 이해할 수 있도록 "GET"을 표시하려고했습니다 – Shane

답변

1

난 당신이 부분적이고 불완전 요청을 혼란스럽게 생각한다

  • 부분 : 자원의 일부에 대한 요청, 즉 falsetru의 대답에 표시된 같은 범위의 요청입니다. 이렇게하면 시간 초과가 발생하지 않고 코드 206 및 요청한 자원 부분의 응답이 발생합니다.
  • 불완전 : 요청이 불완전하여 서버에서 처리 할 수 ​​없으므로 요청을받지 못하면 나머지 요청을 기다리고 잠시 후 시간이 초과됩니다. 귀하의 질문에 당신은 당신이 제대로 끝내지 않았기 때문에 이미 불완전한 요청을했습니다 (\r\n\r\n으로 끝나야하고 \n으로 끝나지 않아야합니다). 다른 방법은 데이터를 보내거나 내용 길이가있는 POST 요청을하지 않고 요청 헤더에 지정된만큼의 데이터를 보내지 않고 TCP 연결 만하는 것입니다.
+0

나는 그것을 더 잘 이해할 수 있도록이 질문을했습니다. – Shane

+0

그래서 제가 게시 한 요청은 약 400 초가 지나면 시간 초과 될 것입니다. – Shane

+1

시간 제한은 서버 구성에 따라 다릅니다. 일반적으로로드가 많은 서버는 서비스 거부 공격 시도에 대해 불완전한 요청을 상당히 빠르게 시간 초과합니다. –

0

HTTP 헤더가 너무 일찍 끝납니다. 이 부분 콘텐츠 검색을 의미하는 경우 Range header을 speicfy 수

import socket, sys 
host = sys.argv[1] 

request = "GET/HTTP/1.1\nHost: "+host+"\nUser-Agent:Mozilla 5.0\n\n" 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host, 80)) 
s.send(request) 
response = s.recv(1024) 

을 (\n\n는 내용보다 먼저, 헤더 이후에 와야한다) : 그것은해야

"GET/HTTP/1.1\nHost: "+host+"\nUser-Agent:Mozilla 5.0\rRange: bytes=0-999\n\n" 

참고 \r\n하지 \n 비록 대부분의 서버 (전부는 아니지만)가 \n을 받아들이더라도 줄 끝으로.

+2

대부분의 경우에도 행 끝으로 \\ \ n가 아니라 \ r \ n이어야합니다. (전부는 아니지만) 서버도'\ n'을 허용합니다. –

+0

@SteffenUllrich, 의견을 주셔서 감사합니다. 대답에 귀하의 의견을 추가했습니다. 괜찮습니까? – falsetru

+0

물론 문제는 없습니다. –