#!/usr/bin/python
import SocketServer
import re

class MyTCPHandler(SocketServer.StreamRequestHandler):

  responses = [
    ('HTTP/1.1 200 OK\r\n'
     'SVN-Repository-MergeInfo: yes\r\n'
     'SVN-Allow-Bulk-Updates: On\r\n'
     'SVN-Rev-Root-Stub: /svn/t_sponis_testrepo/!svn/rvr\r\n'
     'Content-Length: 201\r\n'
     'SVN-Txn-Root-Stub: /svn/t_sponis_testrepo/!svn/txr\r\n'
     'SVN-VTxn-Root-Stub: /svn/t_sponis_testrepo/!svn/vtxr\r\n'
     'SVN-Repository-UUID: 0926ec5e-c495-11e3-b81a-bb1aca739395\r\n'
     'Connection: close\r\n'
     'Server: Apache\r\n'
     'DAV: 1,2, version-control,checkout,working-resource, merge,baseline,activity,version-controlled-collection, http://subversion.tigris.org/xmlns/dav/svn/depth, http://subversion.tigris.org/xmlns/dav/svn/log-revprops, http://subversion.tigris.org/xmlns/dav/svn/atomic-revprops, http://subversion.tigris.org/xmlns/dav/svn/partial-replay, http://subversion.tigris.org/xmlns/dav/svn/inherited-props, http://subversion.tigris.org/xmlns/dav/svn/inline-props, http://subversion.tigris.org/xmlns/dav/svn/reverse-file-revs, http://subversion.tigris.org/xmlns/dav/svn/mergeinfo, http://subversion.tigris.org/xmlns/dav/svn/ephemeral-txnprops, http://subversion.tigris.org/xmlns/dav/svn/replay-rev-resource\r\n'
     'SVN-VTxn-Stub: /svn/t_sponis_testrepo/!svn/vtxn\r\n'
     'SVN-Rev-Stub: /svn/t_sponis_testrepo/!svn/rev\r\n'
     'MS-Author-Via: DAV\r\n'
     'SVN-Me-Resource: /svn/t_sponis_testrepo/!svn/me\r\n'
     'Date: Tue, 06 Jan 2015 14:43:25 GMT\r\n'
     'SVN-Txn-Stub: /svn/t_sponis_testrepo/!svn/txn\r\n'
     'Allow: OPTIONS,GET,HEAD,POST,DELETE,TRACE,PROPFIND,PROPPATCH,COPY,MOVE,LOCK,UNLOCK,CHECKOUT\r\n'
     'SVN-Repository-Root: /svn/t_sponis_testrepo\r\n'
     'SVN-Supported-Posts: create-txn, create-txn-with-props\r\n'
     'Content-Type: text/xml; charset="utf-8\r\n'
     'SVN-Youngest-Rev: 16\r\n'
     '\r\n'
     '<?xml version="1.0" encoding="utf-8"?>\n'
     '<D:options-response xmlns:D="DAV:">\n'
     '<D:activity-collection-set><D:href>/svn/t_sponis_testrepo/!svn/act/</D:href></D:activity-collection-set></D:options-response>\n'
     ),
    ('HTTP/1.1 200 OK\r\n'
     'DAV: 1,2, version-control,checkout,working-resource, merge,baseline,activity,version-controlled-collection, http://subversion.tigris.org/xmlns/dav/svn/depth, http://subversion.tigris.org/xmlns/dav/svn/log-revprops, http://subversion.tigris.org/xmlns/dav/svn/atomic-revprops, http://subversion.tigris.org/xmlns/dav/svn/partial-replay, http://subversion.tigris.org/xmlns/dav/svn/inherited-props, http://subversion.tigris.org/xmlns/dav/svn/inline-props, http://subversion.tigris.org/xmlns/dav/svn/reverse-file-revs, http://subversion.tigris.org/xmlns/dav/svn/mergeinfo\r\n'
     'MS-Author-Via: DAV\r\n'
     'Date: Tue, 06 Jan 2015 14:43:25 GMT\r\n'
     'Content-Length: 97\r\n'
     'Allow: OPTIONS,GET,HEAD,POST,DELETE,TRACE,PROPFIND,PROPPATCH,COPY,MOVE,LOCK,UNLOCK,CHECKOUT\r\n'
     'Connection: close\r\n'
     'Content-Type: text/xml; charset="utf-8\r\n'
     'Server: Apache\r\n'
     '\r\n'
     '<?xml version="1.0" encoding="utf-8"?>\n'
     '<D:options-response xmlns:D="DAV:">\n'
     '</D:options-response>\n'
     ),
    ('HTTP/1.1 207 Multi-Status\r\n'
     'Date: Tue, 06 Jan 2015 14:43:26 GMT\r\n'
     'Content-Length: 673\r\n'
     'Connection: close\r\n'
     'Content-Type: text/xml; charset="utf-8"\r\n'
     'Server: Apache\r\n'
     '\r\n'
     '<?xml version="1.0" encoding="utf-8"?>\n'
     '<D:multistatus xmlns:D="DAV:" xmlns:ns1="http://subversion.tigris.org/xmlns/dav/" xmlns:ns0="DAV:">\n'
     '<D:response xmlns:lp1="DAV:" xmlns:lp2="http://subversion.tigris.org/xmlns/dav/">\n'
     '<D:href>/svn/t_sponis_testrepo/</D:href>\n'
     '<D:propstat>\n'
     '<D:prop>\n'
     '<lp1:version-controlled-configuration><D:href>/svn/t_sponis_testrepo/!svn/vcc/default</D:href></lp1:version-controlled-configuration>\n'
     '<lp1:resourcetype><D:collection/></lp1:resourcetype>\n'
     '<lp2:baseline-relative-path/>\n'
     '<lp2:repository-uuid>0926ec5e-c495-11e3-b81a-bb1aca739395</lp2:repository-uuid>\n'
     '</D:prop>\n'
     '<D:status>HTTP/1.1 200 OK</D:status>\n'
     '</D:propstat>\n'
     '</D:response>\n'
     '</D:multistatus>\n'
     ),
    ('HTTP/1.1 207 Multi-Status\r\n'
     'Date: Tue, 06 Jan 2015 14:43:26 GMT\r\n'
     'Content-Length: 425\r\n'
     'Connection: close\r\n'
     'Content-Type: text/xml; charset="utf-8"\r\n'
     'Server: Apache\r\n'
     '\r\n'
     '<?xml version="1.0" encoding="utf-8"?>\n'
     '<D:multistatus xmlns:D="DAV:" xmlns:ns0="DAV:">\n'
     '<D:response xmlns:lp1="DAV:" xmlns:lp2="http://subversion.tigris.org/xmlns/dav/">'
     '<D:href>/svn/t_sponis_testrepo/!svn/vcc/default</D:href>\n'
     '<D:propstat>\n'
     '<D:prop>\n'
     '<lp1:checked-in><D:href>/svn/t_sponis_testrepo/!svn/bln/16</D:href></lp1:checked-in>\n'
     '</D:prop>\n'
     '<D:status>HTTP/1.1 200 OK</D:status>\n'
     '</D:propstat>\n'
     '</D:response>\n'
     '</D:multistatus>\n'
     '\n'
     ),
    ('HTTP/1.1 207 Multi-Status\r\n'
     'Date: Tue, 06 Jan 2015 14:43:26 GMT\r\n'
     'Content-Length: 478\r\n'
     'Connection: close\r\n'
     'Content-Type: text/xml; charset="utf-8"\r\n'
     'Server: Apache\r\n'
     '\r\n'
     '<?xml version="1.0" encoding="utf-8"?>\n'
     '<D:multistatus xmlns:D="DAV:" xmlns:ns0="DAV:">\n'
     '<D:response xmlns:lp1="DAV:" xmlns:lp2="http://subversion.tigris.org/xmlns/dav/">\n'
     '<D:href>/svn/t_sponis_testrepo/!svn/bln/16</D:href>\n'
     '<D:propstat>\n'
     '<D:prop>\n'
     '<lp1:baseline-collection><D:href>/svn/t_sponis_testrepo/!svn/bc/16/</D:href></lp1:baseline-collection>\n'
     '<lp1:version-name>16</lp1:version-name>\n'
     '</D:prop>\n'
     '<D:status>HTTP/1.1 200 OK</D:status>\n'
     '</D:propstat>\n'
     '</D:response>\n'
     '</D:multistatus>\n'
     '\n'
      ),
    ('HTTP/1.1 207 Multi-Status\r\n'
     'Date: Tue, 06 Jan 2015 14:43:27 GMT\r\n'
     'Content-Length: 775\r\n'
     'Connection: close\r\n'
     'Content-Type: text/xml; charset="utf-8"\r\n'
     'Server: Apache\r\n'
     '\r\n'
     '<?xml version="1.0" encoding="utf-8"?>\n'
     '<D:multistatus xmlns:D="DAV:" xmlns:ns1="http://subversion.tigris.org/xmlns/dav/" xmlns:ns0="DAV:">\n'
     '<D:response xmlns:lp1="DAV:" xmlns:lp2="http://subversion.tigris.org/xmlns/dav/" xmlns:g0="DAV:">\n'
     '<D:href>/svn/t_sponis_testrepo/!svn/bc/16/</D:href>\n'
     '<D:propstat>\n'
     '<D:prop>\n'
     '<lp1:resourcetype><D:collection/></lp1:resourcetype>\n'
     '<lp2:deadprop-count>0</lp2:deadprop-count>\n'
     '<lp1:version-name>16</lp1:version-name>\n'
     '<lp1:creationdate>2014-12-18T09:42:07.784066Z</lp1:creationdate>\n'
     '<lp1:creator-displayname>viretp</lp1:creator-displayname>\n'
     '</D:prop>\n'
     '<D:status>HTTP/1.1 200 OK</D:status>\n'
     '</D:propstat>\n'
     '<D:propstat>\n'
     '<D:prop>\n'
     '<g0:getcontentlength/>\n'
     '</D:prop>\n'
     '<D:status>HTTP/1.1 404 Not Found</D:status>\n'
     '</D:propstat>\n'
     '</D:response>\n'
     '</D:multistatus>\n'
     '\n'
      ),
    ('HTTP/1.1 207 Multi-Status\r\n'
     'Date: Tue, 06 Jan 2015 14:43:27 GMT\r\n'
     'Content-Length: 1052\r\n'
     'Connection: close\r\n'
     'Content-Type: text/xml; charset="utf-8"\r\n'
     'Server: Apache\r\n'
     '\r\n'
     '<?xml version="1.0" encoding="utf-8"?>\n'
     '<D:multistatus xmlns:D="DAV:" xmlns:ns0="DAV:">\n'
     '<D:response xmlns:lp1="DAV:">\n'
     '<D:href>/svn/t_sponis_testrepo/!svn/bc/16/</D:href>\n'
     '<D:propstat>\n'
     '<D:prop>\n'
     '<lp1:resourcetype><D:collection/></lp1:resourcetype>\n'
     '</D:prop>\n'
     '<D:status>HTTP/1.1 200 OK</D:status>\n'
     '</D:propstat>\n'
     '</D:response>\n'
     '<D:response xmlns:lp1="DAV:">\n'
     '<D:href>/svn/t_sponis_testrepo/!svn/bc/16/trunk/</D:href>\n'
     '<D:propstat>\n'
     '<D:prop>\n'
     '<lp1:resourcetype><D:collection/></lp1:resourcetype>\n'
     '</D:prop>\n'
     '<D:status>HTTP/1.1 200 OK</D:status>\n'
     '</D:propstat>\n'
     '</D:response>\n'
     '<D:response xmlns:lp1="DAV:">\n'
     '<D:href>/svn/t_sponis_testrepo/!svn/bc/16/branches/</D:href>\n'
     '<D:propstat>\n'
     '<D:prop>\n'
     '<lp1:resourcetype><D:collection/></lp1:resourcetype>\n'
     '</D:prop>\n'
     '<D:status>HTTP/1.1 200 OK</D:status>\n'
     '</D:propstat>\n'
     '</D:response>\n'
     '<D:response xmlns:lp1="DAV:">\n'
     '<D:href>/svn/t_sponis_testrepo/!svn/bc/16/tags/</D:href>\n'
     '<D:propstat>\n'
     '<D:prop>\n'
     '<lp1:resourcetype><D:collection/></lp1:resourcetype>\n'
     '</D:prop>\n'
     '<D:status>HTTP/1.1 200 OK</D:status>\n'
     '</D:propstat>\n'
     '</D:response>\n'
     '</D:multistatus>\n'
     '\n'
      ),
    ]
  response = 0
    
  def handle(self):
    clen = None
    chunked = False
    while True:
      self.data = self.rfile.readline().strip()
      print "read: " + self.data
      if self.data == "Transfer-Encoding: chunked":
        chunked = True
      m = re.match('Content-Length: (.*)', self.data)
      if m:
        clen = int(m.group(1))
      if self.data == '':
        break
    if chunked: # Handling one chunk is enough for now
      self.data = self.rfile.readline().strip()
      print "read: " + self.data
      clen = int(self.data, 16)
    if clen:
      self.data = self.rfile.read(clen)
      print "read: " + self.data
    if chunked:
      self.data = self.rfile.readline().strip()
      self.data = self.rfile.readline().strip()
      print "read: " + self.data

    self.wfile.write(MyTCPHandler.responses[MyTCPHandler.response])
    MyTCPHandler.response += 1
    if MyTCPHandler.response == 7:
      MyTCPHandler.response = 0

if __name__ == "__main__":

  SocketServer.TCPServer.allow_reuse_address = True
  server = SocketServer.TCPServer(("localhost", 7777), MyTCPHandler)
  server.serve_forever()

