<pierre.vi...@postfinance.ch> writes: > The status line is not blocked. The debugging message means that we > have got an header with a null key and with the status line as value: > in this case the header is not added to the request sent back to the > client. This seems to be common that some HTTP Implementations return > such a null key header in the list of headers of a request.
I've never seen Apache send a second status line. Perhaps the message about null key applies to this mysterious line in the trace: ch.nevis.session.secroles: auth.strong,idma_Benutzer,infplat_user,esclienttest_r oleBC,esclienttest_roleA,esclienttest_roleB,depo_Admin,itam_Leser,itam_Administr ator,itsms_asset_viewer,itsms_svc_req_usr,testsaml_admin,global.allow,acc.idma,a cc.infplat,acc.esclienttest,acc.depo,acc.itam,acc.itsms,acc.testsaml I see that every response also has: Connection: close This looks as if you do not have KeepAlive enabled on the server, or perhaps the proxy does not support pipelining. That is going to result in poor performance for clients that use serf. All the above is probably irrelevant to the problem. I've converted your trace into a Python script to implement a server that behaves like yours. The first, larger, OPTIONS response is a typical response from a server that supports Subversion's v2 protocol. The second, smaller, OPTIONS response is the client probing to see if chunked transfer encoding is upported. All the subsequent PROPFINDS are v1 protocol and this is where it gets tricky. Using a standard 1.8 client against this dummy server gives: $ svn ls http://127.0.0.1:7777/svn/t_sponis_testrepo svn: E175009: XML Parsing failed: Unexpected root element 'multistatus' That's because the client sends v2 requests and the v1 responses do not match. Now I have a debug client and I can force v1 using $ SVN_I_LIKE_LATENCY_SO_IGNORE_HTTPV2=yes svn ls http://127.0.0.1:7777/svn/t_sponis_testrepo branches/ tags/ trunk/ Your client will not have the debug code to do that. How is your client switching to the v1 protocol? Either your proxy is not forwarding the SVN-Me-Resource header or your client is patched to ignore v2, which ever it is your environment is non-standard. How does your client respond when run against this dummy server? (You must restart the dummy server after a client fail so that responses match the requests.)
#!/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()
-- Philip Martin | Subversion Committer WANdisco // *Non-Stop Data*