ASCII ruby ​​net / http запрос на изменение - PullRequest
0 голосов
/ 06 июня 2018

Мне нужно выполнить очень специфический запрос в унаследованной системе и обнаружил, что во время запроса get библиотеки http меняют любой %2C обратно на ,.Та же проблема с net-http, httparty, faraday и open-uri с использованием разных реализаций

2.5.0 :001 > require 'net/http'
=> true 
2.5.0 :002 > require 'erb'
=> true 
2.5.0 :003 > link = "http://example.com?q=" + ERB::Util.url_encode("Hello, World")
=> "http://example.com?q=Hello%2C%20World" 
2.5.0 :004 > uri = URI(link)
=> #<URI::HTTP http://example.com?q=Hello%2C%20World> 
2.5.0 :005 > res = Net::HTTP.get_response(uri)
=> #<Net::HTTPOK 200 OK readbody=true> 

Все это выглядит хорошо, пока я не посмотрю на фактический запрос с видеомагнитофоном

http_interactions:
  - request:
    method: get
    uri: http://example.com/?q=Hello,%20World
    body:
      encoding: US-ASCII
      string: ''
...

Какоставить запрос на http://example.com?q=Hello%2C%20World?

1 Ответ

0 голосов
/ 06 июня 2018

, является допустимым символом в запросе (расширенное пояснение здесь https://stackoverflow.com/a/31300627/3820185)

ERB::Util.url_encode вместо заменяет [^a-zA-Z0-9_\-.]:

# File erb.rb, line 930
def url_encode(s)
  s.to_s.dup.force_encoding("ASCII-8BIT").gsub(/[^a-zA-Z0-9_\-.]/n) {
    sprintf("%%%02X", $&.unpack("C")[0])
  }
end

Таким образом, при выполнении запроса, наиболее вероятно, запрос повторно анализируется для соответствия действующим стандартам.

EDIT

Также вы этого не делаетенужно вообще использовать ERB::Util.url_encode, вы можете просто передать свой URL на URI, он будет корректно избегать его в соответствии со стандартами.

irb(main):001:0> require 'net/http'
=> true
irb(main):002:0> link = URI 'http://example.com?q=Hello, World'
=> #<URI::HTTP http://example.com?q=Hello,%20World>
irb(main):003:0>
...