草庐IT

swift - 什么样的 URL 不符合 RFC 3986 但符合 RFC 1808、RFC 1738 和 RFC 2732?

coder 2023-09-14 原文

URLComponents.init(url:resolvingAgainstBaseURL:) 的文档说:

Returns the initialized URL components object, or nil if the URL could not be parsed.

知道:

我假设当 URL 符合 RFC 1808/1738/2732 但不符合 RFC 3986 时,URLComponents 的初始化将失败。那是什么类型的 URL?有什么例子吗?

到目前为止,我唯一的提示可能与不同的保留字符有关?

最佳答案

因为 Swift Foundation 是开源的,让我们从它的源代码来探索它。

  1. URLComponents 初始化器在 apple/swift – URLComponents.swift 中实现和 apple/swift-corelibs-foundation – URLComponents.swift并简单地调用 NSURLComponents 的初始化程序。

  2. NSURLComponents 初始化器在 apple/swift-corelibs-foundation – NSURL.swift 中实现并简单地调用 _CFURLComponentsCreateWithURL

  3. _CFURLComponentsCreateWithURLapple/swift-corelibs-foundation – CFURLComponents.c 中实现并且:

    • 带有 CFURLCopyAbsoluteURL 的失败副本
    • 使用 _CFURLComponentsCreateWithString 的失败创建调用:
      • _CFURIParserParseURIReference + 一个可失败的_CFURIParserURLStringIsValid
  4. CFURLCopyAbsoluteURLapple/swift-corelibs-foundation – CFURL.c 中实现并且仅在以下情况下失败:

    #if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED
        if ( base && CFURLIsFileReferenceURL(base) && !CFURLHasDirectoryPath(base) ) {
            // 16695827 - If the base URL is a file reference URL which doesn't end with a slash, we have to convert it to a file path URL before we can make it absolute.
            base = CFURLCreateFilePathURL(alloc, base, NULL);
            if ( !base ) {
                // could not convert file reference URL to file path URL -- fail will NULL
                return NULL;
            }
        }
    #endif
    

    CFURLCreateFilePathURL 的实现在 opensource.apple.com/source/CF – CFURL.c 中,我的理解是它只会在没有方案或没有路径的情况下失败,这应该是不可能的,因为我们之前使用 CFURLIsFileReferenceURL 测试了文件方案或文件是否存在。

  5. _CFURIParserParseURIReferenceapple/swift-corelibs-foundation – CFURLComponents_URIParser.c 中实现并且仅当 URL 长度超过 2 GB 时才会失败,我认为这与 RFC 规范无关。

  6. _CFURIParserURLStringIsValid本质上将为每个组件调用 _CFURIParserValidateComponent 并因无效字符或转义序列而失败。 这可能是最相关的部分。

现在,通过一些实验,我们知道我们需要一个方案(例如,https:// 或简单的 a://),然后我们使用提出示例的保留字符,例如:

// OK
let url = URL(string: "a://@@")!
// CRASH
let components = URLComponents(url: url, resolvingAgainstBaseURL: true)!

尝试 URLComponents 的替代初始化器也会失败,所以不要试图认为它是不同的:

// CRASH
let components = URLComponents(string: url.absoluteString)!

结论

“a://@@” 是有效 NSURL 但无效 RFC 3986 的示例。


附带说明,一些 Swift 人似乎希望 future 统一对 URL 和 URLComponents 的支持(不再有 RFC 差异)as seen in URL.swift :

// Future implementation note:
// NSURL (really CFURL, which provides its implementation) has quite a few quirks in its processing of some more esoteric (and some not so esoteric) strings. We would like to move much of this over to the more modern NSURLComponents, but binary compat concerns have made this difficult.
// Hopefully soon, we can replace some of the below delegation to NSURL with delegation to NSURLComponents instead. It cannot be done piecemeal, because otherwise we will get inconsistent results from the API.

我不确定他们打算如何执行此操作,因为这意味着要么 URL(string: "a://@@") 会失败,要么 URLComponents(string : "a://@@") 会成功。

关于swift - 什么样的 URL 不符合 RFC 3986 但符合 RFC 1808、RFC 1738 和 RFC 2732?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55609012/

有关swift - 什么样的 URL 不符合 RFC 3986 但符合 RFC 1808、RFC 1738 和 RFC 2732?的更多相关文章

  1. ruby - 在 Ruby 中将时间类对象转换为 RFC3339 - 2

    GoogleCalendarAPI(v2)与时间相关的查询需要采用RFC3339格式。当我在“需要“时间””之后查找时间类时,我看不到rfc3339方法。 最佳答案 如果您使用的是ActiveRecord,则可以使用to_datetime方法将时间转换为DateTime对象。Time.now.to_datetime.rfc3339#=>"2014-11-06T10:40:54+11:00"参见:http://www.ruby-doc.org/stdlib-2.4.1/libdoc/date/rdoc/Time.html.

  2. ruby - 使用 ruby​​ 中的 SHA256 哈希算法计算符合 RFC 2104 的 HMAC - 2

    我在浏览亚马逊产品广告APIRESTsignaturedocs时卡在了#8CalculateanRFC2104-compliantHMACwiththeSHA256hashalgorithmusingthestringabovewithour"dummy"SecretAccessKey:1234567890.Formoreinformationaboutthisstep,seedocumentationandcodesamplesforyourprogramminglanguage.没关系,在CalculatingaSHAhashwithastring+secretkeyinpytho

  3. 工具在接口测试中发挥什么样的作用? - 2

    接口测试究竟是什么?为什么要用接口测试?它有哪些工具呢?这一连串的问题敲击着我们,请带着这些问题,在本文中寻找答案,我将为您打开接口测试的大门。1初探接口测试接口测试是什么。它检查数据的交换,传递和控制管理过程,它绕过了移动端,对服务端进行测试,是个十足的跨栏高手。图片来源:网络你一定听说过ui测试,它可以对前端进行测试,例如selenium工具是一个典型的ui测试工具,是否可以通过ui测试来诊断后端呢?不可以!因为后端非常复杂,就像下图这样。ui测试无法涵盖这么复杂的链路的,在这么庞大的结构下,selenium显得力不从心。这就是我们为什么要绕过移动端,从而使用接口测试的原因。图片来源:阿里

  4. ruby-on-rails - Rails 中的默认 getter 和 setter 是什么样子的? - 2

    我知道我可以编写attr_accessor:tag_list来为Rails中的对象创建一个虚拟属性tag_list。这允许在对象的表单中有一个tag_list属性。如果我使用attr_accessor:tag_list,我可以在模型中对tag_list执行操作以从表单中提取和操作数据。我想知道的是,除了编写attr_accessor,我将如何编写一个getter和setter来完全复制attr_accessor的默认功能。例如:deftag_list#whatgoeshereend仅供引用,我已经尝试过deftag_list@tag_listend这行不通。

  5. javascript - 你的 .conkerorrc 是什么样子的? - 2

    Conkeror改变了我浏览网页的方式:它基本上是Emacs+Firefox,在.conkerrorc中带有基于javascript的配置。而不是.emacs中的elisp配置。多年来,我通过从其他人那里获取一些零碎信息,建立了一个庞大的.emacs自定义库。我只是从Conkeror开始,但事实上它使用JS(比Elisp更广为人知)一定意味着那里有一些令人惊奇的东西。愿意分享您的作品吗?我对与Django生成的页面(或其他动态网页)交互良好的东西特别感兴趣。例如,我喜欢一个基于Conkeror的Action记录器,它可以让我浏览一个站点并找到错误,然后立即保存并通过一次击键将Actio

  6. javascript - 什么样的算法可以生成这样的曲线 (img) & 它可以在 javascript 中为 flot 完成吗? - 2

    你能给我一个算法的例子吗?alttexthttp://ryancalderoni.com/archive/ideal_curve.jpg编辑:然后我将如何使用Javascript计算数学?有人可以添加吗?很抱歉最初没有包含该上下文..注意:我正在使用“flot”来绘制它,flot的输入是一个javascript数组,如下所示:[[x,y],[x,y],[x,y]...]因此,给定改变曲线的值,我将所有点输出到一个带有循环的数组,然后将其吐出以float到图形中。 最佳答案 典型的S型曲线是tanh(x)曲线。根据定义,tanh(x)

  7. javascript - 用 moment.js : Deprecation warning: value provided is not in a recognized RFC2822 or ISO format 排序 - 2

    我使用Moment解析从API获得的日期,我需要在完成数据收集后对数组进行排序。我目前有这个:myobject.name=name;myobject.time=Moment(ajaxinfo.startdate).format('DD/MM/YYYY');array.push(myobject);//...moredataisadded...array.sort((left,right)=>{returnMoment.utc(left.time).diff(Moment.utc(right.time));});ajaxinfo.startdate是我从API获取的字符串,它看起来像"2

  8. javascript - 如何绕过 Firefox 扩展 "server does not support RFC 5746"中的以下错误 - 2

    我正在开发FireFox扩展当我对安全服务器执行xhr时,特别是POST数据它给出状态500和以下消息:onsip.highrisehq.com:serverdoesnotsupportRFC5746,seeCVE-2009-3555我怎样才能绕过它?我假设这是因为服务器配置错误,但我等不及37signal的人来修复它。谢谢你的帮助 最佳答案 好吧-“参见CVE-2009-3555”。基本上这是一个服务器端漏洞,可能会危及TLS/SSLsession。在37signals更新他们的服务器之前,我不确定您可以在客户端做些什么来解决这个

  9. javascript - 什么样的构造会在 Javascript 中使用注释分隔符 */? - 2

    来自"Javascript:theGoodParts":theGoodParts:Avoid/*…*/forcomments,*/appearsinusefulconstructsinjavascript.Use//.我很好奇这些“有用的构造”可能是什么,因为我想不出任何OTOH(除了像/.*/这样的正则表达式?) 最佳答案 博主试图缩写Crockford在JavaScript:好的部分,第2章(语法)中写的内容。本主题出现在第一部分(空白)的最后一段。它说,The/**/formofblockcommentscamefromala

  10. javascript - javascript关联数组使用什么样的哈希函数/算法? - 2

    我们了解到有许多不同的哈希算法/函数,我很好奇javascript(v8,如果实现很重要)使用哪一个。 最佳答案 由于V8是开源的,所以你去源码:这是GetHash():https://github.com/v8/v8/blob/master/src/objects.cc#L903并且,这里是一些不同类型的哈希函数:https://github.com/v8/v8-git-mirror/blob/bda7fb22465fc36d99b4053f0ef60cfaa8441209/src/utils.h#L347而且,这看起来像是字符串

随机推荐