]> source.dussan.org Git - jgit.git/commitdiff
Add API to permit the setting of additional HTTP headers 09/23409/5
authorBogdan Gheorghe <gheorghe@ca.ibm.com>
Fri, 14 Mar 2014 20:00:25 +0000 (16:00 -0400)
committerMatthias Sohn <matthias.sohn@sap.com>
Fri, 25 Apr 2014 23:01:58 +0000 (19:01 -0400)
Signed-off-by: Bogdan Gheorghe <gheorghe@ca.ibm.com>
Change-Id: I1047f318bb5c63850f45ba85d73c97fe8bf70a6c

org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SetAdditionalHeadersTest.java [new file with mode: 0644]
org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java

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 (file)
index 0000000..5be7834
--- /dev/null
@@ -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());
+       }
+
+}
index 83ad971f787d27b4c51dde473fa9e391fcbeeb1b..19b3ab6a7837197941a238cf3680221eb1a9811c 100644 (file)
@@ -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;
        }