2012-03-12 14 views
9

Piszę API aplikacji webowej, gdzie gdy ktoś uzyskuje dostęp do adresu URL, zwraca dane tekstowe. Ustawiam typ zawartości na "text/plain", ale kiedy uzyskuję do niego dostęp za pomocą Chrome, zamiast wyświetlać plik, który zawiera informacje, pobierany jest plik. Kiedy uzyskuję do niego dostęp za pomocą IE, pokazuje się prawidłowo, a kiedy uzyskuję dostęp za pomocą przeglądarki Firefox, mówi, że próbuje uzyskać dostęp do aplikacji/strumienia oktetowego i pyta mnie, czy chcę pobrać plik.Treść typu text-plain powoduje, że przeglądarka pobiera plik

nagrałem co był zwrócony przez serwer WWW przy użyciu TinyHTTPProxy, i to w sposób następujący:

[2012-03-11 16:51:45.345] INFO  {TinyHTTPProxy Thread-4} HTTP/1.1 200 OK 
Content-Type: text/plain 
Transfer-Encoding: chunked 
Connection: close 
Date: Mon, 05 Mar 2012 09:49:54 GMT 
Server: localhost 


[2012-03-11 16:51:45.345] INFO  {TinyHTTPProxy Thread-4} 10b 
P,FIO,7,31.5900,0.,,0,100,0,0,30.7600,31.9600,100,1000,,,0.,16:03:14t,,0,31.5900 ,1.2,,,15,n,,,,,03/09/2012,,31.2200,,,,-0.37,-0.37,0.274456994,,,,,0,,2846732.85 ,14,4,,3989502,BSE-CSE-NYSE-PSE-NMS,,,,,0,,,0,1155872,N,,26,26,26,16:03:14,5-7-10-11-12-13-18-25-26-28-80,0 

Jeśli zmienić typ zawartości do „application-json”, a następnie wyświetla na wszystkich przeglądarkach. Ponadto, jeśli zmienię typ zawartości na "text/html", to również działa, nawet jeśli nie zwróciłem pliku HTML.

Czy istnieje wyjaśnienie, dlaczego tekst/zwykły zachowuje się w ten sposób? Sprawdziłem, aby upewnić się, że wszystkie zwracane dane są w rzeczywistości ASCII, a ponieważ ustawiam typ zawartości na text/plain, jestem zdezorientowany, dlaczego jest interpretowany jako strumień aplikacji/oktetu.

Odpowiedz

7

Wygląda na to, że możesz być uruchomiony pod numerem Chrome Issue 106150. Wygląda na to, że Chrome (czasami) decyduje się na użycie logiki "wąchania", gdy typem treści jest tekst/zwykły.

Możliwe obejścia:

  • Jeśli tekst jest Unicode, w tym LM. To wskaże logikę podsłuchu, że naprawdę jest tekstem.
  • Usuń "binarnie wyglądające" bajty z pliku. Z raportu o błędzie "Każda wartość między 0x00 i 0x1f wygląda binarnie z wyjątkiem dla ESC, CR, NP, NL, HT".
  • Wygląda na to, że użycie rozszerzenia, które oczywiście ma być tekstem/zwykłym (jak .txt) może wyłączyć podsłuchiwanie.
+0

Interesujące, dzięki za informacje, nie zdawałem sobie sprawy, że przeglądarki będą węszyć dane, aby spróbować zrobić coś bardziej inteligentnego. – steve8918

+0

Dzięki za to. Wyciągałam włosy, próbując dowiedzieć się, dlaczego Chrome nalegał na pobieranie pliku tekstowego/zwykłego UTF-8, i okazało się, że były w nim dwa wystąpienia 0x02. – dgw

+0

Chrome odszuka tylko pierwsze x bajtów (prawdopodobnie 1KB) dla bajtów wyglądających binarnie, co może spowodować, że będzie to nieprzewidywalne - czasami miałem binarnie wyglądające bajty w pierwszym 1KB i czasami nie robiłem podczas wykonywania śledczych wywołań print_r. Zobacz odpowiedź @ trinth dla obecnego rozwiązania dnia. – thomasrutter

6

Wyjaśnienie Laurence'a jest poprawne. Tylko IE i Chrome wykonują mimowanie w czasie tego posta. Możesz teraz ustawić nagłówek HTTP X-Content-Type-Options: nosniff, a to wystarczy!

Powiązane problemy