Python實現簡單的HTTP請求發送

gaok1 8年前發布 | 2K 次閱讀 Python

代碼如下

import socket

def clean_host(host):
    """Remove leading http:// and trailing /path_to_somewhere in host name"""
    host = host.strip()
    prefixes = ['http://']
    for prefix in prefixes:
        if host.lower().startswith(prefix):
            host = host[len(prefix):]
    slash = host.find('/')
    if slash>0:
        host = host[:slash]
    return host

def get_ipv4_list(host, port=80):
    """Return the list of ips corresponding to given host and port number"""
    info = socket.getaddrinfo(host, port)
    return [item[4][0] for item in info]

def send_request(ip, data, remote_port=80, local_port=2333, bufsize=1024):
    """Send data to give ip and receive response from the server"""
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((ip, remote_port))
    sock.send(data)
    recv_data = []
    while True:
        buf = sock.recv(bufsize)
        if not buf:
            break
        recv_data += [buf]
    sock.close()
    return ''.join(recv_data)

def read_text(promp='> ', promp2='~ '):
    """Read in text from stdin terminted by EOF"""
    text = []
    try:
        while True:
            if not text:
                text = [raw_input(promp)+'\n']
            else:
                text += [raw_input(promp2)+'\n']
    except EOFError:
        return ''.join(text)
    return ''

def http_app():
    remote_host = raw_input('Input remote host name (for example www.baidu.com): ')
    remote_port = 80
    buf = raw_input('Input remote port number (default 80): ')
    if buf.isdigit() and 0<=int(buf)<=65535:
        remote_port = int(buf)
    print remote_host, 'at port', remote_port
    
    print 'Resolving host...'
    ip_list = get_ipv4_list(clean_host(remote_host), port=remote_port)
    ip = ip_list[0]
    print 'Using ip address', ip
    while True:
        data = read_text()
        if not data:
            break
        print '[REQUEST]'
        print data
        response = send_request(ip, data, remote_port=remote_port)
        print '[REPONSE]'
        print response

if __name__ == '__main__':
    print 'Running http_app. Press Ctrl+C to quit'
    while True:
        try:
            http_app()
        except KeyboardInterrupt:
            if raw_input('Quit? ').lower() == 'n':
                break

不過不知道是代碼哪里有問題導致返回的全都是Bad Request :(

 本文由用戶 gaok1 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!