3

在下面的端口规范中,我尝试解析 URL 以确定用户、通行证、主机和路径。用户/密码值是可选的,但如果不存在,我想为每个设置默认值。

但是,如果用户/通行证不存在,则user/pass会从port/spec对象中省略——这是为什么呢?

>> read sch://foo/bar.r
PORT/SPEC is an object of value: 
   title           string!   "Wee Scheme" 
   scheme          word!     sch 
   ref             url!      sch://foo/bar.r 
   path            string!   "/bar.r" 
   host            string!   "foo" 

>> read sch://foo:bar@foo/bar.r
PORT/SPEC is an object of value: 
   title           string!   "Wee Scheme" 
   scheme          word!     sch 
   ref             url!      sch://foo:bar@foo/bar.r 
   path            string!   "/bar.r" 
   pass            string!   "bar" 
   user            string!   "foo" 
   host            string!   "foo"

另外,在起草这个问题时,我在方案中犯了一个错误,并将解析规则绑定到port,而不是——port/spec然后如何在port/spec对象中设置值?

规格:

sys/make-scheme [
    name: 'sch
    title: "Wee Scheme"
    actor: [
        read: func [port][
            parse port/spec/ref use [chars][
                chars: charset [#"a" - #"z" #"A" - #"Z" #"0" - #"9" "-_!+%.,"]

                bind [
                    "sch://" [
                        copy user some chars #":"
                        copy pass some chars #"@"
                        | (user: 'mince pass: 'tatties)
                    ]
                    copy host some chars
                    copy path [some [#"/" any chars]]
                    end
                ] port
            ]
            ? port/spec
        ]
    ]
]
4

2 回答 2

4

make-scheme https://github.com/rebol/r3/blob/master/src/mezz/sys-ports.r#L254使用没有用户的默认规范 system/standard/port-spec-net经过。

>> system/standard/port-spec-net
== make object! [
    title: none
    scheme: none
    ref: none
    path: none
    host: none
    port-id: 80
]

所以,如果你想要用户并且即使在规范中没有通过,你也必须像这样创建自己的规范https://github.com/rebol/r3/blob/master/src/mezz/prot-http.r #L417并将它们放在那里。

于 2013-03-16T04:21:40.777 回答
3

标准端口规范中没有userorpass字段,因为许多端口方案甚至没有用户或密码作为概念。如果您需要一个用户并且每次都通过,请在构建端口时使用您自己的端口规范原型,正如 Graham 建议的那样。

但是,您也可以考虑select在您的方案中使用端口规范。R3 中的select函数也适用于对象,并且仅none在您选择的单词当前未在对象中定义时返回。这是我们添加的一个有用的快捷方式,您可以在整个 R3 中使用它。

不要觉得你必须在你的规范对象原型中包含每个可选的词。您在规范原型中包含的每个单词都会添加到每个生成的规范中,无论它是否适用。如果您有缺失单词的默认值,您不妨将这些默认值添加到原型规范中,但要小心默认系列值,因为它们可能会被修改。但是对于真正可选的单词,例如userand pass,考虑将它们排除在原型之外以节省内存开销并直接使用select

于 2013-03-16T04:38:21.580 回答