Как я могу получить недостающее печенье с Android?В Firefox да появляются - PullRequest
0 голосов
/ 09 августа 2010

Я могу получить печенье с Firefox, но не с Android.

Это код:

HttpParams httpparams = new BasicHttpParams();                          
httpparams.setParameter(ClientPNames.COOKIE_POLICY,CookiePolicy.BROWSER_COMPATIBILITY);

HttpGet httpget = new HttpGet(sURL);
httpget.setParams(httpparams);
httpget.setHeader("User-Agent","Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");
httpget.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
httpget.setHeader("Accept-Language", "es-mx,es;q=0.8,en-us;q=0.5,en;q=0.3");
httpget.setHeader("Accept-Encoding", "gzip,deflate");
httpget.setHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
httpget.setHeader("Keep-Alive", "115");

BasicHttpResponse response = (BasicHttpResponse) httpclient.execute(httpget);

Используя wireshrack я видел:

GET /login.php HTTP/1.1
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-mx,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Host: www.conquerclub.com
Connection: Keep-Alive

и ответ использует мой код:

HTTP/1.1 200 OK
Date: Mon, 09 Aug 2010 05:41:38 GMT
Server: Apache/2.0.52 (Red Hat)
X-Powered-By: PHP/5.2.13
Set-Cookie: referer=%5Bdirect%5D; path=/
Set-Cookie: referer60=%5Bdirect%5D; expires=Wed, 08-Sep-2010 05:41:38 GMT; path=/
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

, но с Firefox ответ

HTTP/1.1 200 OK
Date: Mon, 09 Aug 2010 05:11:13 GMT
Server: Apache/2.0.52 (Red Hat)
X-Powered-By: PHP/5.2.13
Set-Cookie: referer=%5Bdirect%5D; path=/
Set-Cookie: referer60=%5Bdirect%5D; expires=Wed, 08-Sep-2010 05:11:13 GMT; path=/
Set-Cookie: PHPSESSID=sv8f6ro571t9rv999mu6jtkbu3; path=/; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Length: 4324
Connection: close
Content-Type: text/html

снова, используя wireshark, чтобы увидеть Firefox, я получил это:

GET / HTTP/1.1
Host: www.conquerclub.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-mx,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

То же самое, но сервер не отвечает на эту строку

Set-Cookie: PHPSESSID=sv8f6ro571t9rv999mu6jtkbu3; path=/; HttpOnly

Почему?любая идея была бы очень хорошо получена.

Ответы [ 2 ]

0 голосов
/ 11 августа 2010

Простите, ребята.Я понял, что сделал ошибку С Firefox, я запрашиваю www.conquerclub.com с путем "/" НО, используя мой код, я запрашиваю www.conquerclub.com с путем "/login.php"

После того как я удалилэто "login.php", просьба вернуть 3 куки

0 голосов
/ 09 августа 2010

Мне попалась похожая проблема с андроидом. Это происходит из-за политики происхождения файлов cookie в режиме совместимости браузера. HTTP-клиент в Android отклоняет cookie, потому что путь cookie не совпадает с текущим запрошенным путем документа.

например. если ваш путь cookie: /mypath, а ваш файл cookie происходит из: /mypath/myAdditionalPath, http-клиент отклонит cookie (внутренне выбрасывая MalformedCookieException). Но браузеры будут принимать такие куки.

Чтобы обойти эту проблему в своем коде, вам нужно реализовать собственную спецификацию cookie, которая расширяется от BrowserCompatSpec . Вот пример кода скелета:

   public class MyCookieSpec extends BrowserCompatSpec {

      @Override
      public void validate(Cookie cookie, CookieOrigin origin) throws 
             MalformedCookieException {
         if(cookie == null) {
            throw new IllegalArgumentException("Cookie cannot be null");
         }
         if(origin == null) {
            throw new IllegalArgumentException("Cookie origin cannot be null");
         }


         // use these logs to see what is the difference between paths of the 
         // cookieOrigin and the cookie.
         String pth = cookie.getPath();
         Log.i(TAG, "Cookie ====================================> " + cookie);
         Log.i(TAG, "CookieOrigin ====================================> " + origin);

         // Check if the cookie is from the same domain, if so return silently
         // or else throw a MalformedCookieException

      }

      @Override
      public boolean match(Cookie cookie, CookieOrigin origin) {
         if(cookie == null) {
            throw new IllegalArgumentException("Cookie cannot be null");
         }
         if(origin == null) {
            throw new IllegalArgumentException("Cookie origin cannot be null");
         }
         if(Log.isLoggable(TAG, Log.DEBUG)) {
            Log.d(TAG, "Matching cookie " + cookie + " with origin " + origin);
         }

         // if the cookie is originating from the same domain as of the origin
         // return true or return false. Be careful here and only return true if
         // the cookie is originating from the same domain as that of what is in the 
         // cookie's path
         return true;
      }
   }

Чтобы зарегистрироваться и использовать эту спецификацию cookie с вашим http-клиентом, используйте следующее:

  DefaultHttpClient httpClient = new DefaultHttpClient(cm, params);
  httpClient.getCookieSpecs().register("myspec", new CookieSpecFactory() {

     public CookieSpec newInstance(HttpParams hp) {
        return new MyCookieSpec();
     }
  });
  httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, "myspec");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...