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



126
127
128
# File 'lib/ldp/response.rb', line 126

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

#last_modifiedObject

Extract the last modified header for the resource



132
133
134
# File 'lib/ldp/response.rb', line 132

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



202
203
204
205
# File 'lib/ldp/response.rb', line 202

def content_disposition_filename
  filename = content_disposition_attributes['filename']
  URI.decode(filename) if filename
end

#content_lengthObject



198
199
200
# File 'lib/ldp/response.rb', line 198

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

#content_typeObject



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

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



118
119
120
121
122
# File 'lib/ldp/response.rb', line 118

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

#first_pageObject

Get the URI to the first page



186
187
188
189
190
191
192
# File 'lib/ldp/response.rb', line 186

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
109
110
111
112
# File 'lib/ldp/response.rb', line 106

def graph
  @graph ||= begin
    graph = RDF::Graph.new
    each_statement { |s| graph << s }
    graph
  end
end

#has_next?Boolean

Is there a next page?

Returns:

  • (Boolean)


174
175
176
# File 'lib/ldp/response.rb', line 174

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)


144
145
146
147
148
# File 'lib/ldp/response.rb', line 144

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)


150
151
152
# File 'lib/ldp/response.rb', line 150

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

#next_pageObject

Get the URI for the next page



180
181
182
# File 'lib/ldp/response.rb', line 180

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

#pageObject

Statements about the page



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/ldp/response.rb', line 156

def page
  @page_graph ||= begin
    g = RDF::Graph.new

    if resource?
      res = graph.query RDF::Statement.new(page_subject, nil, nil)

      res.each_statement do |s|
        g << s
      end
    end

    g
  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



114
115
116
# File 'lib/ldp/response.rb', line 114

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



138
139
140
# File 'lib/ldp/response.rb', line 138

def types
  Array(links[TYPE])
end