#!/usr/local/bin/python import os import stat import sys import BaseHTTPServer import string import email.feedparser global gImageDirPath class HTTPError (Exception): def __init__(self, statusCode, statusMessage=None): self.statusCode = statusCode self.statusMessage = statusMessage class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_PUT(self): print "Server has accepted a client." global gImageDirPath try: assert self.path[0] == "/" fileName = self.path[1:] if fileName.translate(string.maketrans("", ""), string.ascii_letters + string.digits + "_") != ".": # Non-alphanumeric characters must be limited to exactly # one dot, that is, the extension delimiter. raise HTTPError(403) # These Content-Type comparisons are too naive (they should be # case insensitive, and they should ignore training parameters), # but this is only a test server, not a real server. contentType = self.headers.get('Content-Type') if contentType == None or (contentType not in ["image/png", "image/jpeg", "image/gif"]): raise HTTPError(406) if contentType == "image/png" and not fileName.endswith(".png"): raise HTTPError(406) if contentType == "image/jpeg" and not fileName.endswith(".jpg"): raise HTTPError(406) contentLength = self.headers.get('Content-Length') if contentLength == None: raise HTTPError(411) try: fileLength = int(contentLength) print "fileLength == " + contentLength assert fileLength > 0 except: raise HTTPError(411) filePath = os.path.join(gImageDirPath, fileName) print "filePath == \"" + filePath + "\"" fileExists = os.path.exists(filePath) imageFile = open(filePath, "w") # Transfer the data in MB chunks to prevent us being run out of # memory with large files. bytesReadSoFar = 0 while bytesReadSoFar != fileLength: bytesToRead = (fileLength - bytesReadSoFar) if bytesToRead > (1024 * 1024): bytesToRead = (1024 * 1024) data = self.rfile.read(bytesToRead) bytesReadSoFar += len(data) imageFile.write(data) data = None imageFile.close() if fileExists: self.send_response(200) else: self.send_response(201) self.end_headers() # Change the mode bits of the downloaded image file to r--r--r--. os.chmod(filePath, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) except HTTPError, e: self.send_error(e.statusCode, e.statusMessage) except: self.send_error(500, "Internal Server Error") def main(): global gImageDirPath gImageDirPath = os.path.join(os.curdir, "images") print "gImageDirPath == \"" + gImageDirPath + "\"" if not os.path.exists(gImageDirPath): os.mkdir(gImageDirPath) server = BaseHTTPServer.HTTPServer(('', 3000), MyHandler) print "Server is running on i5.nyu.edu." try: server.serve_forever() except KeyboardInterrupt: print "" if __name__ == "__main__": main()