Mercurial > cpython-lru_cache-weakref
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 |
| 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() |
