annotate Lib/httplib.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 0dddf49ea416
children 7a0880f8b8ec
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # HTTP client class
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 #
3131
71bb71e306fe actualized example/reference, fix bug w/ nonnumeric port
Guido van Rossum <guido@python.org>
parents: 3073
diff changeset
3 # See the following URL for a description of the HTTP/1.0 protocol:
71bb71e306fe actualized example/reference, fix bug w/ nonnumeric port
Guido van Rossum <guido@python.org>
parents: 3073
diff changeset
4 # http://www.w3.org/hypertext/WWW/Protocols/
71bb71e306fe actualized example/reference, fix bug w/ nonnumeric port
Guido van Rossum <guido@python.org>
parents: 3073
diff changeset
5 # (I actually implemented it from a much earlier draft.)
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # Example:
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 #
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # >>> from httplib import HTTP
3131
71bb71e306fe actualized example/reference, fix bug w/ nonnumeric port
Guido van Rossum <guido@python.org>
parents: 3073
diff changeset
10 # >>> h = HTTP('www.python.org')
71bb71e306fe actualized example/reference, fix bug w/ nonnumeric port
Guido van Rossum <guido@python.org>
parents: 3073
diff changeset
11 # >>> h.putrequest('GET', '/index.html')
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 # >>> h.putheader('Accept', 'text/html')
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 # >>> h.putheader('Accept', 'text/plain')
2772
35432c9a874e discard endrequest(); minor stuff; rfc822 no seek flag
Guido van Rossum <guido@python.org>
parents: 1618
diff changeset
14 # >>> h.endheaders()
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 # >>> errcode, errmsg, headers = h.getreply()
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 # >>> if errcode == 200:
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 # ... f = h.getfile()
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 # ... print f.read() # Print the raw HTML
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 # ...
3131
71bb71e306fe actualized example/reference, fix bug w/ nonnumeric port
Guido van Rossum <guido@python.org>
parents: 3073
diff changeset
20 # <HEAD>
71bb71e306fe actualized example/reference, fix bug w/ nonnumeric port
Guido van Rossum <guido@python.org>
parents: 3073
diff changeset
21 # <TITLE>Python Language Home Page</TITLE>
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 # [...many more lines...]
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 # >>>
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 #
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 # Note that an HTTP object is used for a single request -- to issue a
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 # second request to the same server, you create a new HTTP object.
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 # (This is in accordance with the protocol, which uses a new TCP
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 # connection for each request.)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
30
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 import os
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 import socket
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 import string
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 import regex
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 import regsub
2919
811d9a98e18a use mimetools; add close()
Guido van Rossum <guido@python.org>
parents: 2772
diff changeset
36 import mimetools
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
37
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 HTTP_VERSION = 'HTTP/1.0'
4658
0dddf49ea416 In the HTTP reply header, be more accepting in the HTTP version.
Guido van Rossum <guido@python.org>
parents: 3398
diff changeset
39 HTTP_VERSIONS_ACCEPTED = 'HTTP/1\.[0-9.]+'
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 HTTP_PORT = 80
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
41
4658
0dddf49ea416 In the HTTP reply header, be more accepting in the HTTP version.
Guido van Rossum <guido@python.org>
parents: 3398
diff changeset
42 replypat = HTTP_VERSIONS_ACCEPTED + '[ \t]+\([0-9][0-9][0-9]\)\(.*\)'
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 replyprog = regex.compile(replypat)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
44
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 class HTTP:
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
46
1618
7f891f32864c Changes to use default argument values where possible
Guido van Rossum <guido@python.org>
parents: 1557
diff changeset
47 def __init__(self, host = '', port = 0):
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 self.debuglevel = 0
2919
811d9a98e18a use mimetools; add close()
Guido van Rossum <guido@python.org>
parents: 2772
diff changeset
49 self.file = None
1618
7f891f32864c Changes to use default argument values where possible
Guido van Rossum <guido@python.org>
parents: 1557
diff changeset
50 if host: self.connect(host, port)
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
51
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 def set_debuglevel(self, debuglevel):
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 self.debuglevel = debuglevel
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
1618
7f891f32864c Changes to use default argument values where possible
Guido van Rossum <guido@python.org>
parents: 1557
diff changeset
55 def connect(self, host, port = 0):
7f891f32864c Changes to use default argument values where possible
Guido van Rossum <guido@python.org>
parents: 1557
diff changeset
56 if not port:
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 i = string.find(host, ':')
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 if i >= 0:
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 host, port = host[:i], host[i+1:]
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 try: port = string.atoi(port)
3131
71bb71e306fe actualized example/reference, fix bug w/ nonnumeric port
Guido van Rossum <guido@python.org>
parents: 3073
diff changeset
61 except string.atoi_error:
71bb71e306fe actualized example/reference, fix bug w/ nonnumeric port
Guido van Rossum <guido@python.org>
parents: 3073
diff changeset
62 raise socket.error, "nonnumeric port"
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 if not port: port = HTTP_PORT
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 if self.debuglevel > 0: print 'connect:', (host, port)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 self.sock.connect(host, port)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
67
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 def send(self, str):
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 if self.debuglevel > 0: print 'send:', `str`
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 self.sock.send(str)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
71
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 def putrequest(self, request, selector):
2772
35432c9a874e discard endrequest(); minor stuff; rfc822 no seek flag
Guido van Rossum <guido@python.org>
parents: 1618
diff changeset
73 if not selector: selector = '/'
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 str = '%s %s %s\r\n' % (request, selector, HTTP_VERSION)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 self.send(str)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
76
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 def putheader(self, header, *args):
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 str = '%s: %s\r\n' % (header, string.joinfields(args,'\r\n\t'))
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 self.send(str)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
80
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 def endheaders(self):
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 self.send('\r\n')
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
83
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 def getreply(self):
3398
409a89c5f66d Changed makefile() args from r/w to rb/wb, for non-unix compatability.
Jack Jansen <jack.jansen@cwi.nl>
parents: 3131
diff changeset
85 self.file = self.sock.makefile('rb')
2772
35432c9a874e discard endrequest(); minor stuff; rfc822 no seek flag
Guido van Rossum <guido@python.org>
parents: 1618
diff changeset
86 self.sock = None
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 line = self.file.readline()
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 if self.debuglevel > 0: print 'reply:', `line`
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 if replyprog.match(line) < 0:
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 self.headers = None
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 return -1, line, self.headers
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 errcode, errmsg = replyprog.group(1, 2)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 errcode = string.atoi(errcode)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 errmsg = string.strip(errmsg)
2919
811d9a98e18a use mimetools; add close()
Guido van Rossum <guido@python.org>
parents: 2772
diff changeset
95 self.headers = mimetools.Message(self.file, 0)
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 return errcode, errmsg, self.headers
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
97
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 def getfile(self):
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 return self.file
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
100
2919
811d9a98e18a use mimetools; add close()
Guido van Rossum <guido@python.org>
parents: 2772
diff changeset
101 def close(self):
811d9a98e18a use mimetools; add close()
Guido van Rossum <guido@python.org>
parents: 2772
diff changeset
102 if self.file:
811d9a98e18a use mimetools; add close()
Guido van Rossum <guido@python.org>
parents: 2772
diff changeset
103 self.file.close()
811d9a98e18a use mimetools; add close()
Guido van Rossum <guido@python.org>
parents: 2772
diff changeset
104 self.file = None
811d9a98e18a use mimetools; add close()
Guido van Rossum <guido@python.org>
parents: 2772
diff changeset
105
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
106
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 def test():
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 import sys
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 import getopt
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 opts, args = getopt.getopt(sys.argv[1:], 'd')
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 dl = 0
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 for o, a in opts:
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 if o == '-d': dl = dl + 1
3073
d6b130fa91b6 fixed the test program
Guido van Rossum <guido@python.org>
parents: 2919
diff changeset
114 host = 'www.python.org'
d6b130fa91b6 fixed the test program
Guido van Rossum <guido@python.org>
parents: 2919
diff changeset
115 selector = '/'
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 if args[0:]: host = args[0]
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 if args[1:]: selector = args[1]
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 h = HTTP()
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 h.set_debuglevel(dl)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 h.connect(host)
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 h.putrequest('GET', selector)
3073
d6b130fa91b6 fixed the test program
Guido van Rossum <guido@python.org>
parents: 2919
diff changeset
122 h.endheaders()
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 errcode, errmsg, headers = h.getreply()
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 print 'errcode =', errcode
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 print 'errmsg =', errmsg
3073
d6b130fa91b6 fixed the test program
Guido van Rossum <guido@python.org>
parents: 2919
diff changeset
126 print
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 if headers:
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 for header in headers.headers: print string.strip(header)
3073
d6b130fa91b6 fixed the test program
Guido van Rossum <guido@python.org>
parents: 2919
diff changeset
129 print
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 print h.getfile().read()
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
131
3073
d6b130fa91b6 fixed the test program
Guido van Rossum <guido@python.org>
parents: 2919
diff changeset
132
1555
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 if __name__ == '__main__':
6d35308261f4 Towards a standard access mechanism for URLs.
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 test()