J2ME problem z nagłówkiem http Content-Length
Próbując napisać prostą aplikację na komórki, która łączyłaby się z zewnętrznym serwerem natknąłem się na dość interesujący problem. Serwer za każdym zwracał błąd 411 - Content Length Required. Kod wydawał mi się poprawny, headery zgodne ze specyfikacją, dlatego postanowiłem zasięgnąć rady Pana Googla. Wyniki jego poszukiwań były dość marne. W sumie dowiedziałem się tylko tyle, że problem jest znany. Nie znalazłem jednak żadnej konkretnej informacji jak sobie z nim poradzić.
Używam narzędzia Wireless Toolkit, w którym odkryłem opcję "śledzenia" tego co robi nasza aplikacja. Szybko okazało się, że nagłówek Content-Length w ogóle nie jest wysyłany do serwera. Co dziwne, problem występował tylko podczas używania protokołu http/1.1. Kiedy emulator używał http/1.0 wszystko działało poprawnie. Głębsze poszukiwania w wynikach google nasunęły dwie możliwe przyczyny takiego zachowania. Pierwszą z nich mogła być metoda OutputStreamWriter.flush(). Podobno zastąpienie jej metodą close(); rozwiązywało problem. Jednak w moim przypadku tak się nie stało. Drugi trop wskazywał na błąd w nagłówku Content-Type. Jak się później okazało wystarczy ustawić wartość application/x-www-form-urlencoded zamiast multipart/form-data, aby aplikacja działała poprawnie zarówno przy użyciu http/1.0 jak i http/1.1
Mam nadzieję, że mój wpis zaoszczędzi kilku godzin szukania innym osobom zaczynającym swoją przygodę z J2ME (nie wiem, czy w innych edycjach Javy ten problem też występuje). Jeśli ktoś znający się na rzeczy ma pomysł dlaczego tak się dzieje, to bardzo bym prosił o komentarz.
1 komentarz
Jakieś pół roku temu pisałem aplikację pod J2ME korzystającą z protokołu http. Gdy zapytanie trafiało do ngix'a (odpowiednik Apache'a), ten zwracał błędy, bądź wcale nie odpowiadał. Na innym porcie wystawiłem bezpośrednie dojście do serwera www w Perlu (Catalyst) i wszystko działało wystarczająco dobrze, by się tym więcej nie zajmować.