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 閱讀(1869) 評論(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。  回復  更多評論   

          主站蜘蛛池模板: 政和县| 浑源县| 贵州省| 神木县| 东阿县| 涿鹿县| 铜山县| 阿拉善左旗| 五指山市| 景泰县| 宁夏| 玛沁县| 祥云县| 黄石市| 星座| 民乐县| 武宁县| 五常市| 高雄市| 德安县| 会东县| 武安市| 西峡县| 马公市| 唐海县| 莒南县| 博白县| 白朗县| 探索| 通化市| 定远县| 乳山市| 长汀县| 天等县| 苍梧县| 延津县| 农安县| 巧家县| 西平县| 大宁县| 庄浪县|