Allow to download logs in plain text

This commit is contained in:
Piotr Sarnacki 2013-01-15 02:23:02 +01:00
parent 16499b30ff
commit 70cd6ef092
5 changed files with 43 additions and 2 deletions

View File

@ -29,7 +29,7 @@ class Travis::Api::App
end
def responders(resource, options)
[:Service, :Json, :Image, :Xml].map do |name|
[:Service, :Json, :Image, :Xml, :Plain].map do |name|
Responders.const_get(name)
end
end

View File

@ -3,7 +3,7 @@ require 'travis/api/app'
class Travis::Api::App
class Middleware
class Rewrite < Middleware
FORMAT = %r(\.(json|xml|png)$)
FORMAT = %r(\.(json|xml|png|txt)$)
V1_REPO_URL = %r(^(/[^/]+/[^/]+(?:/builds(?:/[\d]+)?|/cc)?)$)
helpers :accept

View File

@ -5,6 +5,7 @@ class Travis::Api::App
autoload :Base, 'travis/api/app/responders/base'
autoload :Image, 'travis/api/app/responders/image'
autoload :Json, 'travis/api/app/responders/json'
autoload :Plain, 'travis/api/app/responders/plain'
autoload :Service, 'travis/api/app/responders/service'
autoload :Xml, 'travis/api/app/responders/xml'
end

View File

@ -0,0 +1,22 @@
module Travis::Api::App::Responders
class Plain < Base
def apply?
# make sure that we don't leak anything by processing only Artifact::Log
# instances here. I don't want to create entire new API builder just
# for log's content for now.
#
# TODO: think how to handle other formats correctly
options[:format] == 'txt' && resource.is_a?(Artifact::Log)
end
def apply
filename = resource.id
disposition = params[:attachment] ? 'attachment' : 'inline'
headers['Content-Disposition'] = %(#{disposition}; filename="#{filename}")
endpoint.content_type 'text/plain'
halt resource.content
end
end
end

View File

@ -9,4 +9,22 @@ describe Travis::Api::App::Endpoint::Artifacts do
get("/artifacts/#{id}", {}, 'HTTP_ACCEPT' => 'application/vnd.travis-ci.2+json, */*; q=0.01').should be_ok
end
end
describe 'GET /artifacts/:id.txt' do
it 'loads the artifact' do
response = get("/artifacts/#{id}.txt", {})
response.should be_ok
response.body.should == artifact.content
response.headers['Content-Disposition'].should == "inline; filename=\"#{artifact.id}\""
end
it 'sets Content-Disposition to attachment with attachment=true param' do
response = get("/artifacts/#{id}.txt", {'attachment' => true})
response.should be_ok
response.body.should == artifact.content
response.headers['Content-Disposition'].should == "attachment; filename=\"#{artifact.id}\""
end
end
end