Как не читать весь запрос
От: javava  
Дата: 22.05.08 07:03
Оценка:
В сервлет приходит длинный multipart запрос с файлами. На запрос нужно ответить сразу (не проходит валидация). Как это сделать? Даже если делать request.getInputStream().close(), сервер все равно вычитывает весь запрос, и только потом отвечает.
Re: Как не читать весь запрос
От: Blazkowicz Россия  
Дата: 22.05.08 09:48
Оценка:
Здравствуйте, javava, Вы писали:

J>В сервлет приходит длинный multipart запрос с файлами. На запрос нужно ответить сразу (не проходит валидация). Как это сделать? Даже если делать request.getInputStream().close(), сервер все равно вычитывает весь запрос, и только потом отвечает.

Ковыряние в исходниках никак не помогло?
Re[2]: Как не читать весь запрос
От: javava  
Дата: 22.05.08 12:40
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Ковыряние в исходниках никак не помогло?


Помогло. Для томката нашел способ закрыть поток. Хотелось бы найти универсальный способ.
Re[3]: Как не читать весь запрос
От: Blazkowicz Россия  
Дата: 22.05.08 12:47
Оценка:
Здравствуйте, javava, Вы писали:

B>>Ковыряние в исходниках никак не помогло?

J>Помогло. Для томката нашел способ закрыть поток.
Не поделишься?

J>Хотелось бы найти универсальный способ.

Уверен что универсального нет. При желании конечно можно прошерстить спеку по сервлетам. Но я более чем уверен что это там не оговаривается.

С другой стороны почти все opensource сервера используют Tomcat. А если придется мигрировать на комерческий сервер, то за те деньги что в него будут вбуханы тех саппорт наверняка сможет подсобить с решением.
Re[4]: Как не читать весь запрос
От: javava  
Дата: 22.05.08 12:58
Оценка: 7 (1)
try {
Object req = getFieldValue(request, new String[]{"request"});
Object inputStream = getFieldValue(req, new String[]{"inputStream"});
Object ib = getFieldValue(inputStream, new String[]{"ib"});
Object coyoteRequest = getFieldValue(ib, new String[]{"coyoteRequest"});
Object inputBuffer = getFieldValue(coyoteRequest, new String[]{"inputBuffer"});
Object inputStream1 = getFieldValue(inputBuffer, new String[]{"inputStream"});
FileInputStream str = (FileInputStream)inputStream1;
str.close();
//inputStream1.getClass().getMethod("close").invoke(inputStream1);
} catch (IllegalAccessException e) {
e.printStackTrace();
}


getFieldValue() возвращает значение поля объекта
Re[5]: Как не читать весь запрос
От: javava  
Дата: 28.05.08 06:13
Оценка:
Описанный в предыдущем посте способ не всегда работает корректно. Например в нашем случае при использовании commons-fileupload (streamingAPI) при обработке запроса, вычитывании некоторого количества байт из потока, и закрытии потока описанным способом, tomcat пытался обработать запрос еще раз. Метод service вызывается еще раз для того же запроса, с уже закрытым входным потоком.

Описанную в заголовке проблему в нашем случае удалось решить закрытием потоков с клиента. Ajax-ом слушается состояние закачки (сохраняемое в сессии) и при необходимости изменяется document.location.href, при этом браузер прекращает отправку запроса.
Re[6]: Как не читать весь запрос
От: Blazkowicz Россия  
Дата: 28.05.08 08:43
Оценка:
Здравствуйте, javava, Вы писали:

J>Описанный в предыдущем посте способ не всегда работает корректно.

Ну, при подобных хаках другого ожидать не приходится.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.