[o2on-svn] [173] Proxy Server: POST に対応

Back to archive index

o2on svn commit o2on-****@lists*****
2009年 9月 30日 (水) 17:47:33 JST


Revision: 173
          http://sourceforge.jp/projects/o2on/svn/view?view=rev&revision=173
Author:   nawota
Date:     2009-09-30 17:47:33 +0900 (Wed, 30 Sep 2009)

Log Message:
-----------
Proxy Server: POST に対応
Admin Server: /dats を実装
lib/o2on_dat: class dat に title を取得する関数 title を追加
強制終了時に強制終了するスレッドの名前を表示

Modified Paths:
--------------
    trunk/opy2on/lib/o2on_dat.py
    trunk/opy2on/lib/o2on_server.py
    trunk/opy2on/opy2on.py

Modified: trunk/opy2on/lib/o2on_dat.py
===================================================================
--- trunk/opy2on/lib/o2on_dat.py	2009-09-22 11:39:48 UTC (rev 172)
+++ trunk/opy2on/lib/o2on_dat.py	2009-09-30 08:47:33 UTC (rev 173)
@@ -52,6 +52,27 @@
             return os.path.join(o2on_config.DatDir, self.domain, self.board, 
                                 self.datnum[:4],self.datnum+".dat")
         raise Exception
+    def title(self):
+        dp = self.datpath()
+        if os.path.exists(dp):         f=open(dp)
+        elif os.path.exists(dp+".gz"): f=gzip.GzipFile(dp+".gz")
+        else: f=None
+        if f:
+            first=f.readline()
+            f.close()
+            m = re.compile(r'^.*<>.*<>.*<>.*<>(.*)$').match(first)
+            if not m: return None
+            try:
+                first = first.decode('cp932').encode('utf-8')
+            except UnicodeDecodeError, inst:
+                try:
+                    first = first.decode('euc_jp').encode('utf-8')
+                except UnicodeDecodeError, inst: 
+                    first = first.decode('cp932','opy2on_replace').encode('utf-8')
+            m = re.compile(r'^.*<>.*<>.*<>.*<>(.*)$').match(first)
+            if not m: return None
+            return m.group(1)
+        return None
     def data(self):
         dp = self.datpath()
         if os.path.exists(dp):         f=open(dp)

Modified: trunk/opy2on/lib/o2on_server.py
===================================================================
--- trunk/opy2on/lib/o2on_server.py	2009-09-22 11:39:48 UTC (rev 172)
+++ trunk/opy2on/lib/o2on_server.py	2009-09-30 08:47:33 UTC (rev 173)
@@ -162,7 +162,7 @@
         for r in remove:
             if r in hr: del hr[r]
         conn = httplib.HTTPConnection(loc)
-        conn.request("GET",p.path, None, hr)
+        conn.request(self.command, p.path, self.rfile.read(), hr)
         return conn
     def msg(self,r):
         res = ''
@@ -215,13 +215,17 @@
         m = re.compile(r'^.*<>.*<>.*<>.*<>(.*)$').match(first)
         if not m: return ""
         return m.group(1)
+    def do_POST(self):
+        self.do_GET()
     def do_GET(self):
         logger = self.server.glob.logger
         logger.log("PROXY", "proxy requested %s" % self.path)
         ut = self.urltype()
         if ut in (self.URLTYPE_UNKNOWN, self.URLTYPE_NORMAL, self.URLTYPE_MACHI):
+            # 普通のプロキシとして動作
             self.normal_proxy()
             return
+        # datがリクエストされた
         try:
             conn = self.get_connection()
             r= conn.getresponse()
@@ -235,6 +239,7 @@
             if r and ut != self.URLTYPE_OFFLAW and r.status in (200,206,304):
                 logger.log("PROXY", "\tgot response from server")
                 data = r.read()
+                # gzipをdecode
                 if r.getheader("content-encoding") == "gzip":
                     sf = StringIO.StringIO(data)
                     dec = gzip.GzipFile(fileobj=sf)
@@ -891,6 +896,50 @@
 </div>
 """)
         self.wfile.write(self.html_footer)
+    def dats(self, args):
+        self.send_common("dats", "Dat")
+        if len(args)==0:
+            regBoard = re.compile(r'^\t[^\t.]+\.([^\t]+)\t([^\t]+)\t([^\t]+)$')
+            inul = False
+            f=open(o2on_config.Path2channel_brd)
+            for line in f:
+                m = regBoard.match(line)
+                if m:
+                    boardname = m.group(3).decode('cp932').encode('utf-8')
+                    if os.path.exists(os.path.join(o2on_config.DatDir, 
+                                                   m.group(1), m.group(2))):
+                        self.wfile.write("<li><a href=\"/dats/%s/%s\">%s</a></li>\n" % \
+                                             (m.group(1), m.group(2), boardname))
+                    else:
+                        self.wfile.write("<li>%s</li>\n" % boardname)
+                else:
+                    pos = line.find("\t")
+                    if pos == -1: continue
+                    if inul: self.wfile.write("</ul>\n")
+                    else: self.wfile.write("<ul>\n")
+                    inul = True
+                    self.wfile.write("<li>%s<ul>\n" % \
+                                         (line[:pos].decode("cp932").encode('utf-8')))
+            f.close()
+            self.wfile.write("</ul>\n")
+            self.wfile.write(self.html_footer)
+        elif len(args)==2:
+            regdat = re.compile('^(\d+)\.dat(?:\.gz)?$')
+            self.wfile.write("<table><tr><th>スレタイ</th><th>URL</th></tr>")
+            for root,dirs,files in os.walk(os.path.join(o2on_config.DatDir,
+                                                        args[0],
+                                                        args[1])):
+                for f in files:
+                    m=regdat.match(f)
+                    path = args[0]+"/"+args[1]+"/"+m.group(1)
+                    dkhash = o2on_util.datkeyhash(path)
+                    dat = self.server.glob.datdb.get(dkhash)
+                    if dat:
+                        self.wfile.write("<tr><td>%s</td><td>http://xxx.%s/test/read.cgi/%s/%s/</td>\n" % \
+                                             (dat.title() or "Unknown Title",
+                                              args[0], args[1], m.group(1)))
+            self.wfile.write("</table>\n")
+            self.wfile.write(self.html_footer)
     def status(self,args):
         self.send_common("status", "Status Summary")
         glob = self.server.glob

Modified: trunk/opy2on/opy2on.py
===================================================================
--- trunk/opy2on/opy2on.py	2009-09-22 11:39:48 UTC (rev 172)
+++ trunk/opy2on/opy2on.py	2009-09-30 08:47:33 UTC (rev 173)
@@ -196,7 +196,7 @@
         shutcount += 1
         if o2on_config.ForceShutdown != None and \
                 o2on_config.ForceShutdown / 8 < shutcount: 
-            glob.logger.popup("GLOBAL", "Force Shutdown")
+            glob.logger.popup("GLOBAL", "Force Shutdown %s" % j.name)
             j.shutdown()
     c += 1
     glob.logger.log("GLOBAL", "Finished %d/%d" % (c, n))




o2on-svn メーリングリストの案内
Back to archive index