Почему POST-запрос curl приводит к сбою моего контроллера Catalyst :: Controller :: REST? - PullRequest
4 голосов
/ 13 мая 2011

Я использую Catalyst для создания веб-службы RESTful, поэтому я создаю контроллер Catalyst обычным способом

script/myapp_create.pl controller MyApp::Controller

Я тогда запускаю сервер тестирования катализатора

script/zoo_server.pl -rd

Пока все хорошо - теперь я могу перейти к http://localhost:3000/user и увидеть сообщение «Соответствует MyApp :: Controller :: User in User».

Затем я заменяю первую строку BEGIN в lib / MyApp / Controller / User.pm на следующую строку

BEGIN { extends 'Catalyst::Controller::REST' }

Прежде чем делать что-либо еще, я хочу проверить свою способность выполнить запрос POST и посмотреть ответ. Поэтому в другом окне терминала я набираю

curl http://localhost:3000/user --verbose --data "<test><m>whatever</m></test>" -H "Content-Type: text/xml"

На данный момент, поскольку я не реализовал никаких методов POST, я ожидаю увидеть ответ «405 Метод не разрешен». Вместо этого я вижу следующее:

* About to connect() to localhost port 3000 (#0)
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 3000 (#0)
> POST /user HTTP/1.1
> User-Agent: curl/7.19.6 (i386-apple-darwin10.0.0) libcurl/7.19.6 zlib/1.2.5
> Host: localhost:3000
> Accept: */*
> Content-Type: text/xml
> Content-Length: 28
> 
* Empty reply from server
* Connection #0 to host localhost left intact
curl: (52) Empty reply from server
* Closing connection #0

Это затем приводит к сбою тестового сервера катализатора. Сервер ничего не регистрирует, но в будущем пытается связаться с сервером, например, выполнение еще одного запроса GET к «localhost: 3000 / user» приводит к ошибкам «curl to not connect to host» от curl.

Замечу, что это происходит только в том случае, если я использую Catalyst :: Controller :: REST. Если я просто сделаю обычный контроллер, POSTing к нему ничего не вылетит. Поэтому я предполагаю, что это происходит при действии десериализации, которое будет делегировано XML :: Simple (согласно стандартному значению Catalyst :: Controller :: REST). Есть идеи?

Кстати, я хочу создать метод, подобный sub thing :Local :ActionClass('REST') ... и соответствующий sub thing_POST. Насколько я понимаю, POST-запросы к / user / вещь, содержащая XML, должны затем автоматически десериализоваться и поместить их в $c->request->data, прежде чем будет вызван thing_POST. Приведенные выше тесты являются предварительными к этому - предназначены для проверки того, что происходит, если определен метод no POST. (Что бы это ни стоило, я получаю точно такое же поведение, если я создаю sub thing и sub thing_POST, а затем использую curl для выдачи запроса POST в /user/thing.)

Ответы [ 2 ]

2 голосов
/ 14 мая 2011

Я в конечном итоге проследил это до XML :: SAX.Воспроизводимая ошибка:

% cat >! test
<test><a>blah</a></test>
% perl -e 'use XML::SAX;my $sp = XML::SAX::ParserFactory->parser;my $tree = $sp->parse_uri("test")'
Segmentation fault

Обратите внимание, что он работает нормально, если XML заключен в кавычки, а не в файл:

% perl -e 'use XML::SAX;my $sp = XML::SAX::ParserFactory->parser;my $tree = $sp->parse_string("<a><b>test</b></a>");print $tree'
HASH(0x1009c4470)

Что-то не так с моей установкой XML :: SAX, ядумаю.

0 голосов
/ 13 мая 2011

Вы определили свое действие вещь с помощью: Локальный атрибут присоединен, что означает, что отправляемый путь - / пользователь / вещь (вместо этого вы публикуете свои данные для / пользователя). Может быть, вы захотите проверить Руководство по Catalyst - Типы действий, введение

В качестве альтернативы, если у вас все еще есть проблемы, вы можете попробовать задать их на официальном канале #catalyst irc.

...