2017-06-28 5 views
0

J'essaie de faire des trucs RESTful avec Ruby std. bibliothèques, 'uri' et 'net/https'. Je voudrais atteindre l'adresse IPv6 lien-local avec l'interface sortante explicitement spécifiée, par exemple fe80::cba7:32b1:741d:5c41%ens192.Ruby URI ne peut pas gérer les adresses IPv6 locales de liaison avec une interface sortante explicitement spécifiée?

Whent Je suis en train de créer une nouvelle instance URI - Je reçois toujours la même erreur (pour les deux exemples ci-dessous):

URI("https://[fe80::cba7:32b1:741d:5c41%ens192]/") 
URI("https://[fe80::cba7:32b1:741d:5c41%25ens192]/") 

retours

URI::InvalidURIError: bad URI(is not URI?) 

S'il vous plaît avez-vous une idée de la façon de gérer ces adresses link-local IPv6? Juste pour la référence, j'ai essayé de faire une simple demande HTTP, cela fonctionne. Donc, en général, Ruby n'a pas de problème avec IPv6 :)

require 'net/https' 
request = Net::HTTP.new('fe80::cba7:32b1:741d:5c41%ens192', 443) 
request.use_ssl = true 
request.verify_mode = OpenSSL::SSL::VERIFY_NONE 
request.get('/') 

Merci à l'avance!

Répondre

0

Je viens de trouver la réponse ... La zone d'adressage IPv6 n'est pas supportée dans la spécification URI RFC3986. Et la mise en œuvre de Ruby URI suit les normes. Voilà pourquoi :) La seule façon serait:

Je J'ai trouvé que std. Go net/url bibliothèque prend en charge RFC6874, donc au moins il y a un peu d'inspiration pour le codage de Ruby RFC6874_Parser :)

package main 

import (
    "fmt" 
    "log" 
    "net/url" 
) 

func main() { 
    fmt.Println("Hello, playground") 
    u, err := url.Parse("https://[fe80::250:56ff:fe9e:76d9%25ens192]") 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Println(u.Hostname()) 
} 

retours

fe80::250:56ff:fe9e:76d9%ens192 

http://godoc.burntsushi.net/src/net/url/url.go