Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from twisted.internet import protocol, reactor
- from twisted.web import http
- from twisted.web.client import Agent
- from twisted.web.http_headers import Headers
- from twisted.web.iweb import IBodyProducer
- from zope.interface import implements
- from twisted.internet.defer import Deferred, succeed
- import sys
- class MyRequest(http.Request):
- def process(self): # Обработка запроса от браузера
- agent = Agent(reactor)
- print self
- if self.method == 'GET':
- # GET, url и заголовки от браузера, отправка запроса через twisted
- d = agent.request('GET', self.uri, headers=self.requestHeaders)
- elif self.method == 'POST':
- # POST, получение данных и отправка, урл и заголовки из реквеста
- data = self.content.read()
- d = agent.request('POST', self.uri, headers=self.requestHeaders, bodyProducer=postData(data))
- else:
- print 'FAIL!'
- print self.method
- reactor.stop()
- d.addCallback(self.GetRespnse)
- d.addErrback(self.Error)
- d.addCallback(self.SendResp)
- d.addErrback(self.Error2)
- def GetRespnse(self, resp): #Получаем ответ
- r = Deferred()
- resp.deliverBody(GetFullResp(r, resp.code, resp.headers)) #Получаем ответ полностью
- print 'full resp triggered'
- return r
- def Error(self, fail):
- print 'GetRespnse FAIL!'
- print self
- attrs = vars(self)
- print ', '.join("%s: %s" % item for item in attrs.items())
- print fail
- def Error2(self, fail):
- print 'SendResp FAIL!'
- print self
- attrs = vars(self)
- print ', '.join("%s: %s" % item for item in attrs.items())
- print fail
- def SendResp(self, tup): #Отправка ответа браузеру
- print tup[1]
- self.setResponseCode(tup[1]) #Код ответа из полученного ответа
- i = tup[2].getAllRawHeaders()#Вставка полученых заголовков
- for u, v in i:
- self.setHeader(u, ''.join(v))
- self.write('') #Конец заголовков
- self.write(tup[0]) #Отправка тела сообщения
- self.finish() #Закрытие соединения
- class GetFullResp(protocol.Protocol): #Получение ответа полностью
- def __init__(self, r, code, headers):
- self.r = r
- self.data = '' #Полученые данные
- self.code = code #Код ответа
- self.headers = headers #Заголовки ответа
- def dataReceived(self, data):
- self.data += data
- def connectionLost(self, reason): #Ответ полностью получен, соединение закрыто
- print 'passing to callback'
- self.r.callback((self.data, self.code, self.headers)) #Даные, код ответа, заголовки
- class postData(object): #Для POST запросов, перекатано с учебника
- implements(IBodyProducer)
- def __init__(self, data):
- self.data = data
- def startProducing(self, consumer):
- consumer.write(self.data)
- return succeed(None)
- class MyHttp(http.HTTPChannel):
- requestFactory = MyRequest
- class MyHttpFactory(protocol.Factory):
- def buildProtocol(self, ptfactory):
- return MyHttp()
- reactor.listenTCP(8000, MyHttpFactory())
- reactor.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement