Class: RDF::Util::File::RemoteDocument

Inherits:
StringIO
  • Object
show all
Defined in:
lib/rdf/util/file.rb

Overview

A RemoteDocument contains the body and headers of a remote resource.

Link headers are parsed using the ‘LinkHeader` gem

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(body, options = {}) ⇒ RemoteDocument

Set content

Parameters:

  • body (String)

    entity content of request.

Since:

  • 0.2.4



392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
# File 'lib/rdf/util/file.rb', line 392

def initialize(body, options = {})
  options.each do |key, value|
    # de-quote charset
    matchdata = value.match(/^["'](.*)["']$/.freeze) if key == "charset"
    value = matchdata[1] if matchdata
    value = value.downcase if value.is_a?(String)
    instance_variable_set(:"@#{key}", value)
  end
  @headers = options.fetch(:headers, {})
  @charset = options[:charset].to_s.downcase if options[:charset]
  @parameters = {}

  # Find Content-Type and extract other parameters
  if headers[:content_type]
    ct, *params = headers[:content_type].split(';').map(&:strip)
    @content_type ||= ct

    # Find charset
    params.each do |param|
      p, v = param.split('=')
      @parameters[p.downcase.to_sym] = v.sub(/^["']?([^"']*)["']?$/, '\1')
      @charset ||= @parameters[p.downcase.to_sym].downcase if p.downcase == 'charset'
    end
  end

  @etag = headers[:etag]
  @last_modified = DateTime.parse(headers[:last_modified]) if headers[:last_modified]
  encoding = @charset ||= "utf-8"

  unless encoding.start_with?("utf")
    body.force_encoding(Encoding::UTF_8)
    encoding = "utf-8"

    # Make sure Unicode is in NFC
    begin
      body.unicode_normalize! unless !body.unicode_normalized?
    rescue Encoding::CompatibilityError
      # Oh, well ...
    end if body.respond_to?(:unicode_normalized?)
  end

  super(body).set_encoding encoding
end

Instance Attribute Details

#base_uriString (readonly)

Base URI based on resource location or returned Location header.

Returns:

  • (String)

Since:

  • 0.2.4



354
355
356
# File 'lib/rdf/util/file.rb', line 354

def base_uri
  @base_uri
end

#charsetString (readonly)

Encoding of resource (from Content-Type), downcased. Also applied to content if it is UTF

Returns:

  • (String)

Since:

  • 0.2.4



362
363
364
# File 'lib/rdf/util/file.rb', line 362

def charset
  @charset
end

#codeInteger (readonly)

Response code

Returns:

  • (Integer)

Since:

  • 0.2.4



370
371
372
# File 'lib/rdf/util/file.rb', line 370

def code
  @code
end

#content_typeString (readonly)

Content-Type of the returned resource

Returns:

  • (String)

Since:

  • 0.2.4



358
359
360
# File 'lib/rdf/util/file.rb', line 358

def content_type
  @content_type
end

#etagString (readonly)

ETag from headers

Returns:

  • (String)

Since:

  • 0.2.4



375
376
377
# File 'lib/rdf/util/file.rb', line 375

def etag
  @etag
end

#headersHash{Symbol => Object} (readonly)

Raw headers from response

Returns:

  • (Hash{Symbol => Object})

Since:

  • 0.2.4



383
384
385
# File 'lib/rdf/util/file.rb', line 383

def headers
  @headers
end

#last_modifiedDateTime (readonly)

Last-Modified time from headers

Returns:

  • (DateTime)

Since:

  • 0.2.4



379
380
381
# File 'lib/rdf/util/file.rb', line 379

def last_modified
  @last_modified
end

#parametersSymbol => String (readonly)

Parameters from Content-Type

Returns:

  • (Symbol => String)

    ]

Since:

  • 0.2.4



366
367
368
# File 'lib/rdf/util/file.rb', line 366

def parameters
  @parameters
end

#requested_urlString (readonly)

Originally requested URL

Returns:

  • (String)

Since:

  • 0.2.4



387
388
389
# File 'lib/rdf/util/file.rb', line 387

def requested_url
  @requested_url
end

Instance Method Details

#content_encodingArray<String>

Returns a list of encodings in Content-Encoding field as an array of strings.

The encodings are downcased for canonicalization.

Returns:

  • (Array<String>)

Since:

  • 0.2.4



441
442
443
# File 'lib/rdf/util/file.rb', line 441

def content_encoding
  headers.fetch(:content_encoding, "").split(',').map(&:strip).map(&:downcase)
end

Return links from the Link header.

Links can be returned in array form, or searched.

Examples:


d = RemoteDocument.new(...)
describedby = links.find_link(['rel', 'describedby']).href

Returns:

  • (::LinkHeader)

Since:

  • 0.2.4



456
457
458
# File 'lib/rdf/util/file.rb', line 456

def links
  @links ||= LinkHeader.parse(@headers[:link])
end