Class: Ldp::Response

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/ldp/response.rb

Constant Summary collapse

TYPE =
'type'.freeze
RETURN =
'return'.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(response) ⇒ Response

Returns a new instance of Response.

Parameters:

  • response (Faraday::Response)


14
15
16
# File 'lib/ldp/response.rb', line 14

def initialize(response)
  @response = response
end

Instance Attribute Details

#etagObject

Extract the ETag for the resource



124
125
126
# File 'lib/ldp/response.rb', line 124

def etag
  @etag ||= headers['ETag'.freeze]
end

#last_modifiedObject

Extract the last modified header for the resource



130
131
132
# File 'lib/ldp/response.rb', line 130

def last_modified
  @last_modified ||= headers['Last-Modified'.freeze]
end

#responseObject (readonly)

Returns the value of attribute response.



9
10
11
# File 'lib/ldp/response.rb', line 9

def response
  @response
end

Instance Method Details

#applied_preferencesObject



35
36
37
38
39
40
41
42
43
44
# File 'lib/ldp/response.rb', line 35

def applied_preferences
  h = {}

  Array(headers['Preference-Applied'.freeze]).map { |x| x.split(",") }.flatten.inject(h) do |memo, header|
    m = header.match(/(?<key>[^=;]*)(=(?<value>[^;,]*))?(;\s*(?<params>[^,]*))?/)
    includes = (m[:params].match(/include="(?<include>[^"]+)"/)[:include] || "").split(" ")
    omits = (m[:params].match(/omit="(?<omit>[^"]+)"/)[:omit] || "").split(" ")
    memo[m[:key]] = { value: m[:value], includes: includes, omits: omits }
  end
end

#bodyObject



100
101
102
# File 'lib/ldp/response.rb', line 100

def body
  response.body
end

#container?Boolean

Is the response an LDP container?

Returns:

  • (Boolean)


55
56
57
58
59
60
61
# File 'lib/ldp/response.rb', line 55

def container?
  [
    RDF::Vocab::LDP.BasicContainer,
    RDF::Vocab::LDP.DirectContainer,
    RDF::Vocab::LDP.IndirectContainer
  ].any? { |x| Array(links[TYPE]).include? x.to_s }
end

#content_disposition_filenameObject



192
193
194
195
# File 'lib/ldp/response.rb', line 192

def content_disposition_filename
  filename = content_disposition_attributes['filename']
  CGI.unescape(filename) if filename
end

#content_lengthObject



188
189
190
# File 'lib/ldp/response.rb', line 188

def content_length
  headers['Content-Length'].to_i
end

#content_typeObject



184
185
186
# File 'lib/ldp/response.rb', line 184

def content_type
  headers['Content-Type']
end

#dupObject



70
71
72
73
74
75
76
# File 'lib/ldp/response.rb', line 70

def dup
  super.tap do |new_resp|
    unless new_resp.instance_variable_get(:@graph).nil?
      new_resp.remove_instance_variable(:@graph)
    end
  end
end

#each_statement(&block) ⇒ Object

Deprecated.

use #graph instead



116
117
118
119
120
# File 'lib/ldp/response.rb', line 116

def each_statement(&block)
  reader do |reader|
    reader.each_statement(&block)
  end
end

#first_pageObject

Get the URI to the first page



176
177
178
179
180
181
182
# File 'lib/ldp/response.rb', line 176

def first_page
  if links['first']
    RDF::URI.new links['first']
  elsif graph.has_statement? RDf::Statement.new(page_subject, RDF::Vocab::LDP.nextPage, nil)
    subject
  end
end

#graphObject

Get the graph for the resource (or a blank graph if there is no metadata for the resource)



106
107
108
# File 'lib/ldp/response.rb', line 106

def graph
  @graph ||= RDF::Graph.new << reader
end

#has_next?Boolean

Is there a next page?

Returns:

  • (Boolean)


164
165
166
# File 'lib/ldp/response.rb', line 164

def has_next?
  next_page != nil
end

#has_page?Boolean

Is the response paginated?

Returns:

  • (Boolean)


96
97
98
# File 'lib/ldp/response.rb', line 96

def has_page?
  rdf_source? && graph.has_statement?(RDF::Statement.new(page_subject, RDF.type, RDF::Vocab::LDP.Page))
end

#includes?(preference) ⇒ Boolean

Returns:

  • (Boolean)


142
143
144
145
146
# File 'lib/ldp/response.rb', line 142

def includes? preference
  key = Ldp.send("prefer_#{preference}") if Ldp.respond_to("prefer_#{preference}")
  key ||= preference
  preferences[RETURN][:includes].include?(key) || !preferences["return"][:omits].include?(key)
end

Extract the Link: headers from the HTTP resource



20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/ldp/response.rb', line 20

def links
  @links ||= begin
    h = {}
    Array(headers['Link'.freeze]).map { |x| x.split(','.freeze) }.flatten.inject(h) do |memo, header|
      m = header.match(/<(?<link>.*)>;\s?rel="(?<rel>[^"]+)"/)
      if m
        memo[m[:rel]] ||= []
        memo[m[:rel]] << m[:link]
      end

      memo
    end
  end
end

#minimal?Boolean

Returns:

  • (Boolean)


148
149
150
# File 'lib/ldp/response.rb', line 148

def minimal?
  preferences[RETURN][:value] == "minimal"
end

#next_pageObject

Get the URI for the next page



170
171
172
# File 'lib/ldp/response.rb', line 170

def next_page
  graph.first_object [page_subject, RDF::Vocab::LDP.nextPage, nil]
end

#pageObject

Statements about the page



154
155
156
157
158
159
160
# File 'lib/ldp/response.rb', line 154

def page
  @page_graph ||= begin
    page_graph = RDF::Graph.new
    page_graph << graph.query([page_subject, nil, nil]) if resource?
    page_graph
  end
end

#page_subjectObject

Get the URI to the response



90
91
92
# File 'lib/ldp/response.rb', line 90

def page_subject
  @page_subject ||= RDF::URI.new response.env[:url]
end

#rdf_source?Boolean

Is the response an LDP RDFSource?

ldp:Container is a subclass of ldp:RDFSource

Returns:

  • (Boolean)


66
67
68
# File 'lib/ldp/response.rb', line 66

def rdf_source?
  container? || Array(links[TYPE]).include?(RDF::Vocab::LDP.RDFSource)
end

#reader(&block) ⇒ Object



110
111
112
# File 'lib/ldp/response.rb', line 110

def reader(&block)
  reader_for_content_type.new(body, base_uri: page_subject, &block)
end

#resource?Boolean

Is the response an LDP resource?

Returns:

  • (Boolean)


49
50
51
# File 'lib/ldp/response.rb', line 49

def resource?
  Array(links[TYPE]).include? RDF::Vocab::LDP.Resource.to_s
end

#subjectObject

Get the subject for the response



80
81
82
83
84
85
86
# File 'lib/ldp/response.rb', line 80

def subject
  @subject ||= if has_page?
                 graph.first_object [page_subject, RDF::Vocab::LDP.pageOf, nil]
               else
                 page_subject
               end
end

#typesObject

Extract the Link: rel=“type” headers for the resource



136
137
138
# File 'lib/ldp/response.rb', line 136

def types
  Array(links[TYPE])
end