<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    stone2083

    HtmlParser疑似Bug

    最近的項(xiàng)目中,使用到了HtmlParser(1.5版本).在使用過程中(如訪問url為:http://athena2002.vip.china.alibaba.com/ ),遇到了異常:
    Exception in thread "main" java.lang.IllegalArgumentException: invalid cookie name: Discard
        at org.htmlparser.http.Cookie.
    <init>(Cookie.java:136)
        at org.htmlparser.http.ConnectionManager.parseCookies(ConnectionManager.java:
    1126)
        at org.htmlparser.http.ConnectionManager.openConnection(ConnectionManager.java:
    621)
        at org.htmlparser.http.ConnectionManager.openConnection(ConnectionManager.java:
    792)
        at org.htmlparser.Parser.
    <init>(Parser.java:251)
        at org.htmlparser.Parser.
    <init>(Parser.java:261)
    檢查代碼,發(fā)現(xiàn):
    org.htmlparser.http.Cookie
     1 public Cookie (String name, String value)
     2     {
     3         if (!isToken (name) || name.equalsIgnoreCase ("Comment"// rfc2019
     4                 || name.equalsIgnoreCase ("Discard"// 2019++
     5                 || name.equalsIgnoreCase ("Domain")
     6                 || name.equalsIgnoreCase ("Expires"// (old cookies)
     7                 || name.equalsIgnoreCase ("Max-Age"// rfc2019
     8                 || name.equalsIgnoreCase ("Path")
     9                 || name.equalsIgnoreCase ("Secure")
    10                 || name.equalsIgnoreCase ("Version"))
    11             throw new IllegalArgumentException ("invalid cookie name: " + name);
    12         mName = name;
    13         mValue = value;
    14         mComment = null;
    15         mDomain = null;
    16         mExpiry = null// not persisted
    17         mPath = "/";
    18         mSecure = false;
    19         mVersion = 0;
    20     }
    一旦發(fā)現(xiàn)name值為“Discard”,則拋異常。

    而在org.htmlparser.http.ConnectionManager.parseCookies (URLConnection connection) 解析cookie的代碼中,見代碼片段
    if (key.equals ("domain"))
                                cookie.setDomain (value);
                            
    else
                                
    if (key.equals ("path"))
                                    cookie.setPath (value);
                                
    else
                                    
    if (key.equals ("secure"))
                                        cookie.setSecure (
    true);
                                    
    else
                                        
    if (key.equals ("comment"))
                                            cookie.setComment (value);
                                        
    else
                                            
    if (key.equals ("version"))
                                                cookie.setVersion (Integer.parseInt (value));
                                            
    else
                                                
    if (key.equals ("max-age"))
                                                {
                                                    Date date 
    = new Date ();
                                                    
    long then = date.getTime () + Integer.parseInt (value) * 1000;
                                                    date.setTime (then);
                                                    cookie.setExpiryDate (date);
                                                }
                                                
    else
                                                {   
    // error,? unknown attribute,
                                                    
    // maybe just another cookie not separated by a comma
                                                    cookie = new Cookie (name, value); //出問題的地方
                                                    cookies.addElement (cookie);
                                                }
    沒有對(duì)Discard做特殊處理。
    無奈之下,覆寫了此方法,加上對(duì)Discard的處理--直接continue :)

    今天在寫blog的時(shí)候,拿了1.6的代碼測(cè)試,發(fā)現(xiàn)沒有問題,分析代碼后發(fā)現(xiàn)
    1. ConnectionManager parserCookie之前,加了條件判斷
    if (getCookieProcessingEnabled ())
      parseCookies (ret);
    默認(rèn)情況下,條件為false
    2. parserCookie的時(shí)候,catch了異常
     1 // error,? unknown attribute,
     2 // maybe just another cookie
     3 // not separated by a comma
     4 try
     5 {
     6     cookie = new Cookie (name,
     7         value);
     8     cookies.addElement (cookie);
     9 }
    10 catch (IllegalArgumentException iae)
    11 {
    12     // should print a warning
    13     // for now just bail
    14     break;
    15 }
    雖然解決了問題,但是明顯還沒有意識(shí)到Discard的問題。

    從我的理解看,最合理的解決方案是:
    1. org.htmlparser.http.Cookie中添加 boolean discard方法
    2. org.htmlparser.http.ConnectionManager parserCookies()方法,對(duì)Discard做處理,如有值,則設(shè)置cookie.discard=true

    關(guān)于discard的解釋,見http://www.faqs.org/rfcs/rfc2965.html
    Discard
    OPTIONAL. The Discard attribute instructs the user agent to
    discard the cookie unconditionally when the user agent terminates

    posted on 2011-04-08 20:50 stone2083 閱讀(1867) 評(píng)論(2)  編輯  收藏 所屬分類: java

    Feedback

    # re: HtmlParser疑似Bug 2011-04-09 14:57 penngo

    應(yīng)該使用jsoup解析html,htmlparse解析html速度是比jsoup快,不過很多地方要自己寫代碼處理。除了你說的這個(gè)異常外,還有很多地方會(huì)出現(xiàn)異常,需要你自己寫代碼處理。易用性和解析結(jié)果的準(zhǔn)確性和jsoup相比差遠(yuǎn)了。  回復(fù)  更多評(píng)論   

    # re: HtmlParser疑似Bug 2011-04-09 19:31 stone2083

    @penngo
    收到,有空的時(shí)候,我去學(xué)習(xí)下jsoup。  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 在线免费观看视频你懂的| CAOPORN国产精品免费视频| 最近免费中文在线视频| 美女被羞羞网站免费下载| 久久精品国产亚洲精品| 成年女人午夜毛片免费看| 99精品国产成人a∨免费看| 亚洲a视频在线观看| 午夜无遮挡羞羞漫画免费| 免费国产99久久久香蕉| 日韩免费码中文在线观看| 亚洲精品无码一区二区| 亚洲精品久久久www| 手机在线免费视频| 免费能直接在线观看黄的视频| a国产成人免费视频| 亚洲国产成人综合| 亚洲国产婷婷综合在线精品| 成年丰满熟妇午夜免费视频| 免费视频爱爱太爽了| 最新黄色免费网站| 无码人妻一区二区三区免费n鬼沢| 亚洲伊人久久大香线蕉结合| 久久亚洲精品国产精品| 最近免费中文字幕视频高清在线看| 国产92成人精品视频免费| 亚洲精品在线免费观看视频| 亚洲精品免费观看| 性xxxxx大片免费视频| 免费无码作爱视频| 中文日本免费高清| 中文字幕在线视频免费| www永久免费视频| 一级一级毛片免费播放| 一进一出60分钟免费视频| 免费精品视频在线| 又黄又大的激情视频在线观看免费视频社区在线 | 亚洲a∨无码精品色午夜| 亚洲AV男人的天堂在线观看| 午夜在线a亚洲v天堂网2019| 99久久国产亚洲综合精品|