1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 package org.eclipse.jgit.junit.http;
45
46 import java.net.URI;
47 import java.net.URISyntaxException;
48
49 import javax.servlet.http.HttpServletRequest;
50
51 import org.eclipse.jetty.servlet.ServletContextHandler;
52 import org.eclipse.jetty.servlet.ServletHolder;
53 import org.eclipse.jgit.errors.RepositoryNotFoundException;
54 import org.eclipse.jgit.http.server.GitServlet;
55 import org.eclipse.jgit.lib.Repository;
56 import org.eclipse.jgit.transport.URIish;
57 import org.eclipse.jgit.transport.resolver.RepositoryResolver;
58 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
59
60
61
62
63
64 public class SimpleHttpServer {
65
66 AppServer server;
67
68 private final Repository db;
69
70 private URIish uri;
71
72 private URIish secureUri;
73
74
75
76
77
78
79 public SimpleHttpServer(Repository repository) {
80 this(repository, false);
81 }
82
83
84
85
86
87
88
89 public SimpleHttpServer(Repository repository, boolean withSsl) {
90 this.db = repository;
91 server = new AppServer(0, withSsl ? 0 : -1);
92 }
93
94
95
96
97
98
99 public void start() throws Exception {
100 ServletContextHandler sBasic = server.authBasic(smart("/sbasic"));
101 server.setUp();
102 final String srcName = db.getDirectory().getName();
103 uri = toURIish(sBasic, srcName);
104 int sslPort = server.getSecurePort();
105 if (sslPort > 0) {
106 secureUri = uri.setPort(sslPort).setScheme("https");
107 }
108 }
109
110
111
112
113
114
115 public void stop() throws Exception {
116 server.tearDown();
117 }
118
119
120
121
122
123
124 public URIish getUri() {
125 return uri;
126 }
127
128
129
130
131
132
133 public URIish getSecureUri() {
134 return secureUri;
135 }
136
137 private ServletContextHandler smart(String path) {
138 GitServlet gs = new GitServlet();
139 gs.setRepositoryResolver(new RepositoryResolver<HttpServletRequest>() {
140 @Override
141 public Repository open(HttpServletRequest req, String name)
142 throws RepositoryNotFoundException,
143 ServiceNotEnabledException {
144 if (!name.equals(nameOf(db)))
145 throw new RepositoryNotFoundException(name);
146
147 db.incrementOpen();
148 return db;
149 }
150 });
151
152 ServletContextHandler ctx = server.addContext(path);
153 ctx.addServlet(new ServletHolder(gs), "/*");
154 return ctx;
155 }
156
157 private static String nameOf(Repository db) {
158 return db.getDirectory().getName();
159 }
160
161 private URIish toURIish(String path) throws URISyntaxException {
162 URI u = server.getURI().resolve(path);
163 return new URIish(u.toString());
164 }
165
166 private URIish toURIish(ServletContextHandler app, String name)
167 throws URISyntaxException {
168 String p = app.getContextPath();
169 if (!p.endsWith("/") && !name.startsWith("/"))
170 p += "/";
171 p += name;
172 return toURIish(p);
173 }
174 }