76 lines
1.8 KiB
Ruby
76 lines
1.8 KiB
Ruby
require 'travis/api/app'
|
|
|
|
class Travis::Api::App
|
|
class Middleware
|
|
class Rewrite < Middleware
|
|
FORMAT = %r(\.(json|xml|png|txt|atom|svg)$)
|
|
V1_REPO_URL = %r(^(/[^/]+/[^/]+(?:/builds(?:/[\d]+)?|/cc)?)$)
|
|
|
|
helpers :accept
|
|
|
|
set(:setup) { ActiveRecord::Base.logger = Travis.logger }
|
|
|
|
before do
|
|
extract_format
|
|
rewrite_v1_repo_segment if v1? || xml?
|
|
rewrite_v1_named_repo_image_path if png? || svg?
|
|
end
|
|
|
|
after do
|
|
redirect_v1_named_repo_path if (v1? || xml?) && not_found?
|
|
end
|
|
|
|
private
|
|
|
|
def extract_format
|
|
env['PATH_INFO'].sub!(FORMAT, '')
|
|
env['travis.format_from_path'] = $1
|
|
env['travis.format'] = $1 || accept_format
|
|
end
|
|
|
|
def rewrite_v1_repo_segment
|
|
env['PATH_INFO'].sub!(%r(^/repositories), '/repos')
|
|
end
|
|
|
|
def rewrite_v1_named_repo_image_path
|
|
env['PATH_INFO'].sub!(V1_REPO_URL) { "/repos#{$1}" }
|
|
end
|
|
|
|
def redirect_v1_named_repo_path
|
|
if request.path =~ V1_REPO_URL
|
|
force_redirect("/repositories#{$1}.#{env['travis.format']}")
|
|
end
|
|
end
|
|
|
|
def force_redirect(path)
|
|
path += "?#{request.query_string}" unless request.query_string.empty?
|
|
response.body = ''
|
|
response['Content-Length'] = '0'
|
|
response['Content-Type'] = ''
|
|
redirect(path)
|
|
end
|
|
|
|
def png?
|
|
env['travis.format'] == 'png'
|
|
end
|
|
|
|
def svg?
|
|
env['travis.format'] == 'svg'
|
|
end
|
|
|
|
def xml?
|
|
env['travis.format'] == 'xml'
|
|
end
|
|
|
|
def atom?
|
|
env['travis.format'] == 'atom'
|
|
end
|
|
|
|
def v1?
|
|
accept_version == 'v1'
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|