青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

socketref,再見!高德

https://github.com/adoggie

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用鏈接

留言簿(54)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

之前開發酒店廣告投放系統編寫的Http代理服務程序,功能實現廣告插播進Html DOM結構內。一般都是DIV被插入,當然包括script都是可以從數據庫中動態獲得。
簡單修改之后當做Http代理服務器程序,在瀏覽器中設置Http轉發程序的Ip即可,只要代理程序的機器能上網,客戶機便能上網(其中涉及Page gzip的工作有點麻煩)
  1 # -*- coding:utf-8 -*-
  2 # http代理服務器
  3 # 1.ip限制,mac限制
  4 #
  5 # socketref@hotmail.com 
  6 # www.sw2us.com
  7 
  8 "exec" "python" "-O" "$0" "$@"
  9 
 10 __doc__ = """sw2us HTTP Proxy.
 11 
 12 """
 13 
 14 __version__ = "0.2.1"
 15 
 16 import BaseHTTPServer, select, socket, SocketServer, urlparse
 17 import httplib,traceback,re
 18 import os,sys,re,mimetools,zlib,StringIO,gzip,time,StringIO
 19 
 20 
 21 class ConfigProperty:
 22     def __init__(self,owner):
 23         self.key=''
 24         self.value=''
 25     
 26     def create(self,text):
 27         #text -  key=value
 28         #@return: boolean
 29         pos = text.find('#')
 30         if(pos !=-1):
 31             text = text[:pos]
 32         pair = text.split('=')
 33         if len(pair) !=2:
 34             #print "Property Line Invalid:%s"%(text)
 35             return False
 36         k = pair[0].strip()
 37         v = pair[1].strip()
 38         self.key = k
 39         self.value = v
 40 
 41         return True
 42     
 43     def toString(self):
 44         s =''
 45         try:            
 46             s = "%s=%s"%(self.key,self.value)            
 47         except:
 48             return ''
 49         return s
 50     
 51     def toInt(self):
 52         r=0
 53         try:
 54             r = int(self.value)
 55         except:
 56             r =0
 57         return r
 58     
 59     def toFloat(self):
 60         r=0.0
 61         try:
 62             r = float(self.value)
 63         except:
 64             r=0.0
 65         return r
 66     
 67     
 68 #@def SimpleConfig
 69 # 簡單配置信息文件,基本格式 : key=value
 70 class SimpleConfig:
 71     def __init__(self):
 72         self._file=''
 73         self._props=[]
 74         self._strip = True
 75         
 76     def open(self,file,strip=True):
 77         #打開配置文件
 78         #@param strip - 是否裁剪不可見首尾兩端的字符
 79         try:
 80             self._strip = strip 
 81             self._props=[]
 82             fh = open(file,'r')
 83             lines = fh.readlines()            
 84             for text in lines:                
 85                 prop = ConfigProperty(self)
 86                 if prop.create(text) == False:                    
 87                     prop = None
 88                 else:                    
 89                     self._props.append(prop)                    
 90             fh.close()
 91         except:            
 92             return False
 93         return True
 94 
 95     def toString(self):
 96         s=''
 97         for p in self._props:
 98             s = s + p.toString() +"\n"
 99         return s
100     
101     def saveAs(self,file):
102         #保存配置信息到文件
103         try:
104             fh = open(file,'w')
105             fh.write(toString())
106             fh.close()
107         except:
108             print "write File Failed!"
109             return False
110         return True
111     
112     def getProperty(self,name):
113         #取屬性值
114         prop=None
115         try:
116             for p in self._props:
117                 if p.key == name:
118                     prop = p
119                     break
120         except:
121             pass
122         
123         return prop
124     
125     def getPropertyValue(self,key,default=''):
126         prop = self.getProperty(key)
127         if not prop:
128             return default
129         return prop.value
130     
131     def getPropertyValueAsInt(self,name,default=0):
132         prop = self.getPropertyValue(name)
133         
134         if not prop:
135             return default
136         r=default
137         try:
138             r = int(prop)
139         except:pass
140         return r
141     
142     def getPropertyValueAsFloat(self,name,default=0.0):
143         prop = self.getPropertyValue(name)
144         if not prop:
145             return default
146         r = default
147         try:
148             r = float(r)
149         except:pass
150         return r
151     
152 
153 #===========================================#
154 
155     
156 #===========================================#
157 
158 def getMacList():
159     maclist=[]
160     f = os.popen('arp -a','r')
161     while True:
162         line  = f.readline()
163         if not line:
164             break
165         line = line.strip()
166         rst = re.match('^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+([0-9a-fA-F]{1,2}\-[0-9a-fA-F]{1,2}\-[0-9a-fA-F]{1,2}\-[0-9a-fA-F]{1,2}\-[0-9a-fA-F]{1,2}\-[0-9a-fA-F]{1,2}).*',line)
167         #rst = re.match('^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',line)
168         if rst:
169             #print rst.groups()
170             maclist.append(rst.groups())
171     #print maclist
172     return maclist
173 
174 
175         
176 ##########################################
177 confile = SimpleConfig()
178 confile.open('proxy.conf')
179 dbconn = None
180 
181 ##########################################
182 #初始化系統配置
183 def initConfiguration():
184     r = True
185     
186     return r
187 
188 ##########################################
189 
190 class ProxyHandler (BaseHTTPServer.BaseHTTPRequestHandler):
191     __base = BaseHTTPServer.BaseHTTPRequestHandler
192     __base_handle = __base.handle
193     server_version = "TinyHTTPProxy/" + __version__
194     rbufsize = 0                        # self.rfile Be unbuffered
195 
196 
197 #######################################################33
198 
199     #handle()是在單獨線程中執行
200     def handle(self): # 調用入口,線程剛進入,攜帶socket進入
201         print 'client incoming'
202         #self.__base_handle()
203         #return 
204         (ip, port) =  self.client_address
205         if hasattr(self, 'allowed_clients'and ip not in self.allowed_clients:
206             self.raw_requestline = self.rfile.readline()
207             if self.parse_request():
208                 self.send_error(403)
209         else:
210             self.__base_handle()
211 
212     def _connect_to(self, netloc, soc):
213         i = netloc.find(':')
214         if i >= 0:
215             host_port = netloc[:i], int(netloc[i+1:])
216         else:
217             host_port = netloc, 80
218         #print "\t" "connect to %s:%d" % host_port
219         try: soc.connect(host_port)
220         except socket.error, arg:
221             try: msg = arg[1]
222             except: msg = arg
223             self.send_error(404, msg)
224             return 0
225         return 1
226 
227     def do_CONNECT(self):
228         soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
229         try:
230             if self._connect_to(self.path, soc):
231                 self.log_request(200)
232                 self.wfile.write(self.protocol_version +
233                                                  " 200 Connection established\r\n")
234                 self.wfile.write("Proxy-agent: %s\r\n" % self.version_string())
235                 self.wfile.write("\r\n")
236                 self._read_write(soc, 300)
237         finally:
238             print "\t" "bye"
239             soc.close()
240             self.connection.close()
241 
242         
243     def do_GET(self):    
244         (scm, netloc, path, params, query, fragment) = urlparse.urlparse(
245                 self.path, 'http')
246         piars = (scm, netloc, path, params, query, fragment)
247         if not netloc:
248             netloc = self.headers.get('Host'"")
249         #print ">>requester:",self.connection.getpeername(),"path:",self.path
250         #print '>>2. ',(scm, netloc, path, params, query, fragment)
251         #print 'next host:',netloc
252         if scm != 'http' or fragment or not netloc:
253             self.send_error(400"bad url %s" % self.path)
254             return
255         soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
256         try:
257             if self._connect_to(netloc, soc):
258                 self.log_request()
259                 soc.send("%s %s %s\r\n" % (
260                         self.command,
261                         urlparse.urlunparse(('''', path, params, query, '')),
262                         self.request_version))
263                 self.headers['Connection'= 'close'
264                 del self.headers['Proxy-Connection']
265                 for key_val in self.headers.items():
266                     soc.send("%s: %s\r\n" % key_val)
267                 soc.send("\r\n")
268                 #到此完成發送請求和頭部信息
269                 self._read_write(soc)
270         finally:
271             print "\t" "bye"
272             soc.close()
273             self.connection.close()    
274         
275 
276     
277     def insertTags(self,tag,body,insert):
278         p1 = body.find('<%s'%tag)
279         if p1!=-1 :
280             p2 = body.find('>',p1)
281             if p2!=-1:
282                 part1 = body[:p2+1]
283                 part2 = body[p2+1:]
284                 print '*-'*20
285                 body = part1 + insert + part2
286         return body
287     
288     # google頁面的數據請求時,返回的數據進行的是gzip壓縮,所以過濾文本存在問題,先要解壓縮之后才可以
289     # 插入數據之后要重新計算 content-length 并返回給客戶瀏覽器
290     # 發現壓縮的有很多 , content-encoding:gzip
291     
292     # 處理 'transfer-encoding': 'chunked'類型
293     #gzip 有兩種存儲,一種是直接gzip壓縮的數據跟在header之后;另外一種是采用chunck塊存儲
294     #在這里將gzip數據全部解壓,還原成原始數據傳出到客戶端
295     def sendBackResponse(self,command,headers,body):
296         
297         insert='<h1>This is Test </h1>'
298         if headers.has_key('content-encoding'and headers['content-encoding'].strip().lower()=='gzip':
299             try:
300                 del headers['content-encoding']
301                 gzipdata=''                
302                 if headers.has_key('transfer-encoding'and headers['transfer-encoding']=='chunked':
303                     del headers['transfer-encoding']
304                     
305                     pos = 0
306                     while pos < len(body):
307                         p = body.find('\x0d\x0a',pos)
308                         sizewidth = p-pos
309                         
310                         chuncksize = int(body[pos:p],16)
311                         #print 'chunck size:',body[pos:p]
312                         p +=2 
313                         gzipdata+=body[p:p+chuncksize]
314                         pos= p+chuncksize+2
315                         if chuncksize ==0 :
316                             break
317                     #
318                     body = gzipdata
319                     
320 #
321                 
322                     #ss = zlib.decompress(gzipdata)
323                 compressedstream = StringIO.StringIO(body)
324                 gzipper = gzip.GzipFile(fileobj=compressedstream)
325                 if gzipper == None:
326                     print '*'*200
327                 body = gzipper.read()
328                 #f = open('body%s.txt'%time.time(),'wb')                    
329                 #f.write(body)
330                 #f.close()
331                     
332                 
333                     #body = gzipdata
334             except:
335                 print traceback.print_exc()
336                 print 'decompress failed!'
337                 #pos = body.find('\x0d\x0a')
338                 #pos = body.find('\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff')
339                 #if pos!=-1:
340                 #    body = body[pos+9:]
341                 #    
342                 #compressedstream = StringIO.StringIO(body)
343                 #gzipper = gzip.GzipFile(fileobj=compressedstream)
344                 #if gzipper == None:
345                 #    print '*'*200
346                 #body = gzipper.read()
347                 
348                 #body = zlib.decompressobj().decompress('x\x9c'+body)
349                 
350         #m = re.search('(<body.*>)',body,re.I)
351         #if m:
352         #    pos = m.start(0)
353         #    part1 = body[:pos+len(m.group(0))]
354         #    part2 = body[pos+len(m.group(0)):]
355         #    body = part1 + insert + part2
356         #    print '-*'*20,insert,'-*'*20
357         
358         #self.insertTags('body',body,insert)
359         
360         css=""" <style>
361 #kk{
362 border:1px dotted red;
363 width:200px;
364 height:300px;
365 float:left;
366 background:#0x00ff00;
367 }
368 </style>
369 """
370         #body =self.insertTags('head',body,css)
371         
372         #body =self.insertTags('body',body,insert)
373         div="""
374         <div id="kk">
375         This is Test DIV Block!!
376 </div> 
377         """
378         
379         #read external html tags
380         try:
381             #ff = open('head.tag','r')
382             #div = ff.read()
383             #ff.close()
384             #body =self.insertTags('head',body,div)
385             body = self.publish_advertisement(body) #插入配置的廣告信息
386         except:
387             pass
388         
389         #p1 = body.find('<body')
390         #if p1!=-1 :
391         #    p2 = body.find('>',p1)
392         #    if p2!=-1:
393         #        part1 = body[:p2+1]
394         #        part2 = body[p2+1:]
395         #        print '*-'*20
396         #        body = part1 + insert + part2
397             #print m.group(0)
398         headers['Content-Length'= str(len(body))
399             
400         #if headers.has_key('content-length'):
401             
402         self.connection.send(command)
403         self.connection.send('\r\n')
404         for k,v in headers.items():
405             self.connection.send("%s: %s\r\n"%(k,v))
406         self.connection.send("\r\n")
407         self.connection.sendall(body)
408         
409 
410         
411 #----------------------------------------------------
412 
413     def _read_write(self, soc, max_idling=20):
414         #getMacList()
415         iw = [self.connection, soc] # self.connnection - 內網主機連接,soc - 向外連接
416         ow = []
417         count = 0
418         #respfile = soc.makefile('rb', 1024)
419         httpCommand=''
420         httpBody=''
421         httpHeaders={}
422         isOkPageResponse=False
423         nextReadBytes=0
424         datacnt=0
425         NoContentLength = False
426         #print self.connection.getpeername()
427         while 1:
428             count += 1
429             datacnt+=1
430             (ins, _, exs) = select.select(iw, ow, iw, 3)
431             if exs:
432                 print 'error occr!'
433                 break #異常產生
434             if ins:
435                 for i in ins:
436                     if i is soc:
437                         out = self.connection
438                     else:
439                         out = soc
440                     
441                     data = i.recv(8192)
442                     if data:                        
443                         out.send(data)
444                         count = 0
445                     else:
446                         if not isOkPageResponse:
447                             return 
448             else:
449                 pass #print "\t" "idle", count
450             if count == max_idling:
451                 print 'idling exit'    
452                 break  # 指定時間內都接收不到雙向數據便退出循環 20*3 = 60 secs
453         
454 
455     do_HEAD = do_GET
456     do_POST = do_GET
457     do_PUT  = do_GET
458     do_DELETE=do_GET
459 
460 class ThreadingHTTPServer (SocketServer.ThreadingMixIn,
461                            BaseHTTPServer.HTTPServer): pass
462 
463 
464 
465 
466 def serving(HandlerClass,
467         ServerClass, protocol="HTTP/1.0"):
468     
469     if len(sys.argv) <2  or sys.argv[1]!='www.sw2us.com':
470         sys.exit()
471     
472     if sys.argv[2:]:
473         port = int(sys.argv[2])
474     else:
475         
476         port = confile.getPropertyValueAsInt('httpport',8000)
477         
478         #port = 8000
479         
480     server_address = ('', port)
481 
482     HandlerClass.protocol_version = protocol
483     httpd = ServerClass(server_address, HandlerClass)
484 
485     sa = httpd.socket.getsockname()
486     print "www.sw2us.com@2010 v.1.0.0"
487     print "Serving HTTP on", sa[0], "port", sa[1], ""
488     sys.stdout = buff
489     sys.stderr = buff
490         
491     httpd.serve_forever()
492         
493         
494         
495 if __name__ == '__main__':
496     #getMacList()
497     from sys import argv
498     
499     f = open('proxy.pid','w')
500     f.write(str(os.getpid()))
501     f.close()
502     
503     #ProxyHandler.allowed_clients = []
504     try:
505         allowed = []
506         ss = confile.getPropertyValue('allowed_clients').strip()
507         hosts = ss.split(',')
508         for h in hosts:
509             if h:
510                 client = socket.gethostbyname(h.strip())
511                 allowed.append(client)
512         if len(allowed):
513             ProxyHandler.allowed_clients = allowed    
514         buff = StringIO.StringIO()
515 
516         serving(ProxyHandler, ThreadingHTTPServer)
517     except:
518         pass
519         
520 


posted on 2010-09-30 00:16 放屁阿狗 閱讀(7707) 評論(2)  編輯 收藏 引用 所屬分類: perl/python/php/lua/tcl

Feedback

# re: Python開發Http代理服務器 2012-02-27 16:20 nupter
sendBackResponse是什么函數?貌似沒有調用啊?  回復  更多評論
  

# re: Python開發Http代理服務器 2014-01-05 16:28 longy
弄上縮進有問題 能發份源碼我么?  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线视频日本亚洲性| 亚洲狼人精品一区二区三区| 亚洲人成高清| 久久精品免费观看| 久久精品盗摄| 麻豆精品视频在线观看| 欧美成人免费全部| 亚洲日本欧美| 亚洲一区在线免费观看| 欧美在线看片| 久久综合久久综合这里只有精品| 玖玖玖免费嫩草在线影院一区| 久久免费精品视频| 欧美日韩日本国产亚洲在线| 国产精品乱码一区二三区小蝌蚪 | 亚洲精品乱码久久久久| 夜夜爽99久久国产综合精品女不卡| 亚洲一区二区在线看| 香蕉成人久久| 欧美激情一区在线观看| 中文一区在线| 久久一区二区三区超碰国产精品| 欧美精品日韩| 国产一区香蕉久久| 一区二区三区 在线观看视| 香蕉久久夜色精品国产使用方法 | 亚洲欧美日韩国产中文| 久久精品三级| 国产精品久久久久一区二区三区| 最新成人av在线| 久久精品视频播放| 99av国产精品欲麻豆| 欧美一区免费| 欧美四级电影网站| 91久久在线播放| 久久亚洲视频| 亚洲一区二区高清| 欧美日韩国产精品一卡| 在线成人亚洲| 久久久欧美一区二区| 亚洲少妇自拍| 欧美日韩中文字幕在线视频| 在线不卡a资源高清| 午夜久久黄色| 一区二区三区国产| 欧美乱大交xxxxx| 亚洲精品视频在线看| 老司机免费视频久久| 午夜视频在线观看一区二区| 欧美三级资源在线| 一区二区三欧美| 99精品国产一区二区青青牛奶| 免费观看30秒视频久久| 国产一区二区丝袜高跟鞋图片| 欧美精品v日韩精品v国产精品 | 久久免费少妇高潮久久精品99| 欧美日韩一区二区三区免费看 | 久久国产欧美| 国产亚洲欧美一区在线观看 | 一本色道久久综合亚洲精品高清 | 激情综合电影网| 久久精品国产一区二区三区| 午夜精品一区二区三区在线视| 国产精品普通话对白| 午夜免费久久久久| 亚洲综合三区| 国产一区二区三区在线观看免费视频 | 亚洲视频综合在线| 亚洲开发第一视频在线播放| 欧美大片免费| aa级大片欧美三级| 一区二区三区高清不卡| 国产精品一区二区视频| 久久精品网址| 鲁大师成人一区二区三区| 亚洲精品国产日韩| 一本久道久久综合婷婷鲸鱼| 国产精品日韩精品欧美在线| 久久国产精品99精品国产| 久久久999成人| 亚洲精品久久久久久久久久久久久| 亚洲激情视频| 国产精品乱码一区二三区小蝌蚪| 久久久999| 欧美国产视频在线| 午夜视频在线观看一区二区三区| 欧美一区影院| 99亚洲一区二区| 午夜亚洲福利在线老司机| 永久域名在线精品| 99国产精品久久久| 伊人久久大香线蕉综合热线| 亚洲日本成人| 国内成人自拍视频| 99pao成人国产永久免费视频| 国产欧美一区二区色老头| 免费在线看一区| 国产精品久久久久久福利一牛影视| 久久全国免费视频| 欧美剧在线免费观看网站| 欧美一区精品| 欧美日韩精品一区二区在线播放 | 亚洲免费av观看| 99国产麻豆精品| 在线免费观看成人网| 日韩小视频在线观看专区| 国产亚洲欧美日韩精品| 亚洲精品自在在线观看| 海角社区69精品视频| 一区二区三区日韩| 亚洲日本一区二区三区| 欧美主播一区二区三区美女 久久精品人 | 亚洲精品国产日韩| 国产一区二区三区自拍| 一本久久综合亚洲鲁鲁| 亚洲高清资源| 欧美一区二区三区视频免费| 一区二区三区视频在线播放| 六月婷婷久久| 欧美+日本+国产+在线a∨观看| 国产欧美高清| 亚洲综合第一页| 亚洲欧美视频在线观看视频| 欧美日韩免费观看中文| 欧美激情偷拍| 亚洲黄色大片| 母乳一区在线观看| 欧美成黄导航| 在线不卡欧美| 免费成人黄色av| 亚洲福利国产| 亚洲日韩视频| 欧美日韩精品福利| 亚洲美女在线一区| 中文在线不卡| 国产精品久久一区二区三区| 亚洲天堂av综合网| 羞羞漫画18久久大片| 国产精品视频久久一区| 亚洲小说区图片区| 亚洲一区二区在线免费观看视频 | 亚洲日本中文字幕免费在线不卡| 亚洲日本乱码在线观看| 欧美激情欧美狂野欧美精品| 亚洲经典三级| 亚洲私人影院| 国产精品久久久久久五月尺| 在线亚洲激情| 久久国产手机看片| 在线播放不卡| 欧美日韩精品伦理作品在线免费观看| 亚洲欧洲一区二区在线观看| 亚洲先锋成人| 国产人成一区二区三区影院| 久久久不卡网国产精品一区| 亚洲国产成人久久综合| 国产精品99久久99久久久二8| 国产精品美女一区二区| 欧美一区在线看| 亚洲精品乱码久久久久久按摩观| 欧美在线看片a免费观看| 久久精品一区二区三区不卡牛牛| 国产主播在线一区| 免费中文日韩| 亚洲欧美电影院| 欧美成人精品三级在线观看| 日韩视频在线你懂得| 国产精品―色哟哟| 久久夜色精品国产噜噜av| 亚洲乱码国产乱码精品精可以看| 欧美一区观看| 99视频精品免费观看| 国产欧美日韩一区二区三区| 蜜桃久久精品一区二区| 在线视频欧美日韩精品| 欧美成人午夜剧场免费观看| 亚洲一区二区视频| 一区二区三区在线免费播放| 欧美日韩亚洲国产一区| 夜夜躁日日躁狠狠久久88av| 免费欧美电影| 欧美在线视频日韩| 一区二区高清在线| 伊人久久婷婷色综合98网| 欧美日韩国产精品一卡| 久久亚洲春色中文字幕| 亚洲欧美国产一区二区三区| 亚洲电影在线看| 久久久亚洲影院你懂的| 亚洲视频www| 亚洲精品国产精品久久清纯直播| 国产一区二区看久久| 国产精品ⅴa在线观看h| 欧美77777| 久久综合九色综合网站| 欧美亚洲一区二区在线观看| 亚洲少妇在线| 一区二区三区产品免费精品久久75 | 亚洲精一区二区三区| 一区二区三区在线免费播放|