source file: /home/buildslave/tahoe/edgy/build/src/allmydata/scripts/common_http.py
file stats: 53 lines, 45 executed: 84.9% covered
1.
2. from cStringIO import StringIO
3. import urlparse, httplib
4. import allmydata # for __version__
5.
6. # copied from twisted/web/client.py
7. def parse_url(url, defaultPort=None):
8. url = url.strip()
9. parsed = urlparse.urlparse(url)
10. scheme = parsed[0]
11. path = urlparse.urlunparse(('','')+parsed[2:])
12. if defaultPort is None:
13. if scheme == 'https':
14. defaultPort = 443
15. else:
16. defaultPort = 80
17. host, port = parsed[1], defaultPort
18. if ':' in host:
19. host, port = host.split(':')
20. port = int(port)
21. if path == "":
22. path = "/"
23. return scheme, host, port, path
24.
25.
26. def do_http(method, url, body=""):
27. if isinstance(body, str):
28. body = StringIO(body)
29. elif isinstance(body, unicode):
30. raise RuntimeError("do_http body must be a bytestring, not unicode")
31. else:
32. # We must give a Content-Length header to twisted.web, otherwise it
33. # seems to get a zero-length file. I suspect that "chunked-encoding"
34. # may fix this.
35. assert body.tell
36. assert body.seek
37. assert body.read
38. scheme, host, port, path = parse_url(url)
39. if scheme == "http":
40. c = httplib.HTTPConnection(host, port)
41. elif scheme == "https":
42. c = httplib.HTTPSConnection(host, port)
43. else:
44. raise ValueError("unknown scheme '%s', need http or https" % scheme)
45. c.putrequest(method, path)
46. c.putheader("Hostname", host)
47. c.putheader("User-Agent", "tahoe_cli/%s" % allmydata.__version__)
48. c.putheader("Connection", "close")
49.
50. old = body.tell()
51. body.seek(0, 2)
52. length = body.tell()
53. body.seek(old)
54. c.putheader("Content-Length", str(length))
55. c.endheaders()
56.
57. while True:
58. data = body.read(8192)
59. if not data:
60. break
61. c.send(data)
62.
63. return c.getresponse()
64.
65. def check_http_error(resp, stderr):
66. if resp.status < 200 or resp.status >= 300:
67. print >>stderr, "error %d during HTTP request" % resp.status
68. return 1