Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2013
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.29 KB | None | 0 0
  1. from twisted.internet import protocol, reactor
  2. from twisted.web import http
  3. from twisted.web.client import Agent
  4. from twisted.web.http_headers import Headers
  5. from twisted.web.iweb import IBodyProducer
  6. from zope.interface import implements
  7. from twisted.internet.defer import Deferred, succeed
  8. import sys
  9.  
  10. class MyRequest(http.Request):
  11.     def process(self): # Обработка запроса от браузера
  12.         agent = Agent(reactor)
  13.         print self
  14.         if self.method == 'GET':
  15.             # GET, url и   заголовки от браузера, отправка запроса через twisted  
  16.             d = agent.request('GET', self.uri, headers=self.requestHeaders)
  17.         elif self.method == 'POST':    
  18.     # POST, получение данных и отправка, урл и заголовки из реквеста                              
  19.             data = self.content.read()
  20.             d = agent.request('POST', self.uri, headers=self.requestHeaders, bodyProducer=postData(data))
  21.         else:
  22.             print 'FAIL!'
  23.             print self.method
  24.             reactor.stop()
  25.         d.addCallback(self.GetRespnse)
  26.         d.addErrback(self.Error)
  27.         d.addCallback(self.SendResp)   
  28.         d.addErrback(self.Error2)
  29.  
  30.     def GetRespnse(self, resp): #Получаем ответ
  31.         r = Deferred()
  32.         resp.deliverBody(GetFullResp(r, resp.code, resp.headers)) #Получаем ответ полностью
  33.         print 'full resp triggered'
  34.         return r       
  35.  
  36.     def Error(self, fail):
  37.         print 'GetRespnse FAIL!'
  38.         print self
  39.         attrs = vars(self)
  40.         print ', '.join("%s: %s" % item for item in attrs.items())
  41.         print fail
  42.  
  43.     def Error2(self, fail):
  44.         print 'SendResp FAIL!'
  45.         print self
  46.         attrs = vars(self)
  47.         print ', '.join("%s: %s" % item for item in attrs.items())
  48.         print fail
  49.  
  50.     def SendResp(self, tup): #Отправка ответа браузеру
  51.         print tup[1]
  52.         self.setResponseCode(tup[1]) #Код ответа из полученного ответа
  53.         i = tup[2].getAllRawHeaders()#Вставка полученых заголовков
  54.         for u, v in i:
  55.             self.setHeader(u, ''.join(v))
  56.         self.write('') #Конец заголовков
  57.         self.write(tup[0])  #Отправка тела сообщения
  58.         self.finish() #Закрытие соединения
  59.        
  60.  
  61. class GetFullResp(protocol.Protocol): #Получение ответа полностью
  62.     def __init__(self, r, code, headers):
  63.         self.r = r
  64.         self.data = '' #Полученые данные
  65.         self.code = code #Код ответа
  66.         self.headers = headers #Заголовки ответа
  67.  
  68.     def dataReceived(self, data):
  69.         self.data += data
  70.  
  71.     def connectionLost(self, reason): #Ответ полностью получен, соединение закрыто
  72.         print 'passing to callback'
  73.         self.r.callback((self.data, self.code, self.headers)) #Даные, код ответа, заголовки
  74.  
  75. class postData(object): #Для POST запросов, перекатано с учебника
  76.     implements(IBodyProducer)  
  77.     def __init__(self, data):
  78.         self.data = data
  79.    
  80.     def startProducing(self, consumer):
  81.         consumer.write(self.data)
  82.         return  succeed(None)
  83.  
  84.        
  85. class MyHttp(http.HTTPChannel):
  86.     requestFactory = MyRequest
  87.  
  88. class MyHttpFactory(protocol.Factory):
  89.  
  90.     def buildProtocol(self, ptfactory):
  91.         return MyHttp()
  92.  
  93. reactor.listenTCP(8000, MyHttpFactory())
  94. reactor.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement