<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。  回復  更多評論   

    主站蜘蛛池模板: 国产va免费观看| 亚洲欧美国产国产综合一区| 人人爽人人爽人人片av免费| 又黄又大又爽免费视频| 99亚洲男女激情在线观看| 可以免费观看的一级毛片| 污污视频免费观看网站| 亚洲综合色区在线观看| 两个人的视频www免费| 国产精品亚洲片在线| 外国成人网在线观看免费视频| 亚洲人成在线观看| 97人妻无码一区二区精品免费| 亚洲影视自拍揄拍愉拍| 免费无码黄网站在线观看| 国产亚洲Av综合人人澡精品| 亚洲国产天堂久久久久久| 精选影视免费在线 | 亚洲三级电影网站| 91在线视频免费看| 在线视频亚洲一区| 中国亚洲女人69内射少妇| 无码AV片在线观看免费| 麻豆狠色伊人亚洲综合网站 | 亚洲午夜成人精品电影在线观看| 男女啪啪免费体验区| 亚洲av永久无码精品古装片| 99久久久国产精品免费无卡顿 | 222www免费视频| 精品国产亚洲第一区二区三区 | 亚洲一卡2卡4卡5卡6卡在线99 | 一级毛片免费全部播放| 亚洲伦理一区二区| 免费无码又爽又刺激高潮| 国产99久久久国产精免费| 久久99亚洲网美利坚合众国| 精品少妇人妻AV免费久久洗澡| 中文字幕在线免费视频| 精品国产日韩久久亚洲| 日本红怡院亚洲红怡院最新| 67194成是人免费无码|