2010-09-20 21 views
12

Thực hiện OAuth2 trong ứng dụng của tôi, tôi cần phải xử lý URI như:Làm thế nào để ngăn chặn ký tự ống gây ra Lỗi Lỗi URI trong Rails 3/Ruby 1.9.2?

http://localhost:3000/sessions/create/?code=lorem|ipsum

Không chắc nếu đó là một Rails 3 hay Ruby 1.9.2 vấn đề (có thể URI.parse), nhưng trong mọi trường hợp, WEBrick đá Error bad URI.

Bất kỳ ai biết cách giải quyết? Cảm ơn.

+1

Bạn có thể muốn sửa chữa các lỗi đánh máy trong tiêu đề của bạn ... – hurikhan77

+0

có bạn đặt '# mã hóa: UTF-8' ở phía trên cùng của bạn các tập tin? 1,9+ là rất nhạy cảm về nhân vật, thật đáng buồn. – oma

Trả lời

15

Gần đây tôi đã gặp yêu cầu tương tự (và vấn đề). Trên Rails 3 và Ruby 1.9.2.

Nó không phải là một vấn đề cho môi trường dàn dựng/sản xuất của chúng tôi (nginx), nhưng tôi đã quan tâm để tìm hiểu vấn đề là gì với WEBrick. Hóa ra vấn đề nằm trong phương thức URI :: Parser.split, cụ thể là cách đối sánh mẫu của nó được tạo hạt giống với các hằng số URI :: REGEXP :: PATTERN.

Bạn có thể "sửa" điều này bằng cách thêm phần sau vào config/environment/development.rb (giả sử bạn chỉ sử dụng WEBrick trong dev .. hoặc bạn có thể đặt nó trong tệp cấu hình/khởi tạo) ..

# this allows WEBrick to handle pipe symbols in query parameters 
URI::DEFAULT_PARSER = 
    URI::Parser.new(:UNRESERVED => URI::REGEXP::PATTERN::UNRESERVED + '|') 

NB: cài đặt đó: UNRESERVED => "-_.! ~ * '() A-zA-Z \ d |"

+1

'URI :: Parser' ==>' NameError: hằng số không được khởi tạo URI :: Parser'. Bất kỳ ý tưởng? Đó là Ruby 1.8.7 – Matthias

+1

có, URI trong phiên bản 1.8 rất khác, và khó khăn hơn nhiều để vá mà không cần viết lại các khối lớn của mô-đun URI. NẾU bạn có vấn đề này, khóa học tốt nhất là nâng cấp lên 1.9 hoặc sử dụng một cái gì đó khác hơn là WEBrick – tardate

+0

Đây là một giải pháp thực sự tuyệt vời. Một vấn đề tôi gặp phải là ngay cả khi bạn thoát khỏi URL, một số trang web (như yahoo) sẽ chuyển tiếp bạn tới một URL có các ký tự không thoát (!) Và OpenURI vẫn bị treo. Cảm ơn! – idrinkpabst

1

Tôi đã kết thúc việc trao đổi bằng Thin cho WEBrick và chưa gặp sự cố.

7

Trình khởi chạy hoạt động, nhưng tôi đã sử dụng URI.escape thay vì nó có vẻ sạch hơn và có vẻ như nó sẽ xử lý nhiều trường hợp hơn.

URI.join(origin_url, URI.escape(parsed_link)).to_s 

Thêm mã này ngay didnt dường như đúng

# I need this because URI.join in crawler.rb bombs with '|' symbols 
old_verbose = $VERBOSE 
$VERBOSE = nil 
URI::DEFAULT_PARSER = URI::Parser.new(:UNRESERVED => URI::REGEXP::PATTERN::UNRESERVED + '|') 
$VERBOSE = old_verbose 
Các vấn đề liên quan