You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RawPage.java 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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.util.HashMap;
  21. import java.util.Map;
  22. import org.apache.wicket.IRequestTarget;
  23. import org.apache.wicket.PageParameters;
  24. import org.apache.wicket.RequestCycle;
  25. import org.apache.wicket.protocol.http.WebRequest;
  26. import org.apache.wicket.protocol.http.WebResponse;
  27. import org.eclipse.jgit.lib.Repository;
  28. import org.eclipse.jgit.revwalk.RevCommit;
  29. import org.slf4j.Logger;
  30. import org.slf4j.LoggerFactory;
  31. import com.gitblit.GitBlit;
  32. import com.gitblit.Keys;
  33. import com.gitblit.models.RepositoryModel;
  34. import com.gitblit.models.UserModel;
  35. import com.gitblit.utils.JGitUtils;
  36. import com.gitblit.utils.StringUtils;
  37. import com.gitblit.wicket.GitBlitWebSession;
  38. import com.gitblit.wicket.WicketUtils;
  39. public class RawPage extends SessionPage {
  40. private final Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());
  41. public RawPage(final PageParameters params) {
  42. super(params);
  43. if (!params.containsKey("r")) {
  44. error(getString("gb.repositoryNotSpecified"));
  45. redirectToInterceptPage(new RepositoriesPage());
  46. }
  47. getRequestCycle().setRequestTarget(new IRequestTarget() {
  48. @Override
  49. public void detach(RequestCycle requestCycle) {
  50. }
  51. @Override
  52. public void respond(RequestCycle requestCycle) {
  53. WebResponse response = (WebResponse) requestCycle.getResponse();
  54. final String repositoryName = WicketUtils.getRepositoryName(params);
  55. final String objectId = WicketUtils.getObject(params);
  56. final String blobPath = WicketUtils.getPath(params);
  57. String[] encodings = GitBlit.getEncodings();
  58. GitBlitWebSession session = GitBlitWebSession.get();
  59. UserModel user = session.getUser();
  60. RepositoryModel model = GitBlit.self().getRepositoryModel(user, repositoryName);
  61. if (model == null) {
  62. // user does not have permission
  63. error(getString("gb.canNotLoadRepository") + " " + repositoryName);
  64. redirectToInterceptPage(new RepositoriesPage());
  65. return;
  66. }
  67. Repository r = GitBlit.self().getRepository(repositoryName);
  68. if (r == null) {
  69. error(getString("gb.canNotLoadRepository") + " " + repositoryName);
  70. redirectToInterceptPage(new RepositoriesPage());
  71. return;
  72. }
  73. if (StringUtils.isEmpty(blobPath)) {
  74. // objectid referenced raw view
  75. byte [] binary = JGitUtils.getByteContent(r, objectId);
  76. response.setContentType("application/octet-stream");
  77. response.setContentLength(binary.length);
  78. try {
  79. response.getOutputStream().write(binary);
  80. } catch (Exception e) {
  81. logger.error("Failed to write binary response", e);
  82. }
  83. } else {
  84. // standard raw blob view
  85. RevCommit commit = JGitUtils.getCommit(r, objectId);
  86. String filename = blobPath;
  87. if (blobPath.indexOf('/') > -1) {
  88. filename = blobPath.substring(blobPath.lastIndexOf('/') + 1);
  89. }
  90. String extension = null;
  91. if (blobPath.lastIndexOf('.') > -1) {
  92. extension = blobPath.substring(blobPath.lastIndexOf('.') + 1);
  93. }
  94. // Map the extensions to types
  95. Map<String, Integer> map = new HashMap<String, Integer>();
  96. for (String ext : GitBlit.getStrings(Keys.web.imageExtensions)) {
  97. map.put(ext.toLowerCase(), 2);
  98. }
  99. for (String ext : GitBlit.getStrings(Keys.web.binaryExtensions)) {
  100. map.put(ext.toLowerCase(), 3);
  101. }
  102. if (extension != null) {
  103. int type = 0;
  104. if (map.containsKey(extension)) {
  105. type = map.get(extension);
  106. }
  107. switch (type) {
  108. case 2:
  109. // image blobs
  110. byte[] image = JGitUtils.getByteContent(r, commit.getTree(), blobPath, true);
  111. response.setContentType("image/" + extension.toLowerCase());
  112. response.setContentLength(image.length);
  113. try {
  114. response.getOutputStream().write(image);
  115. } catch (IOException e) {
  116. logger.error("Failed to write image response", e);
  117. }
  118. break;
  119. case 3:
  120. // binary blobs (download)
  121. byte[] binary = JGitUtils.getByteContent(r, commit.getTree(), blobPath, true);
  122. response.setContentLength(binary.length);
  123. response.setContentType("application/octet-stream; charset=UTF-8");
  124. try {
  125. WebRequest request = (WebRequest) requestCycle.getRequest();
  126. String userAgent = request.getHttpServletRequest().getHeader("User-Agent");
  127. if (userAgent != null && userAgent.indexOf("MSIE 5.5") > -1) {
  128. response.setHeader("Content-Disposition", "filename=\""
  129. + URLEncoder.encode(filename, "UTF-8") + "\"");
  130. } else if (userAgent != null && userAgent.indexOf("MSIE") > -1) {
  131. response.setHeader("Content-Disposition", "attachment; filename=\""
  132. + URLEncoder.encode(filename, "UTF-8") + "\"");
  133. } else {
  134. response.setHeader("Content-Disposition", "attachment; filename=\""
  135. + new String(filename.getBytes("UTF-8"), "latin1") + "\"");
  136. }
  137. }
  138. catch (UnsupportedEncodingException e) {
  139. response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
  140. }
  141. try {
  142. response.getOutputStream().write(binary);
  143. } catch (IOException e) {
  144. logger.error("Failed to write binary response", e);
  145. }
  146. break;
  147. default:
  148. // plain text
  149. String content = JGitUtils.getStringContent(r, commit.getTree(),
  150. blobPath, encodings);
  151. response.setContentType("text/plain; charset=UTF-8");
  152. try {
  153. response.getOutputStream().write(content.getBytes("UTF-8"));
  154. } catch (Exception e) {
  155. logger.error("Failed to write text response", e);
  156. }
  157. }
  158. } else {
  159. // plain text
  160. String content = JGitUtils.getStringContent(r, commit.getTree(), blobPath,
  161. encodings);
  162. response.setContentType("text/plain; charset=UTF-8");
  163. try {
  164. response.getOutputStream().write(content.getBytes("UTF-8"));
  165. } catch (Exception e) {
  166. logger.error("Failed to write text response", e);
  167. }
  168. }
  169. }
  170. r.close();
  171. }
  172. });
  173. }
  174. }