Class: WebDAVFile

Inherits:
Object
  • Object
show all
Defined in:
lib/fs/MiqFS/modules/WebDAVFile.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(uri, http_options, headers) ⇒ WebDAVFile

Returns a new instance of WebDAVFile.



4
5
6
7
8
9
10
11
12
13
# File 'lib/fs/MiqFS/modules/WebDAVFile.rb', line 4

def initialize(uri, http_options, headers)
  @uri = uri
  @headers = headers
  @offset = 0
  @connection = Net::HTTP.start(
    @uri.host,
    @uri.port,
    http_options
  )
end

Class Method Details

.file_size(connection, uri, headers) ⇒ Object

Raises:

  • (Errno::ENOENT)


58
59
60
61
62
63
# File 'lib/fs/MiqFS/modules/WebDAVFile.rb', line 58

def self.file_size(connection, uri, headers)
  response = head_response(connection, uri, headers)
  raise Errno::ENOENT unless response.kind_of?(Net::HTTPOK)
  raise Errno::EINVAL if response["content-length"].nil?
  response["content-length"].to_i
end

.head_response(connection, uri, headers) ⇒ Object



53
54
55
56
# File 'lib/fs/MiqFS/modules/WebDAVFile.rb', line 53

def self.head_response(connection, uri, headers)
  request = Net::HTTP::Head.new(uri, headers)
  connection.request(request)
end

Instance Method Details

#closeObject



65
66
67
# File 'lib/fs/MiqFS/modules/WebDAVFile.rb', line 65

def close
  @connection.finish
end

#read(length) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/fs/MiqFS/modules/WebDAVFile.rb', line 26

def read(length)
  @next_offset = @offset + length

  request = Net::HTTP::Get.new(@uri, @headers)
  request.set_range(@offset, @next_offset)

  response = @connection.request(request)

  case response
  when Net::HTTPOK
    # In this case (server not supporting ranges) the communication
    # is highly inefficient.
    data = response.body[@offset..@next_offset]
  when Net::HTTPPartialContent
    data = response.body
  else
    raise Errno::ENOENT
  end

  @offset = @next_offset
  data
end

#seek(offset, whence) ⇒ Object



15
16
17
18
19
20
21
22
23
24
# File 'lib/fs/MiqFS/modules/WebDAVFile.rb', line 15

def seek(offset, whence)
  case whence
  when IO::SEEK_SET
    @offset = offset
  when IO::SEEK_CUR
    @offset += offset
  else
    raise NotImplementedError
  end
end

#sizeObject



49
50
51
# File 'lib/fs/MiqFS/modules/WebDAVFile.rb', line 49

def size
  self.class.file_size(@connection, @uri, @headers)
end