2017-01-30 3 views
2

새로운 Phoenix 앱에서는 기본적으로 Plug.Head 플러그가 제공되며 그 의미에 대해 흥미를 느꼈습니다.HEAD 요청을 GET 요청으로 변환하는 것이 유용한 이유는 무엇입니까?

"the HEAD method is identical to GET except that the server MUST NOT send a message body in the response"을 알고 있습니다.

나는 official Phoenix guides는 최고 수준의 생각하지만, 이것은 Routing guide에서 저를 던졌다 :

Plug.Head은 - GET 요청하기 HEAD 요청을 변환하는 경우 응답 본문

스트립 HEAD 요청은 신체가 없으면 왜 필요합니까? 내가 잘못된 형식의 요청을 보완하려고했지만 Plug.Head implementation을보고 싶다면 HEAD 메서드를 GET으로 전환하면됩니다.

def call(%Conn{method: "HEAD"} = conn, []), do: %{conn | method: "GET"} 
    def call(conn, []), do: conn 
end 

나는이 주제에 발견 할 수 있었다 가장 가까운 일은 question on ServerFault이지만은 Nginx에와 HEAD 요청이 각각 GET 응답 다시 HEAD에 도착하는 변환 될 필요가 손상되는 애플리케이션 로직에 관련이 있었다.

답변

1

AFAICT, Plug.Head은 요청이 GET으로 처리되도록합니다. 본문을 보내지 않는 HEAD을 구현하는 두 번째 부분은 플러그 연결 어댑터에 의해 수행됩니다. 대부분의 콜백 (예 : send_resp)의 설명서에는 "요청에 메서드 "HEAD"이 있으면 어댑터가 클라이언트에 응답을 보내지 않아야합니다."라고 명시되어 있습니다.

+0

연결 어댑터를 알려 주셔서 감사합니다! 인용 된 댓글이 부정확하거나 큰 그림과 아직까지는 거리가 멀지 만 "어댑터는 응답 ** 본문 **을 클라이언트에게 보내면 안됩니다"라는 단어 ** "body **"를 놓치기 때문에 중요합니다. 응답은 요청 메소드와 독립적으로 전송되며, 본문 만 HEAD에 대한 응답에서 생략됩니다. 그러나 다시 나는 어쩌면 어댑터가 어떻게 작동하는지 오해 할 수도있다. –

+0

의견이 맞습니다. 서버는 HEAD 요청 **에 ** 응답 **으로 본문을 보내면 안됩니다. HEAD ** 요청 ** 자체에 본문이 있는지 여부는 관계가 없습니다. –

1

피닉스 크게 레일에서 영감을하고 있기 때문에, 안전하게 Plug.Head을 내기 할 수는 Rack::Head.

HEAD 요청이 GET으로 만 헤더 같은 응답을 반환에 의해 영감을받은 것입니다. 올바른 헤더를 생성하기 위해 Phoenix 앱에서 GET 작업으로 라우팅됩니다.

그러나 올바른 (빈) 본문을 생성하려면 응답 본문을 제거해야합니다. Rack::Head은 미들웨어이기 때문에 컨트롤러에서 응답을 얻은 후 가져옵니다.

대조적으로 플러그 아키텍처는 파이프 라인처럼 작동하며 Plug.Head은 메서드를 수정하고 conn을 전달하지만 다시는 볼 수 없습니다.

cdegroot's answer이 표시되면 해당 책임은 Plug.Conn.Adapter (예 : 웹 서버)으로 전달됩니다.

+0

간단히 대답하면 ** HEAD -> GET 변환은 경로 일치를 쉽게 만드는 것입니다. ** 나는 'curl' HEAD 및 GET 요청으로 간단한 Phoenix 앱을 테스트했으며 응답이 정확하고 로그에 HEAD 요청이 표시됩니다 올바르게 ('Plug.Logger'가'Plug.Head'에 선행하기 때문에 이것은 놀라운 일이 아닙니다.)그래서 나는 초기 요청 방법이 어딘가에 있지만 다른 질문에 대한 자료가 될 것이라고 추측한다. –