require 'sinatra/base' require 'stickler/middleware/index' require 'stickler/repository/mirror' module Stickler::Middleware # # A Mirror server keeps gems from one or more upstream gem servers in local # repositories. # # == Options # # :serve_indexes:: the same as the Index middleware # # :repo_root:: The path that is to be the root of the # Repository instance managed by this server. # # The :repo_root option is required. # # == Usage # # use Stickler::Middleware::Mirror, :repo_root => '/path/to/repository' # # use Stickler::Middleware::Mirror, :repo_root => '/path/to/repository', # :serve_indexes => true # class Mirror < ::Stickler::Middleware::Index def initialize( app, options = {} ) super( app ) @repo = ::Stickler::Repository::Mirror.new( options[:repo_root] ) end def manage( params ) host = params[:source] spec = Stickler::SpecLite.new( params[:name], params[:version], params[:platform] ) begin if spec = @repo.mirror( host , spec ) then logger.info("Mirrored #{spec.file_name}") status 201 response["Location"] = "/gems/#{spec.file_name}" nil else logger.info( "Unable to find #{spec.full_name} at #{host}" ) not_found "Unable to find gem [#{spec.full_name}] at source #{host}" end rescue ::Stickler::Repository::Mirror::ConflictError => ce logger.error( ce.message ) error( 409, ce.message ) rescue ::Stickler::Repository::Mirror::NotFoundError => nfe logger.error( nfe.message ) not_found nfe.message end end post '/:source/:name/:version/:platform' do manage( params ) end post '/:source/:name/:version' do manage( params ) end end end