summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBogdan Gheorghe <gheorghe@ca.ibm.com>2014-03-14 16:00:25 -0400
committerMatthias Sohn <matthias.sohn@sap.com>2014-04-25 19:01:58 -0400
commit8923e67a1680d3a5fd7766cdce90d07bae1a407a (patch)
treef156f8602cb6f24434d1ed1d41e486615c868070
parentcd1f3ecb92482b2ca5c2c9521470ccb10c1d4727 (diff)
downloadjgit-8923e67a1680d3a5fd7766cdce90d07bae1a407a.tar.gz
jgit-8923e67a1680d3a5fd7766cdce90d07bae1a407a.zip
Add API to permit the setting of additional HTTP headers
Signed-off-by: Bogdan Gheorghe <gheorghe@ca.ibm.com> Change-Id: I1047f318bb5c63850f45ba85d73c97fe8bf70a6c
-rw-r--r--org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SetAdditionalHeadersTest.java139
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java18
2 files changed, 157 insertions, 0 deletions
diff --git a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SetAdditionalHeadersTest.java b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SetAdditionalHeadersTest.java
new file mode 100644
index 0000000000..5be7834546
--- /dev/null
+++ b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SetAdditionalHeadersTest.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2014, IBM Corporation
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ * names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.http.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.List;
+
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.junit.http.AccessEvent;
+import org.eclipse.jgit.junit.http.HttpTestCase;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevBlob;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.HttpTransport;
+import org.eclipse.jgit.transport.Transport;
+import org.eclipse.jgit.transport.TransportHttp;
+import org.eclipse.jgit.transport.URIish;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SetAdditionalHeadersTest extends HttpTestCase {
+
+ private URIish remoteURI;
+
+ private RevBlob A_txt;
+
+ private RevCommit A, B;
+
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+
+ final TestRepository<Repository> src = createTestRepository();
+ final File srcGit = src.getRepository().getDirectory();
+ final URI base = srcGit.getParentFile().toURI();
+
+ ServletContextHandler app = server.addContext("/git");
+ app.setResourceBase(base.toString());
+ ServletHolder holder = app.addServlet(DefaultServlet.class, "/");
+ // The tmp directory is symlinked on OS X
+ holder.setInitParameter("aliases", "true");
+ server.setUp();
+
+ remoteURI = toURIish(app, srcGit.getName());
+
+ A_txt = src.blob("A");
+ A = src.commit().add("A_txt", A_txt).create();
+ B = src.commit().parent(A).add("A_txt", "C").add("B", "B").create();
+ src.update(master, B);
+ }
+
+ @Test
+ public void testSetHeaders() throws IOException {
+ Repository dst = createBareRepository();
+
+ assertEquals("http", remoteURI.getScheme());
+
+ Transport t = Transport.open(dst, remoteURI);
+ try {
+ assertTrue("isa TransportHttp", t instanceof TransportHttp);
+ assertTrue("isa HttpTransport", t instanceof HttpTransport);
+
+ HashMap<String, String> headers = new HashMap<String, String>();
+ headers.put("Cookie", "someTokenValue=23gBog34");
+ headers.put("AnotherKey", "someValue");
+ ((TransportHttp) t).setAdditionalHeaders(headers);
+ t.openFetch();
+ } finally {
+ t.close();
+ }
+
+ List<AccessEvent> requests = getRequests();
+ assertEquals(2, requests.size());
+
+ AccessEvent info = requests.get(0);
+ assertEquals("GET", info.getMethod());
+ assertEquals(info.getRequestHeader("Cookie"), "someTokenValue=23gBog34");
+ assertEquals(info.getRequestHeader("AnotherKey"), "someValue");
+ assertEquals(200, info.getStatus());
+
+ info = requests.get(1);
+ assertEquals("GET", info.getMethod());
+ assertEquals(info.getRequestHeader("Cookie"), "someTokenValue=23gBog34");
+ assertEquals(info.getRequestHeader("AnotherKey"), "someValue");
+ assertEquals(200, info.getStatus());
+ }
+
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java
index 83ad971f78..19b3ab6a78 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java
@@ -247,6 +247,8 @@ public class TransportHttp extends HttpTransport implements WalkTransport,
private HttpAuthMethod authMethod = HttpAuthMethod.NONE;
+ private Map<String, String> headers;
+
TransportHttp(final Repository local, final URIish uri)
throws NotSupportedException {
super(local, uri);
@@ -425,6 +427,18 @@ public class TransportHttp extends HttpTransport implements WalkTransport,
// No explicit connections are maintained.
}
+ /**
+ * Set additional headers on the HTTP connection
+ *
+ * @param headers
+ * a map of name:values that are to be set as headers on the HTTP
+ * connection
+ * @since 3.4
+ */
+ public void setAdditionalHeaders(Map<String, String> headers) {
+ this.headers = headers;
+ }
+
private HttpConnection connect(final String service)
throws TransportException, NotSupportedException {
final URL u;
@@ -533,6 +547,10 @@ public class TransportHttp extends HttpTransport implements WalkTransport,
conn.setConnectTimeout(effTimeOut);
conn.setReadTimeout(effTimeOut);
}
+ if (this.headers != null && !this.headers.isEmpty()) {
+ for (Map.Entry<String, String> entry : this.headers.entrySet())
+ conn.setRequestProperty(entry.getKey(), entry.getValue());
+ }
authMethod.configureRequest(conn);
return conn;
}