class Attache::Upload
Public Class Methods
new(app)
click to toggle source
# File lib/attache/upload.rb, line 2 def initialize(app) @app = app end
sanitize(filename)
click to toggle source
# File lib/attache/upload.rb, line 38 def self.sanitize(filename) filename.to_s.gsub(/\%/, '_') end
Public Instance Methods
_call(env, config)
click to toggle source
# File lib/attache/upload.rb, line 6 def _call(env, config) case env['PATH_INFO'] when '/upload' case env['REQUEST_METHOD'] when 'POST', 'PUT', 'PATCH' request = Rack::Request.new(env) params = request.GET # stay away from parsing body return config.unauthorized unless config.authorized?(params) relpath = generate_relpath(Attache::Upload.sanitize params['file']) cachekey = File.join(request_hostname(env), relpath) bytes_wrote = Attache.cache.write(cachekey, request.body) if bytes_wrote == 0 return [500, config.headers_with_cors.merge('X-Exception' => 'Local file failed'), []] else Attache.logger.info "[Upload] received #{bytes_wrote} #{cachekey}" end config.storage_create(relpath: relpath, cachekey: cachekey) if config.storage && config.bucket [200, config.headers_with_cors.merge('Content-Type' => 'text/json'), [json_of(relpath, cachekey, config)]] when 'OPTIONS' [200, config.headers_with_cors, []] else [400, config.headers_with_cors, []] end else @app.call(env) end end