Может ли Rails / Mongrel принять форму POST с текстовым полем, значение которого является URL - PullRequest
1 голос
/ 21 февраля 2009

В моем приложении Rails я пытаюсь создать форму, которая позволяет пользователям создавать закладки.

<% form_tag( contents_path ) do %>
  <input name='item_type' value="Bookmark" type="hidden" /></p>
  <h3>Create New Bookmark</h3>
  <p>Title:<input name='item[title]' type="text" /></p>
  <p>URL:<input name='item[url]' type="text" /></p>
  <%= submit_tag 'Create' %>
<% end %>

<ч /> Изменить: для ясности, вот фактический HTML-код, сгенерированный с помощью вышеуказанного шаблона:

<form action="/contents" method="post"><div style="margin:0;padding:0"><input name="authenticity_token" type="hidden" value="cc709c404365f1a5754a7bf0c3fe79ce9ec9f96b" /></div>
  <input name='item_type' value="Bookmark" type="hidden" /></p>
  <h3>Create New Bookmark</h3>
  <p>Title:<input name='item[title]' type="text" /></p>
  <p>URL:<input name='item[url]' type="text" /></p>
  <input name="commit" type="submit" value="Create" />
</form>

Как видите, это совершенно нормальная форма. <ч /> Он отлично работает, если не введен фактический URL, в этом случае сервер никогда не отвечает, и я получаю сообщение в моем файле mongrel.log

Error reading HTTP body: #<RuntimeError: Socket read return nil>
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/http_request.rb:105:in `read_socket'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/http_request.rb:77:in `read_body'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/http_request.rb:55:in `initialize'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:149:in `new'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:149:in `process_client'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:285:in `run'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:285:in `initialize'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:285:in `new'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:285:in `run'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:268:in `initialize'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:268:in `new'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel.rb:268:in `run'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/configurator.rb:282:in `run'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/configurator.rb:281:in `each'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/configurator.rb:281:in `run'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/mongrel_rails:128:in `run'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/../lib/mongrel/command.rb:212:in `run'
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/mongrel_rails:281
/usr/bin/mongrel_rails:16:in `load'
/usr/bin/mongrel_rails:16

Как видно, запрос никогда не достигает кода моего контроллера.

С тех пор я обнаружил, что отправка любой формы, где значение поля начинается со строки "http: /", вызывает проблему. помещая любые другие символы или пробелы, прежде чем это решит проблему. Я также пробовал это в других приложениях Rails (на том же сервере) с тем же результатом.

Таким образом, можно обойти проблему, вставив дополнительное место в начале строки и удалив его на сервере.

Но я бы предпочел исправление на стороне сервера, только если это возможно.

Я надеюсь, что это просто неверная конфигурация на сервере.

Я работаю под Rails 2.1.0 на основе общего хостинга на основе CPanel.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2009

Трассировка стека показывает, что он не загружал ни один код Rails, когда он падает, поэтому, вероятно, это не проблема с вашим кодом или самим Rails. Я предполагаю, что ваш хост использует что-то вроде mod_security, которое считает ваш запрос подозрительным и искажает данные о вас.

У меня не было проблем с тем, чтобы URL-адреса вводились через формы как через Mongrel, так и через Passenger на Apache, хотя это был самообслуживаемый выделенный сервер.

1 голос
/ 21 февраля 2009

почему не form_for вместо form_tag? Я просто работал над чем-то похожим на это, и у меня никогда не возникало проблем с публикацией полных URL-адресов.

Одна из проблем, с которыми я сталкиваюсь, заключается в том, что вы показываете нам форму отправки, но ни один из кодов контроллера, более чем вероятный, где разрыв.

...