2013-03-16 6 views
3

В приведенной ниже спецификации порта я пытаюсь проанализировать URL-адрес, чтобы определить пользователя, пароль, хост и путь. Значения User/Pass являются необязательными, но я бы хотел установить значения по умолчанию для каждого, если они отсутствуют.Пользователи/Пароли в Rebol 3 Схемы

Однако, если пользователя/прохода нет, user/pass исключены из объекта -почему это так?

>> 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:[email protected]/bar.r 
PORT/SPEC is an object of value: 
    title   string! "Wee Scheme" 
    scheme   word!  sch 
    ref    url!  sch://foo:[email protected]/bar.r 
    path   string! "/bar.r" 
    pass   string! "bar" 
    user   string! "foo" 
    host   string! "foo" 

Кроме того, при разработке этого вопроса, я сделал ошибку в схеме и связала правило синтаксического анализа к port, а не port/spec -Как значения затем установить в port/spec объекта?

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

макияж схема https://github.com/rebol/r3/blob/master/src/mezz/sys-ports.r#L254 использует в качестве спецификаций системы по умолчанию/стандартный/порт-SPEC-сети, которая не имеет пользователя и передать.

>> 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 и установить их там.

+0

Итак, откуда пользователь/пароль пришел с этого момента в объект port/spec, я их не добавил. И что происходит с «фаршем» и «tatties»? – rgchris

+0

parse-url захватывает пользователя и пароль с URL-адреса, предоставленного для открытия. –

+0

См. Make-port, который вызывает parse-url на URL-адресе! https://github.com/rebol/r3/blob/master/src/mezz/sys-ports.r#L32 –

3

В стандартных спецификациях портов нетили , потому что многие схемы портов даже не имеют пользователей или паролей в качестве концепции. Если вы нуждаетесь в , нужно иметь, чтобы иметь пользователя и проходить каждый раз, используя собственный прототип спецификации порта при построении портов, как предложил Грэм.

Однако вы также можете использовать select в спецификации порта в вашей схеме. Функция select в R3 также работает с объектами и просто возвращает none, когда слово, которое вы выбираете, в настоящее время не определено в объекте. Это полезный ярлык, который мы добавили, что вы можете использовать на протяжении всего R3.

Не чувствуйте, что вам нужно включить каждое необязательное слово в прототип объекта спецификации. Каждое слово, которое вы включаете в прототип spec, добавляется к каждой результирующей спецификации, независимо от того, применяется оно или нет. Если у вас есть значения по умолчанию для отсутствующих слов, вы можете также добавить эти значения по умолчанию в спецификацию прототипа, хотя будьте осторожны с значениями серий по умолчанию, поскольку они могут быть изменены. Но для слов, которые действительно являются необязательными, например, user и pass, подумайте о том, чтобы оставить их вне прототипа для экономии накладных расходов памяти и вместо этого использовать select.

+0

Итак, откуда пользователь/пароль пришел с этого момента в объект port/spec - я их не добавлял , И что происходит с «фаршем» и «tatties»? – rgchris

 Смежные вопросы

  • Нет связанных вопросов^_^