2012-06-25 16 views
5

मैंने एक डांसर वेब ऐप लिखा है जो प्रमाणीकरण के लिए OpenIDs का उपभोग करने के लिए Net::OpenID::Consumer का उपयोग करता है। यह Google और MyOpenID के साथ अच्छी तरह से काम करता है, लेकिन याहू नहीं। यदि कोई उपयोगकर्ता अपने याहू खाते का उपयोग कर प्रमाणित करने के लिए कोशिश करता है, HTML::Parser चेतावनी देते हैं:मैं याहू ओपनआईड्स के साथ नेट :: ओपनआईडी :: उपभोक्ता का उपयोग करके एन्कोडिंग त्रुटियों से कैसे बच सकता हूं?

Parsing of undecoded UTF-8 will give garbage when decoding entities

और इस चेतावनी मेरे ऐप (हक तो) को मारता है।

मुझे Net::OpenID::Consumer (या सामान्य) के साथ कोई मौजूदा बग नहीं दिखाई देता है जो इससे संबंधित है।
HTTP शीर्षलेख और HTML मेटा टैग दोनों 'दावा आईडी' यूआरआई के लिए यूटीएफ -8 निर्दिष्ट करते हैं।
HTML::Parser के लिए प्रतिक्रिया क्यों डीकोड नहीं की जाएगी? क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है?

यहाँ प्रासंगिक कोड है:

get '/openid_landing' => sub { 
    my $params = params(); 
    my $csr = Net::OpenID::Consumer->new(
     ua => LWP::UserAgent->new(), 
     consumer_secret => $secret, 
     params => $params, 
    ); 
    my $id = $params->{'openid.claimed_id'}; 

    if (my $setup_url = $csr->user_setup_url) { 
     redirect $setup_url; 

    } elsif ($csr->user_cancel) { 
     redirect uri_for('/'); 

    } elsif (my $vident = $csr->verified_identity) { 
     # verified identity, log in or register user 
     ... 

    } else { 
     die "Error validating identity: " . $csr->err; 
    } 
}; 
+0

[अपने कोड दिखाएँ] (http://sscce.org) ताकि लोग [समस्या को पुन:] हो सकता है (http: // www.chiark.greenend.org.uk/~sgtatham/bugs.html#showmehow)। – daxim

+1

लगता है जैसे आपने पार्सर को पास करने से पहले HTML को डीकोड नहीं किया था, इसलिए इसे डीकोड करें। अगर यह एलडब्ल्यूपी था, तो मैं '-> content' के बजाय' -> decoded_content' का उपयोग कहूंगा। –

+1

उपयोगकर्ता 1215106, नेट :: ओपनआईडी :: कॉमन एचटीएमएल को पकड़ रहा है और पार्स कर रहा है, न कि मेरा कोड। – kbosak

उत्तर

1

बग में है नेट/OpenID/URIFetch.pm तर्ज पर संस्करण 1.14 (नवीनतम) यह बजाय कच्चे सामग्री प्रतिक्रिया ऑब्जेक्ट की डीकोड सामग्री उपयोग कर रहा है की 122-128। बस मैन्युअल gzip डिकोडिंग को हटा दें और प्रतिक्रिया में decoded_content विधि का उपयोग करें।

मैंने अभी तक एक बग रिपोर्ट दायर नहीं की है, नि: शुल्क महसूस करें। :)

यहाँ एक diff आप इसे ठीक करने के लिए आवेदन कर सकते हैं क्या है:

122c122 
<   my $content = $res->decoded_content; 
--- 
>   my $content = $res->content; 
125a126,129 
>   if ($res->content_encoding && $res->content_encoding eq 'gzip') { 
>    $content = Compress::Zlib::memGunzip($content); 
>   } 
> 
+0

बहुत बढ़िया, धन्यवाद! मैं जल्द ही इस पर एक बग रिपोर्ट दर्ज करूंगा और इस पोस्ट को लिंक करूंगा। – kbosak

0

यह decode_utf8 के माध्यम से उन्हें खिलाने, एचटीएमएल :: पार्सर मॉड्यूल, हुड के नीचे TreeBuilder द्वारा किया जाता है इससे पहले कि आप TreeBuilder करने के लिए पृष्ठ सामग्री गुजर से आता है:

use HTML::TreeBuilder; 
use Encode; 
my $contents = ...; 
my $htree = HTML::TreeBuilder->new_from_content(decode_utf8 $contents); 

अधिक जानकारी के लिए:

http://metacpan.org/pod/HTML::TreeBuilder#new-from-content

http://search.cpan.org/dist/HTML-Parser/Parser.pm