2009-09-07 8 views
3

J'utilise WWW::Mechanize pour effectuer une traversée de site Web standard, mais à un moment donné, je dois construire une requête POST spéciale et l'envoyer. Tout cela nécessite des cookies de session.Puis-je encoder des espaces en% 20 dans un POST à ​​partir de WWW :: Mechanize?

Dans la requête POST que je suis en train de faire, les espaces sont codés en + symboles, mais j'ai besoin qu'ils soient codés en% 20.

Je n'arrive pas à comprendre comment modifier ce comportement. Je me rends compte qu'ils sont équivalents, mais pour des raisons qui sont hors de mes mains, c'est ce que je dois faire.

Merci pour toute aide.

Répondre

1

Ceci est codé en dur dans URI::_query::query_form(). Il traduit les espaces en +.

$val =~ s/ /+/g; 

Il appelle ensuite URI :: _ requête :: requête avec les paires jointes, où les seuls signes + doivent être des espaces encodées. La chose la plus facile à faire est probablement d'intercepter les appels à URI :: _ query :: query avec Hook::LexWrap, de modifier l'argument avant le début de l'appel afin que vous puissiez transformer + en% 20, et continuer à partir de là.

Un peu plus ennuyeux serait de redéfinir URI :: _ query :: query. Ce n'est pas si long, et vous avez juste besoin d'ajouter du code au début de la sous-routine pour transformer les arguments avant de continuer.

Ou, vous pouvez réparer le parser cassé de l'autre côté. :)

J'ai quelques chapitres traitant des sous-routines et des sous-routines dynamiques en Mastering Perl. L'astuce consiste à le faire sans changer la source d'origine afin de ne pas introduire de nouveaux problèmes pour tout le monde.

+0

Mieux vaut le réparer d'une manière que les autres peuvent utiliser et ne pas être brisé silencieusement si quelqu'un fait quelque chose comme traduire l'URI vers XS. – ysth

+0

Merci pour l'info. Je vais devoir apprendre un peu plus perl ... – aidan

0

Cela semble être codé en dur dans URI :: _ query :: query_form(). Je modifierais conditionnellement cela basé sur un global comme c'est fait avec $ URI :: DEFAULT_QUERY_FORM_DELIMITER et soumet votre changement au mainteneur d'URI. A part cela, peut-être pourriez-vous utiliser un gestionnaire de rappel LWP :: UserAgent request_prepare?

+0

Pourquoi pensez-vous que $ URI :: DEFAULT_QUERY_FORM_DELIMITER a quelque chose à voir avec ça? C'est la chose qui va entre les paires. C'est un problème avec query_form hard-coding le s// +/g; –

+0

@brian d foy: Je ne le fais pas. Je suggérais de faire un hack similaire pour surcharger l'encodage de l'espace URI. – ysth