[tornado] tcp request must end with '\r\n\r\n' - dsindex/blog GitHub Wiki
tcp request
를 보낼때 표준은 마지막에 반드시 '\r\n\r\n'으로 끝나도록 되어 있다.
( 모든 line은 '\r\n'으로 끝나야하고 마지막에 빈 line이 하나 있어야 한다 )
그런데, 어떤 web server들은 '\n\n', '\r\n\n'으로 끝나도 인식이 되도록 설계가 되어 있어서
'\n\n' 등이 표준이라고 생각하는 경우가 있는데, 그렇지 않다.
tornado
의 경우는 표준만 인식하도록 설계되어 있는데, 소스를 따라가 보면
read_until('\r\n\r\n', ...) method에서 parameter로 지정해둔것을 확인해볼 수 있을 것이다.
#!/usr/bin/env python
#-*- coding: utf8 -*-
import sys
import os.path
from optparse import OptionParser
import socket
import urllib
# --verbose
VERBOSE = 0
if __name__ == '__main__':
parser = OptionParser()
parser.add_option("--verbose", action="store_const", const=1, dest="verbose", help="verbose mode")
(options, args) = parser.parse_args()
if options.verbose == 1 : VERBOSE = 1
HOST = 'XX.XX.XX.XX'
params = {'q':'blah~ blah~'}
GET = '/service.json?' + urllib.urlencode(params)
PORT = 80
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
sys.stderr.write("[ERROR] %s\n" % msg[1])
sys.exit(1)
try:
sock.connect((HOST, PORT))
except socket.error, msg:
sys.stderr.write("[ERROR] %s\n" % msg[1])
sys.exit(2)
request = "GET %s HTTP/1.1\r\nHost: %s + "\r\n\r\n" % (GET, HOST)
sock.send(request)
print "[SEND]"
print request
data = sock.recv(1024)
string = ""
while len(data):
string = string + data
data = sock.recv(1024)
sock.close()
print "[RECV]"
print string