fix(接口测试): 重写HTTPSamplerProxy支持对 path 多'/'和少'/'的处理
修复依据来源QA群讨论结果
This commit is contained in:
parent
23656ad794
commit
0b157a3f54
|
@ -0,0 +1,149 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to you under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.jmeter.protocol.http.sampler;
|
||||||
|
|
||||||
|
import io.metersphere.commons.utils.LogUtil;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.jmeter.engine.event.LoopIterationEvent;
|
||||||
|
import org.apache.jmeter.samplers.Interruptible;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Proxy class that dispatches to the appropriate HTTP sampler.
|
||||||
|
* <p>
|
||||||
|
* This class is stored in the test plan, and holds all the configuration settings.
|
||||||
|
* The actual implementation is created at run-time, and is passed a reference to this class
|
||||||
|
* so it can get access to all the settings stored by HTTPSamplerProxy.
|
||||||
|
*/
|
||||||
|
public final class HTTPSamplerProxy extends HTTPSamplerBase implements Interruptible {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private transient HTTPAbstractImpl impl;
|
||||||
|
|
||||||
|
public HTTPSamplerProxy() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience method used to initialise the implementation.
|
||||||
|
*
|
||||||
|
* @param impl the implementation to use.
|
||||||
|
*/
|
||||||
|
public HTTPSamplerProxy(String impl) {
|
||||||
|
super();
|
||||||
|
setImplementation(impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String toExternalForm(URL u) {
|
||||||
|
int len = u.getProtocol().length() + 1;
|
||||||
|
if (u.getAuthority() != null && u.getAuthority().length() > 0)
|
||||||
|
len += 2 + u.getAuthority().length();
|
||||||
|
if (u.getPath() != null) {
|
||||||
|
len += u.getPath().length();
|
||||||
|
}
|
||||||
|
if (u.getQuery() != null) {
|
||||||
|
len += 1 + u.getQuery().length();
|
||||||
|
}
|
||||||
|
if (u.getRef() != null)
|
||||||
|
len += 1 + u.getRef().length();
|
||||||
|
|
||||||
|
StringBuffer result = new StringBuffer(len);
|
||||||
|
result.append(u.getProtocol());
|
||||||
|
result.append(":");
|
||||||
|
if (u.getAuthority() != null && u.getAuthority().length() > 0) {
|
||||||
|
result.append("//");
|
||||||
|
result.append(u.getAuthority());
|
||||||
|
}
|
||||||
|
if (StringUtils.isNotEmpty(u.getPath())) {
|
||||||
|
int index = 0;
|
||||||
|
for (int i = 0; i < u.getPath().length(); i++) {
|
||||||
|
char ch = u.getPath().charAt(i);
|
||||||
|
if (String.valueOf(ch).equals("/")) {
|
||||||
|
index++;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.append("/" + u.getPath().substring(index));
|
||||||
|
}
|
||||||
|
if (u.getQuery() != null) {
|
||||||
|
result.append('?');
|
||||||
|
result.append(u.getQuery());
|
||||||
|
}
|
||||||
|
if (u.getRef() != null) {
|
||||||
|
result.append("#");
|
||||||
|
result.append(u.getRef());
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected HTTPSampleResult sample(URL u, String method, boolean areFollowingRedirect, int depth) {
|
||||||
|
// When Retrieve Embedded resources + Concurrent Pool is used
|
||||||
|
// as the instance of Proxy is cloned, we end up with impl being null
|
||||||
|
// testIterationStart will not be executed but it's not a problem for 51380 as it's download of resources
|
||||||
|
// so SSL context is to be reused
|
||||||
|
if (impl == null) { // Not called from multiple threads, so this is OK
|
||||||
|
try {
|
||||||
|
impl = HTTPSamplerFactory.getImplementation(getImplementation(), this);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
return errorResult(ex, new HTTPSampleResult());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
String url = toExternalForm(u);
|
||||||
|
u = new URL(url);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LogUtil.error(ex);
|
||||||
|
}
|
||||||
|
return impl.sample(u, method, areFollowingRedirect, depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
// N.B. It's not possible to forward threadStarted() to the implementation class.
|
||||||
|
// This is because Config items are not processed until later, and HTTPDefaults may define the implementation
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void threadFinished() {
|
||||||
|
if (impl != null) {
|
||||||
|
impl.threadFinished(); // Forward to sampler
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean interrupt() {
|
||||||
|
if (impl != null) {
|
||||||
|
return impl.interrupt(); // Forward to sampler
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase#testIterationStart(org.apache.jmeter.engine.event.LoopIterationEvent)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void testIterationStart(LoopIterationEvent event) {
|
||||||
|
if (impl != null) {
|
||||||
|
impl.notifyFirstSampleAfterLoopRestart();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue