문제

JMeter를 사용하여 Rails 응용 프로그램을로드 테스트하려고합니다. 응용 프로그램의 중요한 부분에는 텍스트 입력과 파일 업로드가 모두 포함 된 양식이 포함됩니다. 브라우저에서는 잘 작동하지만 JMeter에 해당 페이지를 게시하려고 할 때 Rails는 Multipart Form의 모든 부분을 온도 파일로 저장하여 문자열을 찾을 때 물건이 깨지고 대신 템 파일을 얻습니다.

차이점은 브라우저에서 텍스트 입력을 포함하는 멀티 파트 요청의 조각이 다음과 같습니다.

-----------------------------7d93b4186074c
Content-Disposition: form-data; name="field_name"

test
-----------------------------7d93b4186074c

jmeter에서 나오면 다음과 같이 보입니다.

-----------------------------7d159c1302d0y0
Content-Disposition: form-data; name="field_name"
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

test
-----------------------------7d159c1302d0y0

따라서 Rails는 전자를보고 그것을 일반 텍스트 값으로 해석하고 문자열로 취급하지만 후자를보고 온도 파일로 저장합니다.

JMeter가 비 파일 필드에 대한 멀티 파트 형식으로 추가 헤더를 보내지 않도록 설득 할 설정을 찾을 수 없었습니다.

레일이 해당 헤더를 무시하고 텍스트/일반 텍스트를 텍스트 파일 대신 문자열로 취급하도록 설득하는 방법이 있습니까? 아니면 추가 헤더를 제거 할 컨트롤러 앞에 필터를 넣는 빠른 방법?

또는 파일 업로드가 포함 된 Rails 응용 프로그램을로드하는 더 나은 도구가 있습니까?

도움이 되었습니까?

해결책 3

더 나은 방법이있을 수 있지만, 텍스트/일반 온도를 매개 변수 해시의 문자열로 바꾸는 빠른 필터를 추가했습니다.

  def change_text_files_to_strings
    params.each_pair do |key, value|
      params[key] = value.read if (value.class.to_s=='Tempfile' && value.content_type.start_with?('text/plain') )
    end
  end

그건 그렇고, JMeter가 여기에 올바른 것으로 밝혀졌고 레일이 잘못된 것으로 밝혀졌습니다. RFC 2388에 따르면, 멀티 파트 요청의 각 항목에는 콘텐츠 유형이 있어야하므로 Rails는 실제로 사용하지 않아야합니다. 컨텐츠 유형 헤더는 파일인지 여부를 결정합니다. 아, 음.

다른 팁

요즘에는 JMeter에서 "브라우저 호환 헤더 사용"을 선택할 수 있습니다. 그곳에서 많은 시간을 저축 할 수 있었을 것입니다 :-)

따라서 Rails가 이해하는 요청을 발표하기 위해 소스 코드에 PART를 게시 한 JMeter의 Multipart 요청 게시 부분을 사용자 정의했습니다. 아래에 표시된 것처럼 변경은 쉽지만 컴파일 Java/JMeter 환경을 만들려면 시간이 걸렸습니다. :(

어쨌든 이제는 JMeter를 통해 Multipart Post에 의해 파일을 성공적으로 업로드 할 수 있습니다.


SRC/프로토콜/http/org/apache/jmeter/protocol/http/sampler/postwriter.java에서

writeStartFileMultipart()
//writeln(out, "Content-Transfer-Encoding: binary"); // $NON-NLS-1$

writeFormMultipart()
/*****
writeln(out, "Content-Type: text/plain; charset=" + charSet); // $NON-NLS-1$
writeln(out, "Content-Transfer-Encoding: 8bit"); // $NON-NLS-1$
*****/

추신

2.4의 빌드 환경을 만드는 팁은

  1. 제 3 자 라이브러리를 댓글을 달려면 build.xml 파일에서 확인하십시오.

  2. 이진 아카이브에서 Lib/ Directory 로의 Lib/ Xstream-1.3.1.jar 복사

ColdFusion이 각 양식 데이터와 유사한 헤더 (컨텐츠 전송 인코딩 제외)를 보내면서 위의 솔루션을 사용했습니다. 더 나은 방법이 있는지 궁금합니다.

편집 : 레일 3에서 이것이 고정되어 있는지 아는 사람이 있습니까?

어떤 종류의 오류가 발생합니까? 같은 것

NoMethodError (undefined method `rewind' for "1":String):

랙에는 문제를 설명 할 수있는 문제가 있습니다. 보다 https://github.com/rack/rack/issuesearch?state=open&q=weind#issue/116

우리는 또한 비슷한 문제를 겪고 있었고, 위의 답변 외에도 우리는 또한 X-CSRF-Token 해당 요청에서 HTTP 헤더 관리자의 관리자이며 필요한 미디어를 우리가 원하는만큼 업로드 할 수있었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top