Как обнаружить инициированную «отмену» на стороне клиента на стороне сервера во время doGet в HttpServlet? - PullRequest
1 голос
/ 20 декабря 2011

У меня есть простой HttpServlet, работающий на Tomcat, который обслуживает текстовый файл длиной 3,5 м.

Я получаю доступ к сервлету из iOS (используя ASIHTTPRequest), и после 2 я делаю «отмена»секунд (то есть задолго до того, как все данные поступят ...)

На клиентской стороне я определенно вижу, что транзакция действительно отменена.

Проблема в том, что я неУ нас нет никакого тривиального способа узнать об этом на стороне сервера, и, следовательно, похоже, что сервлет всегда отправляет полные 3.5M.

Я бы ожидал что-то вроде исключения, но это не такпроисходит ...

Код сервлета выглядит следующим образом:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException
{
  int read = 0;
  int total = 0;

  try
  {
    response.setContentType("text/html");
    ServletContext ctx = getServletContext();
    InputStream is = ctx.getResourceAsStream("/WarAndPeace.html");

    byte[] bytes = new byte[1024];
    OutputStream os = response.getOutputStream();

    while ((read = is.read(bytes)) != -1)
    {
      os.write(bytes, 0, read);
      total += read;
    }

    os.flush();
    os.close();
    is.close();
  }
  catch (Exception e)
  {
    // NEVER REACHED
  }

  /*
   * THIS PART IS ALWAYS REACHED WITH total = 3.5M BYTES
   * NO MATTER IF THE CONNECTION WAS CANCELED ON THE CLIENT-SIDE
   *
}

Есть какие-нибудь подсказки?Спасибо!

NB. Я также попытался с правильно отмененным NSURLConnection (вместо ASIHTTPRequest), но результаты схожи.

...