Wczoraj i dziś straciliśmy kilka godzin na diagnozowanie bardzo dziwnego zachowania Opery — okazało się bowiem, że przeciąganie produktu do koszyka i odświeżenie tego ostatniego po Ajaksie istotnie zwiększało liczbę zamówionych sztuk, jednak sam koszyk nagle znikał w bliżej nieokreślonych okolicznościach. W Operze. Firefox i Internet Explorer nie pokazywały nic dziwnego. Sama konsola błędów Opery też milczała, co irytowało mnie jeszcze bardziej.
W końcu sprawdziłem wszystkie możliwości i okazało się, co następuje: Opera nie obsługuje przekierowań temporarily moved
i permanently moved
w przypadku treści wołanej przez XmlHttpRequest. Mam nadzieję, że zaoszczędzi to komuś kłopotu w przyszłości.


by quiris
04 lip 2006 at 17:10
A gdzie test case z demonstracją problemu? Wydaje mi się, że kto, jak kto, ale profesjonalista powinien mieć profesjonalne podejście do tematu. Ile ja się naużeram z różnymi „webmasterami”, którzy twierdzą, że w ich mniemaniu, coś tam Opera źle obsługuje. Jednocześnie, prośba o przedstawienie stosownego dowodu, w postaci demonstracji problemu, spotyka się z w odpowiedzi z ciszą. Powtórzę jeszcze raz. Możesz przedstawić stosowny dowód?
by quiris
04 lip 2006 at 17:13
Aha, a gdybyś nie wiedział jak przygotować dobrą demonstrację błędu to służę stosownym dokumentem: http://www.w3.org/Style/CSS/Test/guidelines.html
by medyk
04 lip 2006 at 17:42
A to ciekawa informacja.. choć nie sądzę bym kiedykolwiek miał potrzebę przekierowywania wywołań ajaxa.
by Patrys
04 lip 2006 at 19:39
quiris:
Nie trzeba mnie uczyć pisania test case, jestem programistą z zawodu i siedzę w OS ze względu na hobby. Poza tym nikt nie napisał, że coś jest zepsute i nie widzę powodu, żeby coś demonstrować. Opera zwyczajnie jako wynik XmlHttpRequest zwraca pierwszy dokument, który dostanie (czyli jako status podaje 302 i kończy zapytanie), podczas gdy Fx podąża za nagłówkiem przekierowania i zwraca dopiero tamten dokument (ze statusem 200). Opera 9, buga tu nie widzę, bo raczej rzadko używa się przekierowań w powiązaniu z Ajaksem (tu wynikało akurat ze specyfiki skryptu, który każdy POST automatycznie przekierowywał, żeby zapobiec zmianie danych przez „refresh”).
by quiris
04 lip 2006 at 20:04
Wiem kim jesteś i dlatego napisałem, to co napisałem. Władzia, który napisał pierwszą stronę w życiu, nie prosiłbym o zademonstrowanie zachowania. Od Ciebie, jako profesjonalisty, wymagam profesjonalnego podejścia do sprawy ;)
Wiem na czym polegają przekierowania. Jednak przy wszelkich zgłoszeniach o błędach (nieprawidłowych zachowaniach) krytycznie ważny jest poprawnie zbudowany test case. I dalej będę Cię prosił o przedstawienie takiego, ponieważ wypadałoby do końca wyjaśnić, czy to jest zachowanie prawidłowe, czy nie.
Wg roboczej specyfikacji http://www.w3.org/TR/XMLHttpRequest/#xmlhttprequest UA MUSI jednak podążać za przekierowaniem:
„If the response is an HTTP redirect (status code 301, 302, 303 or 307), then it MUST be transparently followed (unless it violates security, infinite loop precautions or the scheme isn’t supported). Note that HTTP [RFC2616] places requirements on UAs regarding the preservation of the request method during redirects, and also requires users to be notified of certain kinds of automatic redirections.”
Choć z pewnymi wyjatkami. Pytanie: Czy taki wyjątek zachodził w Twoim przypadku, czy nie? Ad vocem: Opera ma niezwykle drakońskie zabezpieczenia przeciw XSS, więc może istnieć podejrzenie takiego działania, dlatego, znowu, potrzebna jest strona demonstrująca zachowanie ;)
I nawet, jeśli stwierdzimy, że standardu jako takiego jeszcze nie ma, to Opera w imię zachowania interoperacyjności z innymi przeglądarkami, powinna podążać ze przekierowaniami i to należy zgłosić jako niedoróbkę, a do tego potrzebny jest… już wiesz… test case ;)
by Patrys
04 lip 2006 at 20:13
Ok, nie jestem w tej chwili w stanie (nie jestem w domu) zbudować proof-of-concept, a kod serwisu już nie używa przekierowań, ale mogę powiedzieć, jak to działało:
- /plik1 zawiera DIV, do którego jest wołany Ajax.Updater ze script.aculo.us, jako URI podana jest ścieżka absolutna /plik2 i typ zapytania POST
– /plik2 obsługuje post i zwraca status 302 z nagłówkiem Location: /plik3 (ścieżka absolutna, bez podania hosta, więc nie zachodzi niebezpieczeństwo XSS)
– /plik3 dowolny, niepusty
Oczekiwane zachowanie: DIV zostaje wypełniony zawartością /plik3
Faktyczne zachowanie: DIV zostaje wyczyszczony, bo /plik2 zwraca puste ciało dokumentu (zgodnie z zasadą budowania przekierowania).
by diz
04 lip 2006 at 21:17
Można to było rozwiązać przez dodanie obsługi statusu 302.
Czyli sprawdzić nagłówek „Location” przez getResponseHeader i puścić drugie zapytanie.
Widziałem jakąś dyskusję na ten temat na forum Opery, ale nie pamiętam czy zostało to uznane jako bug czy też nie.
by quiris
04 lip 2006 at 22:12
Hmm… To wszystko wygląda mi na błąd w Operze.
http://my.opera.com/community/forums/topic.dml?id=133680
http://my.opera.com/community/forums/topic.dml?id=140253
BTW. Znalazłem ciekawy zestaw testów pokazujący różnice w implementacjach XMLHttpRequest: http://www.mnot.net/javascript/xmlhttprequest/
by Tomash
05 lip 2006 at 14:55
Tak z tej okazji — mistrzostwo świata:
http://www.yatblog.com/wp-content/uploads/2006/06/pm20060621.png
by BartekB
05 lip 2006 at 20:14
Tak a propos, to oczywiście wiecie, że wg RFC2616 po Location: ma być absoluteURI, czyli np. Location: http://www.w3.org/pub/WWW/People.html
Tak, wiem, że większość chyba implementacji obsługuje też formę typu /pub/WWW/People.html , bez protokołu i serwera, kierując request do serwera, który zwrócił dane Location:…