wtorek, sierpnia 13, 2013

Programowanie trudne ;-)

Właśnie wypuściłem nową wersję Bloggeroida, która poprawi najczęstszy problem z Bloggeroidem....

Bloggeroid używa OAuth2, robi to przez Google Play Services, które zwracają mu po prostu token, który trzeba wstawić do nagłówka requestu HTTP.
Ale token czasem jest przeterminowany, wtedy serwer zwraca 401 i trzeba unieważnić istniejący token i poprosić o nowy.
Dość logiczne.

Niestety ja używałem tego mniej więcej tak ;-)
 URL url = new URL("https://www.blogger.com/feeds/default/blogs");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Authorization", authType+token);
[...]
int tries = 0;
while (tries<3) {
           try {
             parseAnswer(conn);
           } catch (PublishException pe) {
             tries++;
             if (tries==3) throw pe;
             invalidateToken(token);
             token=getNewToken();
           }
        }
Niby wszystko OK.... jest zła rzecz, czyli jakaś tam forma sterowania przepływem przy pomocy wyjątków, ale spoko.
Jak nie wychodzi ze starym tokenem, to go unieważniamy i tworzymy nowy....

Dopiero po czasie dostrzegłem dość oczywisty błąd w tym kodzie ;-) [tu jest go łatwiej dostrzec bo explicite wywaliłem tu autoryzację ;-)]

Co mi da zmiana tokena, jak nadal operuję na tym samym połączeniu, które zostało nawiązane ze starym tokenem ;-)

 Dopiero przerobienie kodu na taki:

int tries = 0;
while (tries<3) {
try {
URL url = new URL("https://www.blogger.com/feeds/default/blogs");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Authorization", authType+token);
[...]
          parseAnswer(conn);
          break;
        } catch (PublishException pe) {
           tries++;
           if (tries==3) throw pe;
           invalidateToken(token);
           token=getNewToken();
        }
     }

rozwiązało problem ;-)

Jedyne co mnie tłumaczy to fakt, że ten kod działał wcześniej dla innego typu autoryzacji, później dodałem OAuth2, który działał, ale czasem nie... i widziałem czemu, ale nie umiałem tego zreprodukować, więc poprawiłem kod bez sprawdzenia czy rozwiązuje problem (bo go sam nie widziałem)... nie rozwiązywał i dopiero teraz się nauczyłem to reprodukować, zreprodukowałem, zacząłem testować i w końcu znalazłem rozwiązanie... banalne ;-)


Podobne postybeta
Wredne Google Docs
Toperz ;-) czyli OCR + Android odsłona 2 albo któraś tam
PROPFIND, czyli jak przechytrzyć HttpURLConnection
Google Play Services dobre jest :-)
To PKO BP....