Statistics
| Branch: | Revision:

root / simplerevisionserver / webdavserver.py @ 25a2053d

History | View | Annotate | Download (2.3 kB)

1
#! /usr/bin/env python
2
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
8
9
class WebDAVRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
10
        def do_GET(self):
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'])
15
                        if m:
16
                                start = int(m.group(1))
17
                                end = int(m.group(2))
18
                                f = self.send_range_head(start, end)
19
                                if f:
20
                                        self.copyfilerange(f, self.wfile, start,
21
                                                        end)
22
                                        f.close()
23
                                return
24
                return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
25
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)
34
35
                self.writeresponse(res)
36
37
        def do_OPTIONS(self):
38
                req = self.parseinputxml()
39
                print req
40
                self.send_response(200)
41
                self.send_header("DAV", "1");
42
                self.end_headers()
43
                self.wfile.close()
44
45
        def parseinputxml(self):
46
                try:
47
                        contentlength = int(self.headers['content-length'])
48
                except:
49
                        return None
50
                data = self.rfile.read(contentlength)
51
                print data
52
                return xml.etree.ElementTree.fromstring(data)
53
                
54
        def writeresponse(self, response):
55
                self.send_response(200)
56
                self.send_header("Content-Type", 'text/xml; charset="utf-8"')
57
                self.end_headers()
58
                response.write(self.wfile, 'utf-8')
59
#                response.write(sys.stdout, 'utf-8')
60
#                sys.stdout.flush()
61
                d = xml.etree.ElementTree.tostring(response.getroot(), 'utf-8')
62
                print d
63
                self.wfile.close()
64
65
        def addresponse(self, path, root, depth):
66
                e = SubElement(root, QName("DAV:", 'response'))
67
                href = SubElement(e, QName("DAV:", 'href'))
68
                href.text = path
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'))
73
74
if __name__ == '__main__':
75
        server_address = ('', 8080)
76
        httpd = BaseHTTPServer.HTTPServer(server_address, WebDAVRequestHandler)
77
        httpd.serve_forever()