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.http.server;
45
46 import static org.eclipse.jgit.util.HttpSupport.ENCODING_GZIP;
47 import static org.eclipse.jgit.util.HttpSupport.HDR_ACCEPT_ENCODING;
48 import static org.eclipse.jgit.util.HttpSupport.HDR_CONTENT_ENCODING;
49 import static org.eclipse.jgit.util.HttpSupport.HDR_ETAG;
50 import static org.eclipse.jgit.util.HttpSupport.TEXT_PLAIN;
51
52 import java.io.ByteArrayOutputStream;
53 import java.io.IOException;
54 import java.io.InputStream;
55 import java.io.OutputStream;
56 import java.security.MessageDigest;
57 import java.text.MessageFormat;
58 import java.util.zip.GZIPInputStream;
59 import java.util.zip.GZIPOutputStream;
60
61 import javax.servlet.ServletRequest;
62 import javax.servlet.http.HttpServletRequest;
63 import javax.servlet.http.HttpServletResponse;
64
65 import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
66 import org.eclipse.jgit.lib.Constants;
67 import org.eclipse.jgit.lib.ObjectId;
68 import org.eclipse.jgit.lib.Repository;
69
70
71 public final class ServletUtils {
72
73 public static final String ATTRIBUTE_REPOSITORY = "org.eclipse.jgit.Repository";
74
75
76 public static final String ATTRIBUTE_HANDLER = "org.eclipse.jgit.transport.UploadPackOrReceivePack";
77
78
79
80
81
82
83
84
85
86
87
88
89
90 public static Repository getRepository(final ServletRequest req) {
91 Repository db = (Repository) req.getAttribute(ATTRIBUTE_REPOSITORY);
92 if (db == null)
93 throw new IllegalStateException(HttpServerText.get().expectedRepositoryAttribute);
94 return db;
95 }
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 public static InputStream getInputStream(final HttpServletRequest req)
111 throws IOException {
112 InputStream in = req.getInputStream();
113 final String enc = req.getHeader(HDR_CONTENT_ENCODING);
114 if (ENCODING_GZIP.equals(enc) || "x-gzip".equals(enc))
115 in = new GZIPInputStream(in);
116 else if (enc != null)
117 throw new IOException(MessageFormat.format(HttpServerText.get().encodingNotSupportedByThisLibrary
118 , HDR_CONTENT_ENCODING, enc));
119 return in;
120 }
121
122
123
124
125
126
127
128 public static void consumeRequestBody(HttpServletRequest req) {
129 if (0 < req.getContentLength() || isChunked(req)) {
130 try {
131 consumeRequestBody(req.getInputStream());
132 } catch (IOException e) {
133
134 }
135 }
136 }
137
138 static boolean isChunked(HttpServletRequest req) {
139 return "chunked".equals(req.getHeader("Transfer-Encoding"));
140 }
141
142
143
144
145
146
147
148 public static void consumeRequestBody(InputStream in) {
149 if (in == null)
150 return;
151 try {
152 while (0 < in.skip(2048) || 0 <= in.read()) {
153
154 }
155 } catch (IOException err) {
156
157 } finally {
158 try {
159 in.close();
160 } catch (IOException err) {
161
162 }
163 }
164 }
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188 public static void sendPlainText(final String content,
189 final HttpServletRequest req, final HttpServletResponse rsp)
190 throws IOException {
191 final byte[] raw = content.getBytes(Constants.CHARACTER_ENCODING);
192 rsp.setContentType(TEXT_PLAIN);
193 rsp.setCharacterEncoding(Constants.CHARACTER_ENCODING);
194 send(raw, req, rsp);
195 }
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217 public static void send(byte[] content, final HttpServletRequest req,
218 final HttpServletResponse rsp) throws IOException {
219 content = sendInit(content, req, rsp);
220 final OutputStream out = rsp.getOutputStream();
221 try {
222 out.write(content);
223 out.flush();
224 } finally {
225 out.close();
226 }
227 }
228
229 private static byte[] sendInit(byte[] content,
230 final HttpServletRequest req, final HttpServletResponse rsp)
231 throws IOException {
232 rsp.setHeader(HDR_ETAG, etag(content));
233 if (256 < content.length && acceptsGzipEncoding(req)) {
234 content = compress(content);
235 rsp.setHeader(HDR_CONTENT_ENCODING, ENCODING_GZIP);
236 }
237 rsp.setContentLength(content.length);
238 return content;
239 }
240
241 static boolean acceptsGzipEncoding(final HttpServletRequest req) {
242 return acceptsGzipEncoding(req.getHeader(HDR_ACCEPT_ENCODING));
243 }
244
245 static boolean acceptsGzipEncoding(String accepts) {
246 if (accepts == null)
247 return false;
248
249 int b = 0;
250 while (b < accepts.length()) {
251 int comma = accepts.indexOf(',', b);
252 int e = 0 <= comma ? comma : accepts.length();
253 String term = accepts.substring(b, e).trim();
254 if (term.equals(ENCODING_GZIP))
255 return true;
256 b = e + 1;
257 }
258 return false;
259 }
260
261 private static byte[] compress(final byte[] raw) throws IOException {
262 final int maxLen = raw.length + 32;
263 final ByteArrayOutputStream out = new ByteArrayOutputStream(maxLen);
264 final GZIPOutputStream gz = new GZIPOutputStream(out);
265 gz.write(raw);
266 gz.finish();
267 gz.flush();
268 return out.toByteArray();
269 }
270
271 private static String etag(final byte[] content) {
272 final MessageDigest md = Constants.newMessageDigest();
273 md.update(content);
274 return ObjectId.fromRaw(md.digest()).getName();
275 }
276
277 static String identify(Repository git) {
278 if (git instanceof DfsRepository) {
279 return ((DfsRepository) git).getDescription().getRepositoryName();
280 } else if (git.getDirectory() != null) {
281 return git.getDirectory().getPath();
282 }
283 return "unknown";
284 }
285
286 private ServletUtils() {
287
288 }
289 }