D2CampusFest / 3rd

27 stars 4 forks source link

[Trevi] Http 응답처리 (response)관련 #12

Open Yoseob opened 8 years ago

Yoseob commented 8 years ago

Response 해더를 만드는 과정이 조금 어렵습니다. 기본적은 text, json, html은 setter를 이용하여 해더의 Content_Type을 채우거나 임의로 빌더를 통해서 만들고 있습니다. 하지만 mime 타입을 다 적용한다고 하면 어떤식으로 하면 좋을지 고민입니다. 최대한 사용자가 타입을 넣어주는 상황을 피하고 싶어서요.. 질문전달이 잘 될지.. 의심이되네요..

https://github.com/Yoseob/Trevi/blob/master/Trevi/Http/Response/Response.swift#L38-L59 https://github.com/Yoseob/Trevi/blob/master/Trevi/Http/Response/Response.swift#L154

kbu1564 commented 8 years ago

아래는 하나의 예시를 들어본 헤더 구조입니다.

POST /post HTTP/1.1 Accept: / Accept-Encoding: gzip, deflate Content-Type: multipart/form-data; boundary=38516d25820c4a9aad05f1e42cb442f4 Host: localhost

--38516d25820c4a9aad05f1e42cb442f4 Content-Disposition: form-data; name="file"; filename="page.pdf" Content-Type: application/pdf Content-Encoding: base64

H4sICI0fXVQAA3BhZ2UucGRmAAvOz01VCE7MLchJVQhITE8FAAyOwbUQAAAA --38516d25820c4a9aad05f1e42cb442f4--

보통 파일 전송시의 HTTP 헤더구조는 위와 같이 업로드 할 파일의 이름과 해당 파일의 Content-Type, 그리고 내용까지 함께 전송되게 됩니다.

이 요청을 이제 웹 서버가 처리해주는 방식인데 . 저기서 전송되어지는 Request Header 정보를 이용하여 그때 그때 등록되지 않은 확장자에 대한 Content-Type을 따 와서 저장이나 기타 처리해 주면 어떨까 싶습니다.

Yoseob commented 8 years ago

우선 코멘트 감사합니다. 질문에 말했지만 Response 해더를 만드는 과정에서 사용자가 보낼 데이터의 Content-Type을 정하는데
Request Header 정보를 이용하는건 기본 Http 해더를 외에 사용할 수 있는게 Accept 필드 밖에 없을꺼 같고 제한적일 것 같습니다. 제가 질문한 내용은 사용자 영역에서 Response body에 mime type에 해당하는 파일을 넣을때 사용자가 타입을 지정하지 않고 어떻게 Content-Type를 채울수 있을까 입니다. 답은 사용자 영역에서 header[content-type] = "mime type"과 같이 사용할 수 밖에 없는건지요 . 이번 질문도 질문 내용 전달이 잘 될지.. 의심이되네요.. 감사합니다.

kbu1564 commented 8 years ago

@Yoseob 제가 질문 의도 파악을 잘 못한것 같습니다.ㅠㅠㅠ 내용작성하다가 모르고 닫기 눌러서 작성중이던 글이 날아갔네요.

우선 각 파일 Content-Type별로 파일 고유의 Signature 란 것이 존재합니다. 보통은 이 값이 파일의 가장 처음에 기록되게 되며, 이에 대한 대표적인 예로는

윈도우의 실행파일의 경우 PE 라는 File format 방식을 채택하고 있는데 이 파일은 반드시 파일의 맨 처음 2바이트가 ASCII 값으로 "MZ" 여야만 한다는 규칙이 존재합니다.

또한 웹에서 자주사용하는 JPEG 이미지의 경우 Start of Image Marker 라는 이미지 시작을 알리는 정보를 기준으로 6번째 위치한 값을 기준으로 5바이트의 값이 아래와 반드시 같아야만 한다는 규칙이 존재합니다.

Identifier : 4a46494600 Identifier : Always equals "JFIF" (with zero following) (0x4A46494600)

이러한 방식으로 응답으로 보내고자 하는 파일의 Content-Type 을 자동으로 셋팅하기 위해서는 File format에 대한 분석이 대략적으로 이루어져 고유 identifier 값을 얻는 방식으로 판별해야 할것 같습니다.

Yoseob commented 8 years ago

@kbu1564 답변 감사합니다.! https://github.com/Yoseob/Trevi/blob/master/Trevi/Http/HttpProtocol.swift#L123 Signature를 위와 같이 사용 하기위해 만든 상태입니다.!

Start of Image Marker 이러한것 팁과 일단 File formatter를 우선적으로 고려해야봐야 겠네요! 좋은 내용 감사합니다.