Show More
@@ -25,6 +25,7 b'' | |||||
25 |
|
25 | |||
26 | import os |
|
26 | import os | |
27 | import logging |
|
27 | import logging | |
|
28 | import mimetypes | |||
28 | import rhodecode.lib.helpers as h |
|
29 | import rhodecode.lib.helpers as h | |
29 |
|
30 | |||
30 | from pylons import request, response, session, tmpl_context as c, url |
|
31 | from pylons import request, response, session, tmpl_context as c, url | |
@@ -157,7 +158,43 b' class FilesController(BaseRepoController' | |||||
157 | cs = self.__get_cs_or_redirect(revision, repo_name) |
|
158 | cs = self.__get_cs_or_redirect(revision, repo_name) | |
158 | file_node = self.__get_filenode_or_redirect(repo_name, cs, f_path) |
|
159 | file_node = self.__get_filenode_or_redirect(repo_name, cs, f_path) | |
159 |
|
160 | |||
160 | response.content_type = 'text/plain' |
|
161 | raw_mimetype_mapping = { | |
|
162 | # map original mimetype to a mimetype used for "show as raw" | |||
|
163 | # you can also provide a content-disposition to override the | |||
|
164 | # default "attachment" disposition. | |||
|
165 | # orig_type: (new_type, new_dispo) | |||
|
166 | ||||
|
167 | # show images inline: | |||
|
168 | 'image/x-icon': ('image/x-icon', 'inline'), | |||
|
169 | 'image/png': ('image/png', 'inline'), | |||
|
170 | 'image/gif': ('image/gif', 'inline'), | |||
|
171 | 'image/jpeg': ('image/jpeg', 'inline'), | |||
|
172 | 'image/svg+xml': ('image/svg+xml', 'inline'), | |||
|
173 | } | |||
|
174 | ||||
|
175 | mimetype = file_node.mimetype | |||
|
176 | try: | |||
|
177 | mimetype, dispo = raw_mimetype_mapping[mimetype] | |||
|
178 | except KeyError: | |||
|
179 | # we don't know anything special about this, handle it safely | |||
|
180 | if file_node.is_binary: | |||
|
181 | # do same as download raw for binary files | |||
|
182 | mimetype, dispo = 'application/octet-stream', 'attachment' | |||
|
183 | else: | |||
|
184 | # do not just use the original mimetype, but force text/plain, | |||
|
185 | # otherwise it would serve text/html and that might be unsafe. | |||
|
186 | # Note: underlying vcs library fakes text/plain mimetype if the | |||
|
187 | # mimetype can not be determined and it thinks it is not binary. | |||
|
188 | # This might lead to erroneous text display in some cases, but | |||
|
189 | # helps in other cases, like with text files without extension. | |||
|
190 | mimetype, dispo = 'text/plain', 'inline' | |||
|
191 | ||||
|
192 | if dispo == 'attachment': | |||
|
193 | dispo = 'attachment; filename=%s' % \ | |||
|
194 | f_path.split(os.sep)[-1].encode('utf8', 'replace') | |||
|
195 | ||||
|
196 | response.content_disposition = dispo | |||
|
197 | response.content_type = mimetype | |||
161 | return file_node.content |
|
198 | return file_node.content | |
162 |
|
199 | |||
163 | def annotate(self, repo_name, revision, f_path): |
|
200 | def annotate(self, repo_name, revision, f_path): |
@@ -64,7 +64,7 b'' | |||||
64 | </div> |
|
64 | </div> | |
65 | <div class="code-body"> |
|
65 | <div class="code-body"> | |
66 | %if c.file.is_binary: |
|
66 | %if c.file.is_binary: | |
67 | ${_('Binary file')} |
|
67 | ${_('Binary file (%s)') % c.file.mimetype} | |
68 | %else: |
|
68 | %else: | |
69 | % if c.file.size < c.cut_off_limit: |
|
69 | % if c.file.size < c.cut_off_limit: | |
70 | ${h.pygmentize_annotation(c.repo_name,c.file,linenos=True,anchorlinenos=True,lineanchors='S',cssclass="code-highlight")} |
|
70 | ${h.pygmentize_annotation(c.repo_name,c.file,linenos=True,anchorlinenos=True,lineanchors='S',cssclass="code-highlight")} |
@@ -37,7 +37,7 b'' | |||||
37 | </div> |
|
37 | </div> | |
38 | <div class="code-body"> |
|
38 | <div class="code-body"> | |
39 | %if c.files_list.is_binary: |
|
39 | %if c.files_list.is_binary: | |
40 | ${_('Binary file')} |
|
40 | ${_('Binary file (%s)') % c.files_list.mimetype} | |
41 | %else: |
|
41 | %else: | |
42 | % if c.files_list.size < c.cut_off_limit: |
|
42 | % if c.files_list.size < c.cut_off_limit: | |
43 | ${h.pygmentize(c.files_list,linenos=True,anchorlinenos=True,lineanchors='L',cssclass="code-highlight")} |
|
43 | ${h.pygmentize(c.files_list,linenos=True,anchorlinenos=True,lineanchors='L',cssclass="code-highlight")} |
General Comments 0
You need to be logged in to leave comments.
Login now