2012-04-12 15 views
3

Ich versuche, LWP gegen einen IIS-Server mit NTLM-Authentifizierung konfiguriert arbeiten. Wenn die NTLM-Authentifizierung auf dem Server deaktiviert ist, funktioniert der Code einwandfrei. Daher nehme ich an, dass das einzige Problem hier die NTLM-Authentifizierung ist.Wide-Zeichen in Unterprogrammeintrag bei Verwendung von LWP mit NTLM-Authentifizierung

Bisher habe ich folgendes:

my $ua = LWP::UserAgent->new(agent => "whatever", 
          timeout => $timeout, keep_alive => 1); 
$ua->credentials('hostname:80', '', $username, $password); 

my $hdr = HTTP::Headers->new("Content-Type" => "text/xml; charset=UTF-8", 
          "SOAPAction" => "\"whatever\""); 

my $req = HTTP::Request->new("POST" => $url, $hdr, encode_utf8($post)); 
$res = $ua->request($req); 

Wenn ich auf das Debuggen drehen, erhalte ich folgende Meldungen:

LWP::UserAgent::new:() 
LWP::UserAgent::request:() 
LWP::UserAgent::send_request: POST http://hostname 
LWP::UserAgent::_need_proxy: Not proxied 
LWP::Protocol::http::request:() 
LWP::Protocol::http::request: Keep the http connection to hostname:80 
LWP::UserAgent::request: Simple response: Unauthorized 
LWP::Authen::Ntlm::authenticate: authenticate() has been called 
Use of uninitialized value in exists at /usr/lib/perl5/vendor_perl/5.8.5/LWP/UserAgent.pm line 560. 
Use of uninitialized value in hash element at /usr/lib/perl5/vendor_perl/5.8.5/LWP/UserAgent.pm line 561. 
LWP::Authen::Ntlm::authenticate: In first phase of NTLM authentication 
[Thu Apr 12 13:55:28 2012] [error] Wide character in subroutine entry at /usr/lib/perl5/site_perl/5.8.5/Authen/NTLM.pm line 346.\n 
LWP::Protocol::collect: read 625 bytes 
LWP::UserAgent::request: Simple response: Internal Server Error 

Der Versuch, die gleiche URL für den Zugriff auf mit wget funktioniert gut. Die Dokumentation für MIME::Base64 sagt, dass die Kodierungsfunktion mit Wide character in subroutine entry quaken, wenn $ Bytes über 255 Zeichen mit Code enthält

bin ich etwas fehlt hier wesentlich, oder könnte dies ein Fehler sein in Authen::NTLM?

+1

ich die Dokumentation Bekanntmachung 'LWP :: Authen :: Ntlm' sagt * Das Modul Vorteil des Moduls Authen :: NTLM nimmt von Mark Bush. Da dort ist auch ein anderes Authen: NTLM-Modul von CPAN von Yee Man Chan mit einer völlig anderen Schnittstelle, ist es notwendig, um sicherzustellen, dass Sie das richtige NTLM-Modul haben. * Vielleicht ist dies das Problem? – Borodin

+0

@Borodin: Das Modul listet Mark Bush im Author-Bereich auf. Ich habe auch die spezifische Version installiert, die in LWP benötigt wird - ich hatte Authen1 :: NTLM 1.09, aber die Version von LWP, die ich benutze, benötigt 1.02, aber bekomme den gleichen Fehler. – Vetle

+1

Hallo Vetle :) Haben deine '$ username' oder' $ password 'zufällige nicht-ASCII-Zeichen? – cosimo

Antwort

-1

Was ist in $ Post? Vielleicht ist es schlechte Daten enthalten.

Try this:

my $post_encoded = encode_utf8($post); 
print Dumper($post,$post_encoded); 
my $req = HTTP::Request->new("POST" => $url, $hdr, $post_encoded); 
+0

Ich habe versucht, '$ post_encoded' mit 'asdasd' zu ersetzen, und bekomme die gleiche Fehlermeldung. Ich habe dies mit NTLM-Authentifizierung auf dem Server ausgeschaltet getestet, und es funktioniert gut. Der NTML-Authentifizierungsprozess * sollte unabhängig von dem sein, was ich posten möchte, wie es in separaten HTTP-Anfragen geschieht. – Vetle

+0

encode_utf8 konvertiert nicht nur eine Zeichenkette in utf-8, sondern setzt auch das utf-8-Flag darauf. Auf diese Weise wissen die Perl-Interna, dass es einen utf-8-Wert enthält. Oder Sie können den umgekehrten Weg ausprobieren und decode_utf8 verwenden. – user1126070

+0

Das ist irrelevant. Ich habe $ post_encoded durch 'asdasd' ersetzt (ohne irgendeine Kodierung zu machen), und es funktioniert immer noch nicht. – Vetle

-4

Verwenden Sie einfach curl

curl --ntlm -u 'username:password' url 
+0

Danke, aber nicht wirklich hilfreich. ;) Wget funktioniert auch gut, aber ich brauche das mit LWP zu arbeiten. – Vetle