3 import BaseHTTPServer, SimpleHTTPServer, re, os, sys, xml.etree.ElementTree
4 from xml.etree.ElementTree import Element
5 from xml.etree.ElementTree import ElementTree
6 from xml.etree.ElementTree import QName
7 from xml.etree.ElementTree import SubElement
9 class WebDAVRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
11 # handle headers like Range: bytes=0-1023
12 if 'Range' in self.headers:
13 m = re.match('\s*bytes\s*=\s*(\d+)\s*-\s*(\d+)\s*',
14 self.headers['Range'])
16 start = int(m.group(1))
18 f = self.send_range_head(start, end)
20 self.copyfilerange(f, self.wfile, start,
24 return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
26 def do_PROPFIND(self):
27 print 'PROPFIND ' + self.path
28 for key in self.headers.keys():
29 print key + '\t' + self.headers[key]
30 req = self.parseinputxml()
31 req = ElementTree(req)
32 res = ElementTree(Element(QName("DAV:", 'multistatus')))
33 self.addresponse('/', res.getroot(), 0)
35 self.writeresponse(res)
38 req = self.parseinputxml()
40 self.send_response(200)
41 self.send_header("DAV", "1");
45 def parseinputxml(self):
47 contentlength = int(self.headers['content-length'])
50 data = self.rfile.read(contentlength)
52 return xml.etree.ElementTree.fromstring(data)
54 def writeresponse(self, response):
55 self.send_response(200)
56 self.send_header("Content-Type", 'text/xml; charset="utf-8"')
58 response.write(self.wfile, 'utf-8')
59 # response.write(sys.stdout, 'utf-8')
61 d = xml.etree.ElementTree.tostring(response.getroot(), 'utf-8')
65 def addresponse(self, path, root, depth):
66 e = SubElement(root, QName("DAV:", 'response'))
67 href = SubElement(e, QName("DAV:", 'href'))
69 propstat = SubElement(e, QName("DAV:", 'propstat'))
70 prop = SubElement(propstat, QName("DAV:", 'resourcetype'))
71 if os.path.isdir(path):
72 SubElement(prop, QName("DAV:", 'collection'))
74 if __name__ == '__main__':
75 server_address = ('', 8080)
76 httpd = BaseHTTPServer.HTTPServer(server_address, WebDAVRequestHandler)