gpt4 book ai didi

ruby - 规范化 HTTP URI

转载 作者:数据小太阳 更新时间:2023-10-29 07:47:48 25 4
gpt4 key购买 nike

我从 Akamai 的日志文件中获取 URI,其中包含如下条目:

/foo/jim/jam
/foo/jim/jam?
/foo/./jim/jam
/foo/bar/../jim/jam
/foo/jim/jam?autho=<randomstring>&file=jam

我想根据规则将所有这些规范化为同一个条目:

  • 如果有查询字符串,去掉authofile
  • 如果查询字符串为空,删除结尾的 ? .
  • ./ 的目录条目应该被删除。
  • <fulldir>/../ 的目录条目应该被删除。

我本以为 URI Ruby 的库将涵盖这一点,但是:

  • 它不提供任何解析部分查询字符串的机制。 (并不是说这很难做到,也不是标准。)
  • 它不会删除尾随的 ?如果查询字符串为空。

    URI.parse('/foo?jim').tap{ |u| u.query='' }.to_s #=> "/foo?"
  • normalize方法没有清理 ...在路径中。

因此,在官方库失败的情况下,我发现自己正在编写一个基于正则表达式的解决方案。

def normalize(path)
result = path.dup
path.sub! /(?<=\?).+$/ do |query|
query.split('&').reject do |kv|
%w[ autho file ].include?(kv[/^[^=]+/])
end.join('&')
end
path.sub! /\?$/, ''
path.sub!(/^[^?]+/){ |path| path.gsub(%r{[^/]+/\.\.},'').gsub('/./','/') }
end

它恰好适用于我上面列出的测试用例,但有 450,000 条路径需要清理,我无法手动检查所有路径。

  • 考虑到可能的日志文件条目,上述是否有任何明显错误?
  • 是否有更好的方法来完成相同的任务,即依靠经过验证的解析技术而不是我的手动正则表达式?

最佳答案

addressable gem 将为您规范化这些:

require 'addressable/uri'

# normalize relative paths
uri = Addressable::URI.parse('http://example.com/foo/bar/../jim/jam')
puts uri.normalize.to_s #=> "http://example.com/foo/jim/jam"

# removes trailing ?
uri = Addressable::URI.parse('http://example.com/foo/jim/jam?')
puts uri.normalize.to_s #=> "http://example.com/foo/jim/jam"

# leaves empty parameters alone
uri = Addressable::URI.parse('http://example.com/foo/jim/jam?jim')
puts uri.normalize.to_s #=> "http://example.com/foo/jim/jam?jim"

# remove specific query parameters
uri = Addressable::URI.parse('http://example.com/foo/jim/jam?autho=<randomstring>&file=jam')
cleaned_query = uri.query_values
cleaned_query.delete('autho')
cleaned_query.delete('file')
uri.query_values = cleaned_query
uri.normalize.to_s #=> "http://example.com/foo/jim/jam"

关于ruby - 规范化 HTTP URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29756326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com