From e5108d0f632df170e938f100078dcb7a788b2504 Mon Sep 17 00:00:00 2001 From: Sebastian Lohff Date: Mon, 9 Apr 2012 15:32:57 +0200 Subject: [PATCH] Added HEAD support --- servefile | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/servefile b/servefile index e5b91f6..2fd966b 100755 --- a/servefile +++ b/servefile @@ -10,6 +10,7 @@ __version__ = '0.3.2' import argparse import BaseHTTPServer import commands +import datetime import urllib import os import SocketServer @@ -17,20 +18,42 @@ import socket from stat import ST_SIZE from subprocess import Popen, PIPE import sys +import time + +def getDateStrNow(): + """ Get the current time formatted for HTTP header """ + now = datetime.datetime.fromtimestamp(time.mktime(time.gmtime())) + return now.strftime("%a, %d %b %Y %H:%M:%S GMT") class FileHandler(BaseHTTPServer.BaseHTTPRequestHandler): fileName = "Undefined" filePath = "/dev/null" fileLength = 0 + startTime = getDateStrNow() blockSize = 1024 * 1024 - - def do_GET(self): + + + def checkAndDoRedirect(self): + """ If request didn't request self.fileName redirect to self.fileName. + + Returns True if a redirect was issued. """ if urllib.unquote(self.path) != "/" + self.fileName: self.send_response(302) self.send_header('Location', '/' + self.fileName) self.end_headers() + return True + return False + + def do_HEAD(self): + if self.checkAndDoRedirect(): return + self.send_response(200) + self.send_header('Content-Length', self.fileLength) + self.send_header('Last-Modified', self.startTime) + self.send_header('Content-Type', 'application/octet-stream') + self.end_headers() + def do_GET(self): myfile = open(self.filePath, 'rb') # find out if this is a continuing download @@ -61,7 +84,7 @@ class FileHandler(BaseHTTPServer.BaseHTTPRequestHandler): self.send_response(200) self.send_header('Content-Length', self.fileLength) self.send_header('Content-Disposition', 'attachment; filename="%s"' % self.fileName) - self.send_header('Content-type', 'application/octet-stream') + self.send_header('Content-Type', 'application/octet-stream') self.send_header('Content-Transfer-Encoding', ' binary') self.end_headers() block = self.getChunk(myfile, fromto)