2015-02-12 2 views
0

У меня возникли проблемы с отправкой запроса HTTP POST с параметром, который имеет значение, которое содержит пробел. JMeter заменяет все «» и «% 20» на «+».Отправка экранированных пробелов в HTTP POST с помощью JMeter

Кажется, что это связано с реализацией HTTP, поскольку это происходит только при использовании HttpClient3.1 и HttpClient4. Реализация Java отправляет пробелы, закодированные и декодированные. По крайней мере, согласно слушателю дерева результатов.

Мне нужно иметь возможность использовать HttpClient4, однако, поскольку он кажется единственным, что я могу получить разрешение NTLM для работы. Приветствуются любые указатели на то, где искать решение.

Обновление: найден способ отправки пробелов при помощи Ричарда Фридмана. Я закончил редактирование исходного кода HTTPHC4Impl.java, который отвечал за вызов кодировки.

while (args.hasNext()) { 
    HTTPArgument arg = (HTTPArgument) args.next().getObjectValue(); 
    // The HTTPClient always urlencodes both name and value, 
    // so if the argument is already encoded, we have to decode 
    // it before adding it to the post request 
    String parameterName = arg.getName(); 
    if (arg.isSkippable(parameterName)){ 
     continue; 
    } 
    String parameterValue = arg.getValue(); 
    if(!arg.isAlwaysEncoded()) { 
     // The value is already encoded by the user 
     // Must decode the value now, so that when the 
     // httpclient encodes it, we end up with the same value 
     // as the user had entered. 
     parameterName = parameterName.replaceAll("\\+", "__tempplus__"); 
     parameterValue = parameterValue.replaceAll("\\+", "__tempplus__"); 
     parameterName = URLDecoder.decode(parameterName, urlContentEncoding); 
     parameterValue = URLDecoder.decode(parameterValue, urlContentEncoding); 
    } 
    // Add the parameter, httpclient will urlencode it 
    nvps.add(new BasicNameValuePair(parameterName, parameterValue)); 
} 
//UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nvps, urlContentEncoding); 
StringBuilder asdf = new StringBuilder(); 
for (NameValuePair pair : nvps) { 
    String name = URLEncoder.encode(pair.getName(), urlContentEncoding); 
    name = name.replaceAll("\\+", "%20"); 
    name = name.replaceAll("__tempplus__", "%2B"); 
    String value = URLEncoder.encode(pair.getValue(), urlContentEncoding); 
    value = value.replaceAll("\\+", "%20"); 
    value = value.replaceAll("__tempplus__", "%2B"); 
    asdf.append(name); 
    asdf.append("="); 
    asdf.append(value); 
    asdf.append("&"); 
} 
asdf.deleteCharAt(asdf.length()-1); 
StringEntity entity = new StringEntity(asdf.toString(), urlContentEncoding); 
post.setEntity(entity); 

Хотя это было быстро и грязно, оно выполнило задачу. В основном знаки «плюс» заменяются на временное значение перед декодированием, чтобы не ошибиться в пробелах. Затем после кодирования плюс знаки преобразуются в% 20, а временные плюсовые знаки кодируются в% 2B.

+0

У вас есть опция «Использовать данные о multipart/form-data для POST»? Кажется, что он работает последовательно в реализациях HTTP. –

ответ

0

Я вижу такое же поведение в своем тестовом тесте. Если вы хотите управлять, если они закодированы и все еще используют HTTPClient, вы должны проверить - «Использовать multipart/form-data для POST».

С реализацией Java во время POST вы можете управлять, если параметры закодированы. Тем не менее, HTTPClient всегда будет кодировать параметры POST, которые не являются многочастными.

Об этом говорится в исходном коде для HTTPHC4Impl.java, который является сэмплером HTTP-запроса HTTPClient4.

while (args.hasNext()) { 
    HTTPArgument arg = (HTTPArgument) args.next().getObjectValue(); 
    // The HTTPClient always urlencodes both name and value, 
    // so if the argument is already encoded, we have to decode 
    // it before adding it to the post request 
    String parameterName = arg.getName(); 
    if (arg.isSkippable(parameterName)){ 
     continue; 
    } 
    String parameterValue = arg.getValue(); 
    if(!arg.isAlwaysEncoded()) { 
     // The value is already encoded by the user 
     // Must decode the value now, so that when the 
     // httpclient encodes it, we end up with the same value 
     // as the user had entered. 
     parameterName = URLDecoder.decode(parameterName, urlContentEncoding); 
     parameterValue = URLDecoder.decode(parameterValue, urlContentEncoding); 
    } 
    // Add the parameter, httpclient will urlencode it 
    nvps.add(new BasicNameValuePair(parameterName, parameterValue)); 
} 

Вы можете захватить JMX File из этого теста нагрузки.

Если вы передадите данные через данные тела, вы можете управлять содержимым и не кодировать данные.

Вот обновленный JMX File and Test Results с

  • один HTTP запрос с параметрами, показывая вопрос
  • И второй запрос с использованием данных Body

Вы можете просмотреть дерево Результаты, чтобы увидеть он передает данные без кодирования. enter image description here

+1

К сожалению, использование множителя не является вариантом в моем случае, так как оно не обрабатывается одинаково. Я пробовал работать с кодировкой с двойным кодированием. В исходных комментариях сказано, что уже закодированные значения будут декодированы. Поэтому, естественно, я пробовал кодировать пробелы как «% 2520», где «% 25» будет декодироваться как «%», и я бы оставил «% 20». Он не работает, так как «% 25» не декодируется. Я пробовал множество трюков кодирования, но они были тупиками. Есть ли другой способ, которым я могу обмануть JMeter, чтобы не отправлять символы «+»? – sentros

+0

@sentros Я обновил ответ со второй частью, показывая, как делать то, что вы хотите, но используя данные тела. Вот ссылка на мой [JMX-файл] (https://www.redline13.com/share/testplan/11665). Пожалуйста, подтвердите это, чтобы мы могли отметить ответ. –

+0

Спасибо за вашу дальнейшую помощь! Я предпочитаю использовать вкладку параметров вместо данных тела. Это помогает с ясностью и имеет немного большую гибкость. Я нашел решение, которое помогло и опубликует это в ближайшее время. – sentros