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

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

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

    stone2083

    HtmlParser疑似Bug

    最近的項目中,使用到了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)
    檢查代碼,發現:
    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     }
    一旦發現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);
                                                }
    沒有對Discard做特殊處理。
    無奈之下,覆寫了此方法,加上對Discard的處理--直接continue :)

    今天在寫blog的時候,拿了1.6的代碼測試,發現沒有問題,分析代碼后發現
    1. ConnectionManager parserCookie之前,加了條件判斷
    if (getCookieProcessingEnabled ())
      parseCookies (ret);
    默認情況下,條件為false
    2. parserCookie的時候,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 }
    雖然解決了問題,但是明顯還沒有意識到Discard的問題。

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

    關于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) 評論(2)  編輯  收藏 所屬分類: java

    Feedback

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

    應該使用jsoup解析html,htmlparse解析html速度是比jsoup快,不過很多地方要自己寫代碼處理。除了你說的這個異常外,還有很多地方會出現異常,需要你自己寫代碼處理。易用性和解析結果的準確性和jsoup相比差遠了。  回復  更多評論   

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

    @penngo
    收到,有空的時候,我去學習下jsoup。  回復  更多評論   

    主站蜘蛛池模板: 亚洲无砖砖区免费| 日韩精品无码免费一区二区三区| 日韩吃奶摸下AA片免费观看| 亚洲第一精品电影网| 99久在线国内在线播放免费观看| 亚洲AV无码久久精品色欲| 免费国产99久久久香蕉| 亚洲伦理一区二区| 2015日韩永久免费视频播放 | 亚洲一区二区视频在线观看 | 成全在线观看免费观看大全| 亚洲桃色AV无码| 久久久国产精品无码免费专区| 亚洲永久永久永久永久永久精品| 99视频免费播放| jlzzjlzz亚洲jzjzjz| 热99re久久免费视精品频软件| 色多多免费视频观看区一区| 亚洲精品网站在线观看不卡无广告| 一级做a爱过程免费视频高清| 亚洲色大成网站www永久一区 | 2048亚洲精品国产| 精品国产麻豆免费人成网站| 久久久久亚洲Av无码专| 24小时日本在线www免费的| 美女视频黄a视频全免费网站一区 美女视频黄a视频全免费网站色 | 成人免费a级毛片无码网站入口 | 免费v片在线观看无遮挡| 亚洲天堂免费在线视频| 亚洲视频一区网站| 日韩a级毛片免费观看| a级毛片免费网站| 亚洲视频在线观看视频| 四虎影视永久免费观看网址 | 成人国产精品免费视频| 亚洲综合网美国十次| 麻豆精品国产免费观看| 免费精品久久天干天干| 国产精品亚洲专区在线观看| 免费A级毛片无码久久版| 一级做a爰全过程免费视频|