Class: ZipTricks::RemoteUncap

Inherits:
Object
  • Object
show all
Defined in:
lib/zip_tricks/remote_uncap.rb

Overview

Alows reading the central directory of a remote ZIP file without downloading the entire file. The central directory provides the offsets at which the actual file contents is located. You can then use the Range: HTTP headers to download those entries separately.

Please read the security warning in FileReader VERY CAREFULLY before you use this module.

Defined Under Namespace

Classes: RemoteZipEntry

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(uri) ⇒ RemoteUncap

Returns a new instance of RemoteUncap.



55
56
57
# File 'lib/zip_tricks/remote_uncap.rb', line 55

def initialize(uri)
  @uri = URI(uri)
end

Class Method Details

.files_within_zip_at(uri) ⇒ Array<RemoteZipEntry>

Returns metadata about the files within the remote archive.

Parameters:

  • uri (String)

    the HTTP(S) URL to read the ZIP footer from

Returns:

  • (Array<RemoteZipEntry>)

    metadata about the files within the remote archive



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/zip_tricks/remote_uncap.rb', line 40

def self.files_within_zip_at(uri)
  fetcher = new(uri)
  fake_io = ZipTricks::RemoteIO.new(fetcher)
  entries = ZipTricks.const_get(:FileReader).read_zip_structure(fake_io)
  entries.map do | remote_entry |
    RemoteZipEntry.new do | entry |
      entry.name               = remote_entry.filename
      entry.starts_at_offset   = remote_entry.compressed_data_offset
      entry.size_uncompressed  = remote_entry.uncompressed_size
      entry.size_compressed    = remote_entry.compressed_size
      entry.compression_method = remote_entry.storage_mode
    end
  end
end

Instance Method Details

#request_object_sizeFixnum

Returns the byte size of the ranged request.

Returns:

  • (Fixnum)

    the byte size of the ranged request



69
70
71
72
# File 'lib/zip_tricks/remote_uncap.rb', line 69

def request_object_size
  http = Net::HTTP.start(@uri.hostname, @uri.port)
  http.request_head(uri)['Content-Length'].to_i
end

#request_range(range) ⇒ String

Returns the response body of the ranged request.

Parameters:

  • range (Range)

    the HTTP range of data to fetch from remote

Returns:

  • (String)

    the response body of the ranged request



61
62
63
64
65
66
# File 'lib/zip_tricks/remote_uncap.rb', line 61

def request_range(range)
  request = Net::HTTP::Get.new(@uri)
  request.range = range
  http = Net::HTTP.start(@uri.hostname, @uri.port)
  http.request(request).body
end