2009-09-07 3 views
3

표준 웹 사이트 탐색을 수행하기 위해 WWW::Mechanize을 사용하고 있지만, 한 번에 특별한 POST 요청을 구성하여 보내야합니다. 이 모든 작업에는 세션 쿠키가 필요합니다.WWW :: Mechanize의 POST에서 공백을 % 20으로 인코딩 할 수 있습니까?

POST 요청에서 공백이 + 기호로 인코딩되고 있지만 % 20으로 인코딩해야합니다.

이 동작을 변경하는 방법을 알 수 없습니다. 나는 그것들이 동등하다는 것을 알고 있지만, 내 손에서 벗어난 이유 때문에, 이것이 내가해야하는 일이다.

도움 주셔서 감사합니다.

답변

1

이 코드는 URI::_query::query_form()에 하드 코딩되어 있습니다. 공백을 +로 변환합니다.

$val =~ s/ /+/g; 

그런 다음 조인 된 쌍과 함께 URI :: _ query :: query를 호출합니다. 단, + 기호는 인코딩 된 공백이어야합니다. 가장 쉬운 방법은 아마도 URI :: _ query :: query에 대한 호출을 Hook::LexWrap으로 가로 채고, 호출을 시작하기 전에 인수를 수정하여 % 20으로 바꿀 수 있고 거기에서 계속 진행할 수 있습니다.

조금 더 짜증나는 것은 URI :: _ query :: query를 재정의하는 것입니다. 그리 길지는 않습니다. 인수가 계속되기 전에 인수를 변환하기 위해 서브 루틴 시작 부분에 코드를 추가하기 만하면됩니다.

또는 다른 쪽에서 깨진 파서를 수정할 수 있습니다. :)

Mastering Perl에 메서드 재정의 및 동적 서브 루틴 처리에 대한 몇 개의 장이 있습니다. 트릭은 원래 소스를 변경하지 않고이 작업을 수행하여 다른 모든 사람들에게 새로운 문제가 발생하지 않도록하는 것입니다.

+0

URI를 XS로 변환하는 것과 같은 일을하면 다른 사람들이 사용할 수있는 방식으로 문제를 해결하는 것이 훨씬 낫습니다. – ysth

+0

정보 주셔서 감사합니다. 나는 perl을 좀 더 배워야 할 것입니다 ... – aidan

0

이것은 URI :: _ query :: query_form()에 하드 코딩 된 것으로 보입니다. 조건부로 $ URI :: DEFAULT_QUERY_FORM_DELIMITER와 같이 글로벌 기반으로 수정하고 URI 관리자에게 변경 사항을 제출하십시오.

그 외에도 LWP :: UserAgent request_prepare 콜백 핸들러를 사용할 수 있습니까?

+0

왜 $ URI :: DEFAULT_QUERY_FORM_DELIMITER이 (와) 관련이 있다고 생각하십니까? 그것이 쌍 사이에있는 것입니다. 이것은 s// +/g를 하드 코딩하는 query_form의 문제입니다. –

+0

@brian d foy : 그렇지 않습니다. 나는 URI의 공간 인코딩을 오버라이드 (override)하는 것과 비슷한 해킹을 제안했다. – ysth

관련 문제