summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xwoof124
1 files changed, 58 insertions, 66 deletions
diff --git a/woof b/woof
index 770231c..5f68177 100755
--- a/woof
+++ b/woof
@@ -28,13 +28,13 @@
import sys, os, errno, socket, getopt, commands, tempfile
import cgi, urllib, BaseHTTPServer
+from SocketServer import ThreadingMixIn
import ConfigParser
import shutil, tarfile, zipfile
import struct
maxdownloads = 1
TM = object
-cpid = -1
compressed = 'gz'
upload = False
@@ -137,6 +137,11 @@ class FileServHTTPRequestHandler (BaseHTTPServer.BaseHTTPRequestHandler):
self.send_error (501, "Unsupported method (POST)")
return
+ maxdownloads -= 1
+
+ if maxdownloads < 1:
+ httpd.shutdown()
+
# taken from
# http://mail.python.org/pipermail/python-list/2006-September/402441.html
@@ -200,13 +205,11 @@ class FileServHTTPRequestHandler (BaseHTTPServer.BaseHTTPRequestHandler):
self.end_headers ()
self.wfile.write (txt)
- maxdownloads -= 1
-
return
def do_GET (self):
- global maxdownloads, cpid, compressed, upload
+ global maxdownloads, compressed, upload
# Form for uploading a file
if upload:
@@ -260,63 +263,62 @@ class FileServHTTPRequestHandler (BaseHTTPServer.BaseHTTPRequestHandler):
maxdownloads -= 1
- # let a separate process handle the actual download, so that
- # multiple downloads can happen simultaneously.
-
- cpid = os.fork ()
+ if maxdownloads < 1:
+ httpd.shutdown()
- if cpid == 0:
- # Child process
- child = None
- type = None
-
- if os.path.isfile (self.filename):
- type = "file"
- elif os.path.isdir (self.filename):
- type = "dir"
+ type = None
+
+ if os.path.isfile (self.filename):
+ type = "file"
+ elif os.path.isdir (self.filename):
+ type = "dir"
- if not type:
- print >> sys.stderr, "can only serve files or directories. Aborting."
- sys.exit (1)
+ if not type:
+ print >> sys.stderr, "can only serve files or directories. Aborting."
+ sys.exit (1)
- self.send_response (200)
- self.send_header ("Content-Type", "application/octet-stream")
- if os.path.isfile (self.filename):
- self.send_header ("Content-Length",
- os.path.getsize (self.filename))
- self.end_headers ()
+ self.send_response (200)
+ self.send_header ("Content-Type", "application/octet-stream")
+ if os.path.isfile (self.filename):
+ self.send_header ("Content-Length",
+ os.path.getsize (self.filename))
+ self.end_headers ()
- try:
- if type == "file":
- datafile = file (self.filename)
- shutil.copyfileobj (datafile, self.wfile)
- datafile.close ()
- elif type == "dir":
- if compressed == 'zip':
- ezfile = EvilZipStreamWrapper (self.wfile)
- zfile = zipfile.ZipFile (ezfile, 'w', zipfile.ZIP_DEFLATED)
- stripoff = os.path.dirname (self.filename) + os.sep
-
- for root, dirs, files in os.walk (self.filename):
- for f in files:
- filename = os.path.join (root, f)
- if filename[:len (stripoff)] != stripoff:
- raise RuntimeException, "invalid filename assumptions, please report!"
- zfile.write (filename, filename[len (stripoff):])
- zfile.close ()
- else:
- tfile = tarfile.open (mode=('w|' + compressed),
- fileobj=self.wfile)
- tfile.add (self.filename,
- arcname=os.path.basename(self.filename))
- tfile.close ()
- except Exception, e:
- print e
- print >>sys.stderr, "Connection broke. Aborting"
+ try:
+ if type == "file":
+ datafile = file (self.filename)
+ shutil.copyfileobj (datafile, self.wfile)
+ datafile.close ()
+ elif type == "dir":
+ if compressed == 'zip':
+ ezfile = EvilZipStreamWrapper (self.wfile)
+ zfile = zipfile.ZipFile (ezfile, 'w', zipfile.ZIP_DEFLATED)
+ stripoff = os.path.dirname (self.filename) + os.sep
+
+ for root, dirs, files in os.walk (self.filename):
+ for f in files:
+ filename = os.path.join (root, f)
+ if filename[:len (stripoff)] != stripoff:
+ raise RuntimeException, "invalid filename assumptions, please report!"
+ zfile.write (filename, filename[len (stripoff):])
+ zfile.close ()
+ else:
+ tfile = tarfile.open (mode=('w|' + compressed),
+ fileobj=self.wfile)
+ tfile.add (self.filename,
+ arcname=os.path.basename(self.filename))
+ tfile.close ()
+ except Exception, e:
+ print e
+ print >>sys.stderr, "Connection broke. Aborting"
+
+
+class ThreadedHTTPServer(ThreadingMixIn, BaseHTTPServer.HTTPServer):
+ """Handle requests in a separate thread"""
def serve_files (filename, maxdown = 1, ip_addr = '', port = 8080):
- global maxdownloads
+ global maxdownloads, httpd
maxdownloads = maxdown
@@ -326,8 +328,7 @@ def serve_files (filename, maxdown = 1, ip_addr = '', port = 8080):
FileServHTTPRequestHandler.filename = filename
try:
- httpd = BaseHTTPServer.HTTPServer ((ip_addr, port),
- FileServHTTPRequestHandler)
+ httpd = ThreadedHTTPServer ((ip_addr, port), FileServHTTPRequestHandler)
except socket.error:
print >>sys.stderr, "cannot bind to IP address '%s' port %d" % (ip_addr, port)
sys.exit (1)
@@ -337,8 +338,7 @@ def serve_files (filename, maxdown = 1, ip_addr = '', port = 8080):
if ip_addr:
print "Now serving on http://%s:%s/" % (ip_addr, httpd.server_port)
- while cpid != 0 and maxdownloads > 0:
- httpd.handle_request ()
+ httpd.serve_forever ()
@@ -488,14 +488,6 @@ def main ():
serve_files (filename, maxdown, ip_addr, port)
- # wait for child processes to terminate
- if cpid != 0:
- try:
- while 1:
- os.wait ()
- except OSError:
- pass
-
if __name__=='__main__':