Mercurial > jhg
comparison src/org/tmatesoft/hg/internal/remote/HttpConnector.java @ 698:822f3a83ff57
in, out and clone tests pass for ssh repositories. Infrastructure to decouple HgRemoteRepository from specific Connector implementation
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 06 Aug 2013 21:18:33 +0200 |
parents | 24f4efedc9d5 |
children | a483b2b68a2e |
comparison
equal
deleted
inserted
replaced
697:24f4efedc9d5 | 698:822f3a83ff57 |
---|---|
26 import java.io.InputStreamReader; | 26 import java.io.InputStreamReader; |
27 import java.io.OutputStream; | 27 import java.io.OutputStream; |
28 import java.io.SequenceInputStream; | 28 import java.io.SequenceInputStream; |
29 import java.net.HttpURLConnection; | 29 import java.net.HttpURLConnection; |
30 import java.net.MalformedURLException; | 30 import java.net.MalformedURLException; |
31 import java.net.URI; | |
31 import java.net.URL; | 32 import java.net.URL; |
32 import java.net.URLConnection; | 33 import java.net.URLConnection; |
33 import java.security.cert.CertificateException; | 34 import java.security.cert.CertificateException; |
34 import java.security.cert.X509Certificate; | 35 import java.security.cert.X509Certificate; |
35 import java.util.Collection; | 36 import java.util.Collection; |
54 * | 55 * |
55 * @author Artem Tikhomirov | 56 * @author Artem Tikhomirov |
56 * @author TMate Software Ltd. | 57 * @author TMate Software Ltd. |
57 */ | 58 */ |
58 public class HttpConnector implements Connector { | 59 public class HttpConnector implements Connector { |
60 private URI uri; | |
59 private URL url; | 61 private URL url; |
60 private SSLContext sslContext; | 62 private SSLContext sslContext; |
61 private String authInfo; | 63 private String authInfo; |
62 private boolean debug; | 64 private boolean debug; |
63 private SessionContext sessionCtx; | 65 private SessionContext sessionCtx; |
64 // | 66 // |
65 private HttpURLConnection conn; | 67 private HttpURLConnection conn; |
66 | 68 |
67 public void init(URL url, SessionContext sessionContext, Object globalConfig) throws HgRuntimeException { | 69 public void init(URI uri, SessionContext sessionContext, Object globalConfig) throws HgRuntimeException { |
68 this.url = url; | 70 this.uri = uri; |
69 sessionCtx = sessionContext; | 71 sessionCtx = sessionContext; |
70 debug = new PropertyMarshal(sessionCtx).getBoolean("hg4j.remote.debug", false); | 72 debug = new PropertyMarshal(sessionCtx).getBoolean("hg4j.remote.debug", false); |
71 if (url.getUserInfo() != null) { | 73 if (uri.getUserInfo() != null) { |
72 String ai = null; | 74 String ai = null; |
73 try { | 75 try { |
74 // Hack to get Base64-encoded credentials | 76 // Hack to get Base64-encoded credentials |
75 Preferences tempNode = Preferences.userRoot().node("xxx"); | 77 Preferences tempNode = Preferences.userRoot().node("xxx"); |
76 tempNode.putByteArray("xxx", url.getUserInfo().getBytes()); | 78 tempNode.putByteArray("xxx", uri.getUserInfo().getBytes()); |
77 ai = tempNode.get("xxx", null); | 79 ai = tempNode.get("xxx", null); |
78 tempNode.removeNode(); | 80 tempNode.removeNode(); |
79 } catch (BackingStoreException ex) { | 81 } catch (BackingStoreException ex) { |
80 sessionContext.getLog().dump(getClass(), Info, ex, null); | 82 sessionContext.getLog().dump(getClass(), Info, ex, null); |
81 // IGNORE | 83 // IGNORE |
85 authInfo = null; | 87 authInfo = null; |
86 } | 88 } |
87 } | 89 } |
88 | 90 |
89 public void connect() throws HgRemoteConnectionException, HgRuntimeException { | 91 public void connect() throws HgRemoteConnectionException, HgRuntimeException { |
92 try { | |
93 url = uri.toURL(); | |
94 } catch (MalformedURLException ex) { | |
95 throw new HgRemoteConnectionException("Bad URL", ex); | |
96 } | |
90 if ("https".equals(url.getProtocol())) { | 97 if ("https".equals(url.getProtocol())) { |
91 try { | 98 try { |
92 sslContext = SSLContext.getInstance("SSL"); | 99 sslContext = SSLContext.getInstance("SSL"); |
93 class TrustEveryone implements X509TrustManager { | 100 class TrustEveryone implements X509TrustManager { |
94 public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { | 101 public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { |
130 conn = null; | 137 conn = null; |
131 } | 138 } |
132 } | 139 } |
133 | 140 |
134 public String getServerLocation() { | 141 public String getServerLocation() { |
135 if (url.getUserInfo() == null) { | 142 if (uri.getUserInfo() == null) { |
136 return url.toExternalForm(); | 143 return uri.toString(); |
137 } | 144 } |
138 if (url.getPort() != -1) { | 145 if (uri.getPort() != -1) { |
139 return String.format("%s://%s:%d%s", url.getProtocol(), url.getHost(), url.getPort(), url.getPath()); | 146 return String.format("%s://%s:%d%s", uri.getScheme(), uri.getHost(), uri.getPort(), uri.getPath()); |
140 } else { | 147 } else { |
141 return String.format("%s://%s%s", url.getProtocol(), url.getHost(), url.getPath()); | 148 return String.format("%s://%s%s", uri.getScheme(), uri.getHost(), uri.getPath()); |
142 } | 149 } |
143 } | 150 } |
144 | 151 |
145 public String getCapabilities() throws HgRemoteConnectionException { | 152 public String getCapabilities() throws HgRemoteConnectionException { |
146 // say hello to server, check response | 153 // say hello to server, check response |
292 return new FilterOutputStream(conn.getOutputStream()) { | 299 return new FilterOutputStream(conn.getOutputStream()) { |
293 public void close() throws IOException { | 300 public void close() throws IOException { |
294 super.close(); | 301 super.close(); |
295 if (debug) { | 302 if (debug) { |
296 dumpResponseHeader(u); | 303 dumpResponseHeader(u); |
297 dumpResponse(); | |
298 } | 304 } |
299 try { | 305 try { |
300 checkResponseOk("Push", CMD_UNBUNDLE); | 306 checkResponseOk("Push", CMD_UNBUNDLE); |
301 } catch (HgRemoteConnectionException ex) { | 307 } catch (HgRemoteConnectionException ex) { |
302 IOException e = new IOException(ex.getMessage()); | 308 IOException e = new IOException(ex.getMessage()); |
393 final Map<String, List<String>> headerFields = conn.getHeaderFields(); | 399 final Map<String, List<String>> headerFields = conn.getHeaderFields(); |
394 for (String s : headerFields.keySet()) { | 400 for (String s : headerFields.keySet()) { |
395 System.out.printf("%s: %s\n", s, conn.getHeaderField(s)); | 401 System.out.printf("%s: %s\n", s, conn.getHeaderField(s)); |
396 } | 402 } |
397 } | 403 } |
398 | |
399 private void dumpResponse() throws IOException { | |
400 if (conn.getContentLength() > 0) { | |
401 final Object content = conn.getContent(); | |
402 System.out.println(content); | |
403 } | |
404 } | |
405 } | 404 } |