다부분 업로드 중인 내용 길이 머리

3589 단어 restler

묘사

여보세요,
여러 부분을 업로드할 때, Restler는 메인 내용의 길이 헤더를 제거한 것 같습니다. (비록 하나의 파일에 내용의 길이 헤더를 설정하고 있지만.)
Nginx는 헤더가 부족하기 때문에 restler에서 여러 부분으로 업로드하는 것을 거부합니다.

토론 #1

당신은 이것을 재현하기 위해 몇 가지 테스트 용례를 제시할 수 있습니까?

토론 #2

다음은test/restler의 여러 부분 테스트 출력입니다.js:
POST / HTTP/1.1
accept: */*
user-agent: Restler for node.js
host: localhost:7015
content-type: multipart/form-data; boundary=48940923NODERESLTER3890457293
connection: keep-alive
transfer-encoding: chunked

--48940923NODERESLTER3890457293
Content-Disposition: form-data; name="a"

1
--48940923NODERESLTER3890457293
Content-Disposition: form-data; name="b"

thing
--48940923NODERESLTER3890457293--
Nginx는 컨텐츠 유형 옆에 있는 최상위 컨텐츠 길이 헤더를 찾고 있습니다.

토론 #셋

이걸 어떻게 복제해야 합니까?
당신은 우리에게 문제를 폭로하는 코드를 줄 수 있습니까?

토론 #4

문제를 재현하려면 Nginx를 설정하고 여러 양식을 업로드해야 합니다.이것은 restler의 버그라기보다는 Nginx와 호환되지 않습니다.
Nginx는 기사에 내용 길이의 제목이 있어야 합니다.내가 위에서 제시한 출력은 여러 부분post를 진행할 때restler가Content-Length 헤더를 보내지 않는다는 것을 나타낸다.내가 알기로는 그것을 설정할 방법이 없다. 이것은 restler가 모든 파일의 크기에 경계를 더해서 계산해야 하는 것이다.
일리가 있다
감사합니다,
Chris

토론 #5

사실, 많은 코드를 다시 써야 이nginx 빈틈을 닫을 수 있습니다...
아마도 content-length 트레일러가nginx의 수요를 충족시킬 수 있을까?

토론 #6

나도 일부 서비스에서 이 문제를 만났다

토론 #7

이 포크가 부분적으로 이 문제를 해결한 것 같다https://github.com/starkcoffee/restler/commit/a5ea0ff2d076ee1669cc5490774b0dd0d497937a

토론 #8

Nginx에 대해서도 마찬가지입니다.블록을 처리하는 데 도움을 줄 수 있는 nginx module이 있다는 것도 지적하고 싶습니다.

토론 #9

Indeed, there's a lot of code has to be rewritten to close this nginx hole...


이건 좀 불공평해.이것은restler의 버그입니다.nginx의 버그가 아닙니다.POST 요청의 경우 RFC2616에 따라 유효한 요청을 보내려면 컨텐츠 길이나 전송 코드를 사용해야 합니다."요청한 메시지 헤더에 내용 길이나 전송 인코딩 헤더 필드를 포함함으로써 요청에 메시지체가 있음을 나타냅니다."

토론 #10

이 버그가 restler 버그인지 아닌지 잘 모르겠어요.이 규범은 요청은 메시지체를 표시하기 위해 '내용 길이' 또는 '전송 인코딩' 을 포함해야 하며,restler는 전송 인코딩 헤더를 포함해야 한다는 것을 나타낸다.

토론 #11

Maybe content-length trailer could satisfy nginx?


나는 예고편이 블록 전송 인코딩을 암시한다고 생각한다. 실제로는 스스로 (블록 전송 인코딩) 하는 것만으로도 충분하다고 생각한다.

토론 #12

The spec says the request must contain a "Content-Length" OR "Transfer-Encoding" to identify a message body, and restler is including the transfer-encoding header.


Apache1.3의 libaprequest는 블록, fwiw를 지원하지 않습니다.또한restler는 어디에서 전송 인코딩을 설정합니까?아무데도 못 봤어요.

토론 #13

@abhrestler 원본을 통해 전송 인코딩을 설정하지 않았습니다.위의 @scriby comment 를 읽은 후에야 그렇다고 생각했을 뿐입니다. 전송 인코딩을 포함한restler 테스트에서 나온 것입니다.

토론 #14

@rhyolight는git 역사에서 과거처럼 보이지만 지금은 다르다.

토론 #15

@abh 이건 정말 이상해요.어떤 방식이든 전송 인코딩을 설정해도nginx는 블록 인코딩을 처리하지 않습니다.보아하니 이 두 제품 모두 이 빈틈이 있는 것 같다.

토론 #16

@rhyolight #78에서 만든 패치가 지금 우리를 위해 일하고 있습니다(서버에 Apache 1.3.x와libaprequest가 있습니다).

토론 #17

자, 여러분, 이 문제를 철저히 해결하려고 노력하고 있습니다.
현재 상당히 혼란스럽기 때문에 여러 부분의 모듈을 재구성하고 그api를 변경할 계획이다.

좋은 웹페이지 즐겨찾기