Close http connection in perform method of Request class (#6889)
HTTP connections must be explicitly closed in many cases, and letting perform method close connections makes its callers less redundant and prevent them from forgetting to close connections.
This commit is contained in:
		
					parent
					
						
							
								4e71b104e6
							
						
					
				
			
			
				commit
				
					
						54b273bf99
					
				
			
		
					 15 changed files with 134 additions and 127 deletions
				
			
		|  | @ -24,43 +24,44 @@ class FetchAtomService < BaseService | |||
| 
 | ||||
|   def process(url, terminal = false) | ||||
|     @url = url | ||||
|     perform_request | ||||
|     process_response(terminal) | ||||
|     perform_request { |response| process_response(response, terminal) } | ||||
|   end | ||||
| 
 | ||||
|   def perform_request | ||||
|   def perform_request(&block) | ||||
|     accept = 'text/html' | ||||
|     accept = 'application/activity+json, application/ld+json, application/atom+xml, ' + accept unless @unsupported_activity | ||||
| 
 | ||||
|     @response = Request.new(:get, @url) | ||||
|                        .add_headers('Accept' => accept) | ||||
|                        .perform | ||||
|     Request.new(:get, @url).add_headers('Accept' => accept).perform(&block) | ||||
|   end | ||||
| 
 | ||||
|   def process_response(terminal = false) | ||||
|     return nil if @response.code != 200 | ||||
|   def process_response(response, terminal = false) | ||||
|     return nil if response.code != 200 | ||||
| 
 | ||||
|     if @response.mime_type == 'application/atom+xml' | ||||
|       [@url, { prefetched_body: @response.to_s }, :ostatus] | ||||
|     elsif ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(@response.mime_type) | ||||
|       json = body_to_json(@response.to_s) | ||||
|     if response.mime_type == 'application/atom+xml' | ||||
|       [@url, { prefetched_body: response.to_s }, :ostatus] | ||||
|     elsif ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(response.mime_type) | ||||
|       json = body_to_json(response.to_s) | ||||
|       if supported_context?(json) && json['type'] == 'Person' && json['inbox'].present? | ||||
|         [json['id'], { prefetched_body: @response.to_s, id: true }, :activitypub] | ||||
|         [json['id'], { prefetched_body: response.to_s, id: true }, :activitypub] | ||||
|       elsif supported_context?(json) && json['type'] == 'Note' | ||||
|         [json['id'], { prefetched_body: @response.to_s, id: true }, :activitypub] | ||||
|         [json['id'], { prefetched_body: response.to_s, id: true }, :activitypub] | ||||
|       else | ||||
|         @unsupported_activity = true | ||||
|         nil | ||||
|       end | ||||
|     elsif @response['Link'] && !terminal && link_header.find_link(%w(rel alternate)) | ||||
|       process_headers | ||||
|     elsif @response.mime_type == 'text/html' && !terminal | ||||
|       process_html | ||||
|     elsif !terminal | ||||
|       link_header = response['Link'] && parse_link_header(response) | ||||
| 
 | ||||
|       if link_header&.find_link(%w(rel alternate)) | ||||
|         process_link_headers(link_header) | ||||
|       elsif response.mime_type == 'text/html' | ||||
|         process_html(response) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def process_html | ||||
|     page = Nokogiri::HTML(@response.to_s) | ||||
|   def process_html(response) | ||||
|     page = Nokogiri::HTML(response.to_s) | ||||
| 
 | ||||
|     json_link = page.xpath('//link[@rel="alternate"]').find { |link| ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(link['type']) } | ||||
|     atom_link = page.xpath('//link[@rel="alternate"]').find { |link| link['type'] == 'application/atom+xml' } | ||||
|  | @ -71,7 +72,7 @@ class FetchAtomService < BaseService | |||
|     result | ||||
|   end | ||||
| 
 | ||||
|   def process_headers | ||||
|   def process_link_headers(link_header) | ||||
|     json_link = link_header.find_link(%w(rel alternate), %w(type application/activity+json)) || link_header.find_link(%w(rel alternate), ['type', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"']) | ||||
|     atom_link = link_header.find_link(%w(rel alternate), %w(type application/atom+xml)) | ||||
| 
 | ||||
|  | @ -81,7 +82,7 @@ class FetchAtomService < BaseService | |||
|     result | ||||
|   end | ||||
| 
 | ||||
|   def link_header | ||||
|     @link_header ||= LinkHeader.parse(@response['Link'].is_a?(Array) ? @response['Link'].first : @response['Link']) | ||||
|   def parse_link_header(response) | ||||
|     LinkHeader.parse(response['Link'].is_a?(Array) ? response['Link'].first : response['Link']) | ||||
|   end | ||||
| end | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue