http post 로 파일 분할 전송시 서블릿 호출에 관하여

osanha의 이미지

제우스 서버의 특정 서블릿 URL로 HTTP POST 방식으로 (HTTP 1.1) 파일을 보낼때 파일 내용은 몇번에 걸쳐서 나뉘어 전송됩니다.
즉, 헤더는 한번 전송되는것이구요. 전체 파일의 내용이 몇번에 걸쳐 보내지는것입니다.
대략 다음과 같겠네요.

- 첫번째 패킷
- http header
- 필수 헤더 정보들...
- Content-Type: application/octet-stream
- Context-Length: 전체 파일 크기
- http body
- 파일 내용의 1/3 부분

- 두번째 패킷
- 파일 내용의 2/3 부분

- 세번째 패킷
- 파일 내용의 3/3 부분

즉, 보내져야할 전체 패킷이 3번 정도에 걸쳐서 보내지는 것이지요.
헌데, 서블릿 컨테이너에서 Content-Length 만큼의 데이터가 다 들어온 후에 서블릿을 호출해주지 않나요?
그래야, 서블릿에서는 완결된 데이터를 가지고 뭔가 할 수 있겠죠..
그런데 제우스에서 첫번째 패킷이 들어오자 마자 서블릿을 호출해주네요. 그래서 서블릿에서 뭔가 하는데 아직 데이터가 다 들어온게 아니라서 정상 처리가 안되고 있구요..
뭔가 HTTP 규약에 관련된 것인가 싶어 표준도 보고 하지만 아직 원인을 못 찾고 있습니다.
이에 관련된 조언 부탁드립니다~

endofhope의 이미지

http body 의 내용을 servlet 에서 어떻게 읽는지 궁금합니다.
일반적으로 post 요청의 body 는 사용되지 않을 수도 있기 때문에 request-line 과 header 를 사용해서 servlet 을 호출하고
servlet이 요구할 때 즉 HttpServletRequest.getParameter 나 HttpServletRequest.getInputStream 이 호출되면 그때 읽어들여 제공합니다.

--
말할 수 있는 것은 분명하게 말해질 수 있다;
말해질 수 없는 것에 대해서는 침묵해야한다.
논리철학논고 - 루드비히 비트겐슈타인

--
말할 수 있는 것은 분명하게 말해질 수 있다;
말해질 수 없는 것에 대해서는 침묵해야한다.
논리철학논고 - 루드비히 비트겐슈타인

osanha의 이미지

content-type 이 application/octet-stream 이기 때문에 getInputStream 을 호출합니다.
테스트를 좀 해보니..
key, value 쌍으로 데이터를 구성하고, content-type을 application/x-www-form-urlencoded 로 하여 전송해보니,
역시 첫번째 패킷에서 서블릿 자체는 바로 호출되더군요. 대신 getParameter 를 호출하는 시점에서 블럭되어 있더군요.
그리고 나머지 패킷들이 다 전송되어 content-length 만큼 데이터가 모두 들어온 순간 getParameter 에서 리턴되어 정상적으로 진행이 되네요.
헌데, getInputStream 에서는 그냥 현재 들어온 데이터만큼 바로 읽어버리네요.
그럼 역시 방법은 서블릿에서 content-length를 체크해서 InputStream 에서 read 한 크기가 더 작으면 루프돌면서 읽는일을 반복할 수 밖에 없는건가요?
아니면..뭔가 content-type 을 다른것을 사용하면 (이를테면 multipart/form-data 같은?)
데이터가 content-length 만큼 다 들어온 이후에 InputStream 핸들링 할 수 있는 방법이 있을련지요?

osanha의 이미지

좀 찾아보니..
content-type 을 multipart/form-data 로 하고, URL 에 ?value=multipart 와 같이 추가한후,
getParameter("value") 로 하면 content-length 만큼 body 를 읽어서 넘겨주는것 같네요. 테스트 해봐야 겠군요.

lovian의 이미지

InputStream, Reader는 wrapped된 객체이므로 모든 데이터를 읽지 않아도 접근이 가능하니 다 읽었다 여부에 대한 판단은 구현해야할 것 같네요.
제생각에는 말씀하신 방법이 그렇게 나쁘게 보이지는 않습니다. (read로 loop)

그리고 뭔가 꽁수인 듯한 느낌이 없지는 않지만, getParameter에서 블록되는 것을 이용하는 것도 괜찮아 보이네요 ㅎ
-----------------
한글을 사랑합니다.

-----------------
한글을 사랑합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.