[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