Skip to content

Commit

Permalink
Update woof script to use Threading model rather than forking.
Browse files Browse the repository at this point in the history
  • Loading branch information
pipoket committed Mar 8, 2012
1 parent 28adc7b commit 66e509f
Showing 1 changed file with 60 additions and 69 deletions.
129 changes: 60 additions & 69 deletions bin/woof
Expand Up @@ -22,19 +22,19 @@
# Darwin support with the help from Mat Caughron, <mat@phpconsulting.com>
# Solaris support by Colin Marquardt, <colin.marquardt@zmd.de>
# FreeBSD support with the help from Andy Gimblett, <A.M.Gimblett@swansea.ac.uk>
# Cygwin support by Stefan Reichör <stefan@xsteve.at>
# Cygwin support by Stefan Reich철r <stefan@xsteve.at>
# tarfile usage suggested by Morgan Lefieux <comete@geekandfree.org>
# File upload support loosely based on code from Stephen English <steve@secomputing.co.uk>

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

Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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.
if maxdownloads < 1:
httpd.shutdown()

cpid = os.fork ()

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

Expand All @@ -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)
Expand All @@ -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 ()



Expand Down Expand Up @@ -488,19 +488,10 @@ 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__':
try:
main ()
except KeyboardInterrupt:
pass

pass

0 comments on commit 66e509f

Please sign in to comment.