Do Not Think!!!

Posted
Filed under 01010101
RFC 2616에서 인용한 HTTP 정의의 일부분입니다.

The Hypertext Transfer Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information systems. It is a generic, stateless, protocol which can be used for many tasks beyond its use for hypertext, such as name servers and distributed object management systems, through extension of its request methods, error codes and headers. A feature of HTTP is the typing and negotiation of data representation, allowing systems to be built independently of the data being transferred.


우리가 보내는 데이터는 단지 01 2진수들의 흐름입니다. 좀 더 정확하게는 전기의 흐름이겠죠. 그리고 전기는 계속 흐로고 있습니다. 그렇다면 컴퓨터는 어디부터 어디까지를 데이터로 인식해야 할까요? 그래서 필요한게 프로토콜입니다.

프로토콜은 약속입니다.
내가 ~부터 ~까지 데이터를 보낼테니, 너는 ~부터 ~까지 받아라.
이런 약속은 웹브라우저와 웹서버사이의 약속입니다. 물론 우리가 사용하는 웹브라우저는 이런 약속을 잘 지키도록 만들어졌겠죠.

하지만, 잘 만들어진 웹브라우저만 사용하는 것이 아니라, 우리가 웹클라이언트, 또는 웹서버를 만들어야 할 경우가 있습니다.


저는 서버에 파일을 전송하는 웹클라이언트와 웹서버 프로그램를 만들었습니다. 물론 HTTP를 이용해서 파일을 전송하도록 만들었죠.

웹서버 프로그램은 Java Servlet으로 만들었고, 웹클라이언트 프로그램은 C#으로 만들었습니다

프로그램을 만들다 보니 다음과 같은 문제에 직면했습니다.
  • 웹브라우저에서 Java Servlet으로 만든 웹서버 프로그램 파일을 전송하면 잘 받아집니다.
  • C#으로 만든 웹클라이언트에서 PHP로 만든 웹서버 프로그램에 파일을 전송하면 잘 받아집니다.
  • C#으로 만든 웹클라이언트에서 Java Servlet으로 만든 웹서버 프로그램에 파일을 전송하면 받아지지 않습니다.

이런 문제때문에, HTTP에 관한 RFC문서를 보게 되었고, 다음과 같은 내용을 찾을 수 있었습니다.
  • RFC 1867에 정의된 multipart 포멧으로 data stream을 전송합니다.
  • multipart data stream은 다음과 같이 정의되어 있습니다.

data stream 포멧 보기



즉, HTTP Body는
  • heder-part와 body-data로 이루어지고
  • 각 HTTP Body는 delimiter로 구분됩니다.
  • 그리고 data stream의 마지막에는 close-delimiter로 끝나야 합니다.

기본에 충실했다면, 이런 문제는 바로 해결할 수 있었을 텐데, 그렇지 못했기 때문에 문제 해결에 많은 시간이 걸렸습니다.
모든 문제는 기본에 충실하지 않은 것에서부터 생깁니다.
항상 머리속에 새겨야 할 말입니다.


참고 URL 보기


apache httpclient 사용하면서, 인터넷에서 찾은 샘플을 보고, 어설프게 따라 했다가 삽질한 경험입니다.1. HttpClient 를 사용하기 위해, 인터넷에서 찾은 샘플을 어설프게 따라했습니다.2. 그런데, 서버에서 첨부파일의 mime type 을 확인해서 처리하는 부분이 있는데, 동작을 안하네요.3. 예전에 .net에서 http multipart data 를 보내면서 삽질한 기억이 떠올랐습니다.4. 혹시나 하는 마음에 소스를 뒤져봤습니...