Я использую следующий код с «uri» и «CGI» для разбора параметров URL:
require 'socket'
require 'uri'
require 'CGI'
server = TCPServer.new 8888
while session = server.accept
request = session.gets
p "request", request
url = "http://somewebsite.com" + request.sub("GET ", "").sub(" HTTP/1.1", "").gsub(/(\r|\n)/, "")
uri = URI(url)
params = CGI.parse(uri.query)
p "params", params
session.print "HTTP/1.1 200\r\n" # 1
session.print "Content-Type: text/html\r\n" # 2
session.print "\r\n" # 3
session.print "Hello world! The time is #{Time.now}" #4
session.close
end
Мне пришлось «составить» полный URL, добавив http://somewebsite.com
к пути и используйте для этого функции uri
и CGI
. Если браузер использует http://localhost: 8888 /? A = 123 & b = hello , тогда он работает хорошо. Но если браузер попытался получить доступ к http://localhost: 8888 / favicon.ico или http://localhost: 8888 , он сразу же сломался, сказав, что разделение невозможно. (с ошибкой CGI.parse(uri.query)
)
Я могу изменить строку на
params = uri.query ? CGI.parse(uri.query) : nil
, но все это выглядит немного странно, нужно создать URL, а затем CGI.parse
сломается если запрос не существует Есть ли на самом деле лучший способ использовать стандартную библиотеку, чтобы сделать это? (следует ли использовать что-то еще вместо uri
и CGI
?)
(Преимущество использования стандартной библиотеки заключается в автоматической обработке случаев для %20
и нескольких параметров, как в http://localhost : 8888 /? A = 123 & b = привет% 20world & b = хорошо , что дает
{"a"=>["123"], "b"=>["hello world", "good"]}
в результате.)