mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2024-12-28 08:48:53 +00:00
61 lines
1.6 KiB
Python
61 lines
1.6 KiB
Python
|
|
||
|
from cStringIO import StringIO
|
||
|
import urlparse, httplib
|
||
|
import allmydata # for __version__
|
||
|
|
||
|
# copied from twisted/web/client.py
|
||
|
def parse_url(url, defaultPort=None):
|
||
|
url = url.strip()
|
||
|
parsed = urlparse.urlparse(url)
|
||
|
scheme = parsed[0]
|
||
|
path = urlparse.urlunparse(('','')+parsed[2:])
|
||
|
if defaultPort is None:
|
||
|
if scheme == 'https':
|
||
|
defaultPort = 443
|
||
|
else:
|
||
|
defaultPort = 80
|
||
|
host, port = parsed[1], defaultPort
|
||
|
if ':' in host:
|
||
|
host, port = host.split(':')
|
||
|
port = int(port)
|
||
|
if path == "":
|
||
|
path = "/"
|
||
|
return scheme, host, port, path
|
||
|
|
||
|
|
||
|
def do_http(method, url, body=""):
|
||
|
if isinstance(body, str):
|
||
|
body = StringIO(body)
|
||
|
elif isinstance(body, unicode):
|
||
|
raise RuntimeError("do_http body must be a bytestring, not unicode")
|
||
|
else:
|
||
|
assert body.tell
|
||
|
assert body.seek
|
||
|
assert body.read
|
||
|
scheme, host, port, path = parse_url(url)
|
||
|
if scheme == "http":
|
||
|
c = httplib.HTTPConnection(host, port)
|
||
|
elif scheme == "https":
|
||
|
c = httplib.HTTPSConnection(host, port)
|
||
|
else:
|
||
|
raise ValueError("unknown scheme '%s', need http or https" % scheme)
|
||
|
c.putrequest(method, path)
|
||
|
c.putheader("Hostname", host)
|
||
|
c.putheader("User-Agent", "tahoe_cli/%s" % allmydata.__version__)
|
||
|
c.putheader("Connection", "close")
|
||
|
|
||
|
old = body.tell()
|
||
|
body.seek(0, 2)
|
||
|
length = body.tell()
|
||
|
body.seek(old)
|
||
|
c.putheader("Content-Length", str(length))
|
||
|
c.endheaders()
|
||
|
|
||
|
while True:
|
||
|
data = body.read(8192)
|
||
|
if not data:
|
||
|
break
|
||
|
c.send(data)
|
||
|
|
||
|
return c.getresponse()
|