Kaleeswaran Kaleeswaran - 17 days ago 3
Git Question

JGit HTTPS cloning is not working

I am having the Geritt GitHub Url : https://mycompany.com/gerrit/p/my-services.git

I cloned via terminal it is working fine : git clone https://mycompany.com/gerrit/p/my-services.git

When I use the java code to clone using JGit , It is throwing error like "UnknownHostException",

I am wondering when I clone in Terminal(https://mycompany.com/gerrit/p/my-services.git) it is working fine, But When I try it with JGit , it is throwing error ? Why it is not recognizing that domain on JGit ?

Error log is,

org.eclipse.jgit.api.errors.TransportException: https://mycompany.com/gerrit/p/my-services.git: cannot open git-upload-pack
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:137)
at org.eclipse.jgit.api.CloneCommand.fetch(CloneCommand.java:178)
at org.eclipse.jgit.api.CloneCommand.call(CloneCommand.java:125)
at com.test.AppTest.importGit(AppTest.java:128)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:115)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)
at $Proxy0.invoke(Unknown Source)
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150)
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)
Caused by: org.eclipse.jgit.errors.TransportException: https://mycompany.com/gerrit/p/my-services.git: cannot open git-upload-pack
at org.eclipse.jgit.transport.TransportHttp.connect(TransportHttp.java:499)
at org.eclipse.jgit.transport.TransportHttp.openFetch(TransportHttp.java:308)
at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:136)
at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:122)
at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1105)
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:128)
... 34 more
Caused by: java.net.UnknownHostException: mycompany.com
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:570)
at sun.net.NetworkClient.doConnect(NetworkClient.java:158)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:411)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:525)
at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:272)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:329)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:172)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:966)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:158)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
at org.eclipse.jgit.util.HttpSupport.response(HttpSupport.java:167)
at org.eclipse.jgit.transport.TransportHttp.connect(TransportHttp.java:462)
... 39 more


My code is,

// I am using the below code to trust all the https urls,

// Create a trust manager that does not validate certificate chains

TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};

// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (GeneralSecurityException e) {

}


String url = "https://mycompany.com/gerrit/p/my-services.git";
String username = "username";
String password = "password";
String checkoutLocation = "/Users/testing";
String branch = "my-services-sample-test";

UsernamePasswordCredentialsProvider userCredential = new UsernamePasswordCredentialsProvider(username, password);
Git r = Git.cloneRepository().setDirectory(new File(checkoutLocation + "/clonned"))
.setCredentialsProvider(userCredential)
.setURI(url)
.setProgressMonitor(new TextProgressMonitor())
.setBranch(branch)
.call();
System.out.println("Clonning @ " + checkoutLocation);
r.getRepository().close();


I am usign the dependency

<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>3.0.0.201306101825-r</version>
<scope>compile</scope>
</dependency>

Answer

I got the solution. An Eclipse community member gave me some ideas on it.

Here's that thread: http://www.eclipse.org/forums/index.php/m/1176786/#msg_1176786

I needed to set the proxy configuration for JGit, using the ProxySelector class.

ProxySelector.setDefault(new ProxySelector(){
    final ProxySelector delegate = ProxySelector.getDefault();

    @Override
    public List<Proxy> select(URI uri) {
        // Filter the URIs to be proxied

        if (uri.toString().contains("github") && uri.toString().contains("https")) {
            return Arrays.asList(new Proxy(Type.HTTP,
              InetSocketAddress.createUnresolved("localhost", 3128)));
        }
        if (uri.toString().contains("github") & uri.toString().contains("http")) {
            return Arrays.asList(new Proxy(Type.HTTP,
              InetSocketAddress.createUnresolved("localhost", 3129)));
        }

        // revert to the default behaviour
        return delegate == null ? Arrays.asList(Proxy.NO_PROXY) : delegate.select(uri);
    }

    @Override
    public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
        if (uri == null || sa == null || ioe == null) {
            throw new IllegalArgumentException("Arguments can't be null.");
        }
    }
});

In my case "localhost"/3128 and localhost"/3129 were the HTTPS and HTTP proxy URL/Port respectively, that I wanted to use.

Ref: JGit proxy configuration in code

It worked well.