您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

RawPage.java 8.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /*
  2. * Copyright 2011 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit.wicket.pages;
  17. import java.io.IOException;
  18. import java.io.UnsupportedEncodingException;
  19. import java.net.URLEncoder;
  20. import java.text.MessageFormat;
  21. import java.util.HashMap;
  22. import java.util.Map;
  23. import javax.servlet.http.HttpServletResponse;
  24. import org.apache.wicket.IRequestTarget;
  25. import org.apache.wicket.PageParameters;
  26. import org.apache.wicket.RequestCycle;
  27. import org.apache.wicket.protocol.http.WebRequest;
  28. import org.apache.wicket.protocol.http.WebResponse;
  29. import org.apache.wicket.protocol.http.servlet.AbortWithWebErrorCodeException;
  30. import org.eclipse.jgit.lib.Repository;
  31. import org.eclipse.jgit.revwalk.RevCommit;
  32. import org.slf4j.Logger;
  33. import org.slf4j.LoggerFactory;
  34. import com.gitblit.Keys;
  35. import com.gitblit.models.RepositoryModel;
  36. import com.gitblit.models.UserModel;
  37. import com.gitblit.utils.JGitUtils;
  38. import com.gitblit.utils.StringUtils;
  39. import com.gitblit.wicket.GitBlitWebSession;
  40. import com.gitblit.wicket.WicketUtils;
  41. public class RawPage extends SessionPage {
  42. private transient Logger logger;
  43. String contentType;
  44. public RawPage(final PageParameters params) {
  45. super(params);
  46. if (!params.containsKey("r")) {
  47. error(getString("gb.repositoryNotSpecified"));
  48. redirectToInterceptPage(new RepositoriesPage());
  49. }
  50. getRequestCycle().setRequestTarget(new IRequestTarget() {
  51. @Override
  52. public void detach(RequestCycle requestCycle) {
  53. }
  54. @Override
  55. public void respond(RequestCycle requestCycle) {
  56. WebResponse response = (WebResponse) requestCycle.getResponse();
  57. final String repositoryName = WicketUtils.getRepositoryName(params);
  58. final String objectId = WicketUtils.getObject(params);
  59. final String blobPath = WicketUtils.getPath(params);
  60. String[] encodings = getEncodings();
  61. GitBlitWebSession session = GitBlitWebSession.get();
  62. UserModel user = session.getUser();
  63. RepositoryModel model = app().repositories().getRepositoryModel(user, repositoryName);
  64. if (model == null) {
  65. // user does not have permission
  66. error(getString("gb.canNotLoadRepository") + " " + repositoryName);
  67. redirectToInterceptPage(new RepositoriesPage());
  68. return;
  69. }
  70. Repository r = app().repositories().getRepository(repositoryName);
  71. if (r == null) {
  72. error(getString("gb.canNotLoadRepository") + " " + repositoryName);
  73. redirectToInterceptPage(new RepositoriesPage());
  74. return;
  75. }
  76. if (StringUtils.isEmpty(blobPath)) {
  77. // objectid referenced raw view
  78. byte [] binary = JGitUtils.getByteContent(r, objectId);
  79. if (binary == null) {
  80. final String objectNotFound = MessageFormat.format("Raw page failed to find object {0} in {1}",
  81. objectId, repositoryName);
  82. logger().error(objectNotFound);
  83. throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, objectNotFound);
  84. }
  85. contentType = "application/octet-stream";
  86. response.setContentType(contentType);
  87. response.setContentLength(binary.length);
  88. try {
  89. response.getOutputStream().write(binary);
  90. } catch (Exception e) {
  91. logger().error("Failed to write binary response", e);
  92. }
  93. } else {
  94. // standard raw blob view
  95. RevCommit commit = JGitUtils.getCommit(r, objectId);
  96. if (commit == null) {
  97. final String commitNotFound = MessageFormat.format("Raw page failed to find commit {0} in {1}",
  98. objectId, repositoryName);
  99. logger().error(commitNotFound);
  100. throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, commitNotFound);
  101. }
  102. String filename = blobPath;
  103. if (blobPath.indexOf('/') > -1) {
  104. filename = blobPath.substring(blobPath.lastIndexOf('/') + 1);
  105. }
  106. String extension = null;
  107. if (blobPath.lastIndexOf('.') > -1) {
  108. extension = blobPath.substring(blobPath.lastIndexOf('.') + 1);
  109. }
  110. // Map the extensions to types
  111. Map<String, Integer> map = new HashMap<String, Integer>();
  112. for (String ext : app().settings().getStrings(Keys.web.imageExtensions)) {
  113. map.put(ext.toLowerCase(), 2);
  114. }
  115. for (String ext : app().settings().getStrings(Keys.web.binaryExtensions)) {
  116. map.put(ext.toLowerCase(), 3);
  117. }
  118. final String blobNotFound = MessageFormat.format("Raw page failed to find blob {0} in {1} @ {2}",
  119. blobPath, repositoryName, objectId);
  120. if (extension != null) {
  121. int type = 0;
  122. if (map.containsKey(extension)) {
  123. type = map.get(extension);
  124. }
  125. switch (type) {
  126. case 2:
  127. // image blobs
  128. byte[] image = JGitUtils.getByteContent(r, commit.getTree(), blobPath, true);
  129. if (image == null) {
  130. logger().error(blobNotFound);
  131. throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
  132. }
  133. contentType = "image/" + extension.toLowerCase();
  134. response.setContentType(contentType);
  135. response.setContentLength(image.length);
  136. try {
  137. response.getOutputStream().write(image);
  138. } catch (IOException e) {
  139. logger().error("Failed to write image response", e);
  140. }
  141. break;
  142. case 3:
  143. // binary blobs (download)
  144. byte[] binary = JGitUtils.getByteContent(r, commit.getTree(), blobPath, true);
  145. if (binary == null) {
  146. logger().error(blobNotFound);
  147. throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
  148. }
  149. contentType = "application/octet-stream";
  150. response.setContentLength(binary.length);
  151. response.setContentType(contentType);
  152. try {
  153. WebRequest request = (WebRequest) requestCycle.getRequest();
  154. String userAgent = request.getHttpServletRequest().getHeader("User-Agent");
  155. if (userAgent != null && userAgent.indexOf("MSIE 5.5") > -1) {
  156. response.setHeader("Content-Disposition", "filename=\""
  157. + URLEncoder.encode(filename, "UTF-8") + "\"");
  158. } else if (userAgent != null && userAgent.indexOf("MSIE") > -1) {
  159. response.setHeader("Content-Disposition", "attachment; filename=\""
  160. + URLEncoder.encode(filename, "UTF-8") + "\"");
  161. } else {
  162. response.setHeader("Content-Disposition", "attachment; filename=\""
  163. + new String(filename.getBytes("UTF-8"), "latin1") + "\"");
  164. }
  165. }
  166. catch (UnsupportedEncodingException e) {
  167. response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
  168. }
  169. try {
  170. response.getOutputStream().write(binary);
  171. } catch (IOException e) {
  172. logger().error("Failed to write binary response", e);
  173. }
  174. break;
  175. default:
  176. // plain text
  177. String content = JGitUtils.getStringContent(r, commit.getTree(),
  178. blobPath, encodings);
  179. if (content == null) {
  180. logger().error(blobNotFound);
  181. throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
  182. }
  183. contentType = "text/plain; charset=UTF-8";
  184. response.setContentType(contentType);
  185. try {
  186. response.getOutputStream().write(content.getBytes("UTF-8"));
  187. } catch (Exception e) {
  188. logger().error("Failed to write text response", e);
  189. }
  190. }
  191. } else {
  192. // plain text
  193. String content = JGitUtils.getStringContent(r, commit.getTree(), blobPath,
  194. encodings);
  195. if (content == null) {
  196. logger().error(blobNotFound);
  197. throw new AbortWithWebErrorCodeException(HttpServletResponse.SC_NOT_FOUND, blobNotFound);
  198. }
  199. contentType = "text/plain; charset=UTF-8";
  200. response.setContentType(contentType);
  201. try {
  202. response.getOutputStream().write(content.getBytes("UTF-8"));
  203. } catch (Exception e) {
  204. logger().error("Failed to write text response", e);
  205. }
  206. }
  207. }
  208. r.close();
  209. }
  210. });
  211. }
  212. protected Logger logger() {
  213. if (logger == null) {
  214. logger = LoggerFactory.getLogger(getClass());
  215. }
  216. return logger;
  217. }
  218. @Override
  219. protected void setHeaders(WebResponse response) {
  220. super.setHeaders(response);
  221. if (!StringUtils.isEmpty(contentType)) {
  222. response.setContentType(contentType);
  223. }
  224. }
  225. }