Skip to content

Instantly share code, notes, and snippets.

@nside
Forked from lukemarsden/httpRequest.py
Last active August 29, 2015 13:55
Show Gist options
  • Save nside/8698513 to your computer and use it in GitHub Desktop.
Save nside/8698513 to your computer and use it in GitHub Desktop.
from twisted.web.iweb import IBodyProducer
from twisted.internet import defer
from twisted.web.client import Agent
from twisted.web.http_headers import Headers
from zope.interface import implements
import urllib
class StringProducer(object):
implements(IBodyProducer)
def __init__(self, body):
self.body = body
self.length = len(body)
def startProducing(self, consumer):
consumer.write(self.body)
return defer.succeed(None)
def pauseProducing(self):
pass
def stopProducing(self):
pass
def httpRequest(url, values={}, headers={}, method='POST'):
# Construct an Agent.
agent = Agent(reactor)
data = urllib.urlencode(values)
d = agent.request(method,
url,
Headers(headers),
StringProducer(data) if data else None)
def handle_response(response):
if response.code == 204:
d = defer.succeed('')
else:
class SimpleReceiver(protocol.Protocol):
def __init__(s, d):
s.buf = ''; s.d = d
def dataReceived(s, data):
s.buf += data
def connectionLost(s, reason):
# TODO: test if reason is twisted.web.client.ResponseDone, if not, do an errback
s.d.callback(s.buf)
d = defer.Deferred()
response.deliverBody(SimpleReceiver(d))
return d
d.addCallback(handle_response)
return d
# Sample usage:
d = httpRequest(
"http://...",
{
'query_arg': 'value',
},
headers={'Content-Type': ['application/x-www-form-urlencoded']}
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment