2015-12-14 9 views
11

Sto cercando di capire quale set predefinito di caratteri non sicuri è per URI.escape in ruby ​​2.2.3. Il docs dicono:Perché URI.escape() è contrassegnato come obsoleto e dov'è la costante REGEXP :: UNSAFE?

di default usa REGEXP :: UNSAFE

ma non riesco a trovare quel costante in qualsiasi parte del modulo di URI.

Inoltre, this code (snippet di seguito) ha i metodi di escape/unescape contrassegnati come "obsoleti" dal 2009. Perché sono obsoleti?

lib/uri/common.rb:97 

def escape(*arg) 
    warn "#{caller(1)[0]}: warning: URI.escape is obsolete" if $VERBOSE 
    DEFAULT_PARSER.escape(*arg) 
end 

I documenti sono errati/non aggiornati?

+2

Non dire "questo codice" e fornire un collegamento. Invece, estrai SOLO il codice pertinente alla tua discussione e inseriscilo nella tua domanda. Per favore leggi "[ask]" e "[mcve]". Consideralo in questo modo: i link marciscono, e quando lo farà la tua domanda avrà senso per gli altri che cercano la stessa risposta? –

risposta

4

vedo hai risposto alla tua domanda Re: UNSAFE. Per quanto riguarda questa domanda:

Inoltre, this code ha i metodi di escape/unescape contrassegnati come "obsoleti" dal 2009. Perché sono obsoleti?

C'è un po 'di esperienza in questo numero dicembre 2010: https://bugs.ruby-lang.org/issues/4167 In quel filo Yui Naruse scrive:

URI lib dice si riferisce RFC2396, così attuale comportamento è corretto nella sua spec.

Sì, so che il comportamento attuale non è quello che ti aspetti. Quindi abbiamo in programma di cambiare la lib per fare riferimento a RFC3986.

Inoltre l'URI.encode corrente è semplice gsub. Ma penso che dovrebbe dividere un URI per componenti, quindi sfuggire a ciascun componente e infine unirsi a loro.

Così corrente URI.encode è considerato dannoso e deprecato. Questo sarà essere rimosso o modificare il comportamento drasticamente.

Qual è la sostituzione in questo momento?

Come detto sopra, l'URI.encode corrente è errato a livello di specifica. Quindi noi non forniremo la sostituzione esatta. La sostituzione varierà in base al suo caso d'uso .

Abbiamo pensato che la maggior parte del caso di utilizzo è generare URI di escape dall'unità URI componenti.Per questo, le persone dovrebbero usare URI.join o URI.encode_www_form; dovresti sfuggire a ogni componente prima di unirti a .

+1

Come dice la citazione "URI.encode_www_form' è sicuro. È anche facile da usare. [Addressable :: URI] (https://github.com/sporkmonger/addressable) è una gemma molto degna che preferisco se devo fare qualsiasi cosa con un sacco di URI. –

4

Si scopre che i documenti non sono abbastanza accurati per quanto riguarda la costante di default. Se guardiamo

https://github.com/ruby/ruby/blame/trunk/lib/uri/rfc2396_parser.rb#L299

non è più una costante, ma un membro di una hash. Quindi il valore di default può davvero essere esaminato in questo modo:

> URI::DEFAULT_PARSER.regexp[:UNSAFE] 
=> /[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/ 

EDIT: Appare si può ottenere con la semplice:

> URI::UNSAFE 
=> /[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/ 
+0

La regex attuale è qui: https://github.com/ruby/ruby/blob/832c74f428db6c5bd6e575e1f6ea7fe0891c84d2/lib/uri/rfc2396_parser.rb#L514 –

Problemi correlati