2013-03-08 18 views
14

Jak radzić sobie z błędem serwera w środku wiadomości Http?Co zrobić z błędami podczas przesyłania strumieniowego treści żądania Http

Zakładając, że już wysłałem nagłówek wiadomości i przesyłam strumieniowo treść wiadomości , co mam zrobić, gdy napotkam nieoczekiwany błąd.

Przyjmuję również, że ten błąd został spowodowany podczas generowania treści, a nie błędu połączenia.

(Mocno) Zmniejsz Kod:

// I can define any transfer encoding or header fields i need to. 
send(header); // Sends the header to the Http client. 

// Using an iterable instead of stream for code simplicity's sake. 
Iterable<String> stream = getBodyStream(); 
Iterator<String> iterator = stream.iterator(); 

while (iterator.hasNext()) { 
    String string; 
    try { 
     string = iterator.next(); 
    catch (Throwable error) { // Oops! an error generating the content. 
     // What do i do here? (In regards to the Http protocol) 
    } 

    send(string); 
} 

Czy istnieje sposób, aby poinformować klienta, że ​​serwer nie powiodło się i powinny albo ponownie lub przerwaniu połączenia lub jestem sool?

Kod jest znacznie uproszczony, ale pytam tylko w odniesieniu do protokołu, a nie dokładnego kodu.

Thank You

Odpowiedz

-3

myślę serwer powinien zwrócić początek kodu odpowiedź z 5xx jak za RFC 2616.

Server Error 5xx

Kody statusu odpowiedzi rozpoczynające się od cyfry „5” wskazuje przypadki, w których serwer jest świadomy, że naruszył lub jest niezdolny do wykonywania żądania. Z wyjątkiem sytuacji, gdy odpowiada na żądanie HEAD, serwer POWINIEN zawierać obiekt zawierający wyjaśnienie sytuacji błędu i to, czy jest to stan tymczasowy czy stały. Aplikacje użytkownika POWINIEN wyświetlać użytkownikowi dołączoną całość. Te kody odpowiedzi mają zastosowanie do każdej metody żądania.

+1

Tak, ale chodziło o to, że już wysłałem nagłówek żądania. – user1964161

+0

o_O .. prawdopodobnie nie powinieneś mówić klientowi, że wszystko jest ok, zanim będziesz pewien, że wszystko jest ok. – zzk

+1

To prawda, jednak nie zawsze jest to możliwe.Na przykład: jeśli mam duży plik, który przesyłam i znalazłem plik na moim twardym dysku, wyślę nagłówek "200 OK", a następnie rozpocznij przesyłanie pliku z twardego dysku (bez całego pliku w pamięci głównej) może być błędem podczas odczytu pliku. – user1964161

9

jedna z następujących powinien zrobić:

  1. Zamknij połączenie (reset lub normalny zamknij)
  2. Napisz nieprawidłowy fragment (i zamknąć połączenie), która wywoła błąd klient
  3. Dodaj http trailer, informując klienta, że ​​coś poszło nie tak.
  4. Zmień protokół wyższego poziomu. Ostatni wysłany fragment danych to skrót lub długość, a klient wie, jak sobie z nim poradzić.
  5. Jeśli możesz wygenerować skrót lub długość (w niestandardowym nagłówku, jeśli korzystasz z porcji http) treści przed rozpoczęciem wysyłania, możesz wysłać go w nagłówku, aby klient wiedział, czego się spodziewać.

To zależy od tego, co klient ma zrobić z danymi (zachować lub wyrzucić). Możesz nie być w stanie wprowadzić zmian po stronie klienta, więc ostatnia opcja nie zadziała na przykład.

Oto kilka wyjaśnień na temat różnych sposobów zamykania. TCP option SO_LINGER (zero) - when it's required. Spójrz na odpowiedź z najwyższym niezmienionym wynikiem.

Powiązane problemy