From dda1217c1aa0fe7dd52a2251723aad1b941e5aa0 Mon Sep 17 00:00:00 2001 From: fit2-zhao Date: Fri, 26 Mar 2021 16:29:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E6=8E=A5=E5=8F=A3=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8C=96):=20=E4=BF=AE=E5=A4=8D=E5=AF=BC=E5=85=A5=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E6=AD=A5=E9=AA=A4=E8=AF=B7=E6=B1=82=20ip=20=E5=92=8C?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3=20=E6=98=AF=E5=8F=98=E9=87=8F=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/automation/parse/MsJmeterParser.java | 69 +++++++++++++++++-- .../request/sampler/MsHTTPSamplerProxy.java | 34 ++++++--- .../automation/scenario/EditApiScenario.vue | 2 +- 3 files changed, 87 insertions(+), 18 deletions(-) diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsJmeterParser.java b/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsJmeterParser.java index 7cb52c524c..852b3b9755 100644 --- a/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsJmeterParser.java +++ b/backend/src/main/java/io/metersphere/api/dto/automation/parse/MsJmeterParser.java @@ -75,6 +75,8 @@ import org.apache.jorphan.collections.HashTree; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.lang.reflect.Field; +import java.net.MalformedURLException; +import java.net.URL; import java.util.*; public class MsJmeterParser extends ApiImportAbstractParser { @@ -132,12 +134,66 @@ public class MsJmeterParser extends ApiImportAbstractParser { return (HashTree) field.get(scriptWrapper); } + public boolean isProtocolDefaultPort(HTTPSamplerProxy source) { + String portAsString = source.getPropertyAsString("HTTPSampler.port"); + if (portAsString != null && !portAsString.isEmpty()) { + return false; + } else { + return true; + } + } + + public String url(String protocol, String host, String port, String file) { + protocol = protocol.toLowerCase(); + if (StringUtils.isNotEmpty(file) && !file.startsWith("/")) { + file += "/"; + } + return protocol + "://" + host + ":" + port + file; + } + + public String getUrl(HTTPSamplerProxy source) throws MalformedURLException { + String path = source.getPath(); + if (!path.startsWith("http://") && !path.startsWith("https://")) { + String domain = source.getDomain(); + String protocol = source.getProtocol(); + String method = source.getMethod(); + StringBuilder pathAndQuery = new StringBuilder(100); + if ("file".equalsIgnoreCase(protocol)) { + domain = null; + } else if (!path.startsWith("/")) { + pathAndQuery.append('/'); + } + + pathAndQuery.append(path); + if ("GET".equals(method) || "DELETE".equals(method) || "OPTIONS".equals(method)) { + String queryString = source.getQueryString(source.getContentEncoding()); + if (queryString.length() > 0) { + if (path.contains("?")) { + pathAndQuery.append("&"); + } else { + pathAndQuery.append("?"); + } + + pathAndQuery.append(queryString); + } + } + String portAsString = source.getPropertyAsString("HTTPSampler.port"); + return this.isProtocolDefaultPort(source) ? new URL(protocol, domain, pathAndQuery.toString()).toExternalForm() : this.url(protocol, domain, portAsString, pathAndQuery.toString()); + } else { + return new URL(path).toExternalForm(); + } + } + private void convertHttpSampler(MsHTTPSamplerProxy samplerProxy, Object key) { try { HTTPSamplerProxy source = (HTTPSamplerProxy) key; BeanUtils.copyBean(samplerProxy, source); - samplerProxy.setRest(new ArrayList(){{this.add(new KeyValue());}}); - samplerProxy.setArguments(new ArrayList(){{this.add(new KeyValue());}}); + samplerProxy.setRest(new ArrayList() {{ + this.add(new KeyValue()); + }}); + samplerProxy.setArguments(new ArrayList() {{ + this.add(new KeyValue()); + }}); if (source != null && source.getHTTPFiles().length > 0) { samplerProxy.getBody().initBinary(); samplerProxy.getBody().setType(Body.FORM_DATA); @@ -158,7 +214,8 @@ public class MsJmeterParser extends ApiImportAbstractParser { samplerProxy.getBody().setKvs(keyValues); } samplerProxy.setProtocol(RequestType.HTTP); - samplerProxy.setPort(source.getPort() + ""); + samplerProxy.setPort(source.getPropertyAsString("HTTPSampler.port")); + samplerProxy.setDomain(source.getDomain()); if (source.getArguments() != null) { if (source.getPostBodyRaw()) { samplerProxy.getBody().setType(Body.RAW); @@ -178,10 +235,10 @@ public class MsJmeterParser extends ApiImportAbstractParser { } samplerProxy.getBody().initBinary(); } - samplerProxy.setPath(""); + // samplerProxy.setPath(source.getPath()); samplerProxy.setMethod(source.getMethod()); - if (source.getUrl() != null) { - samplerProxy.setUrl(source.getUrl().toString()); + if (this.getUrl(source) != null) { + samplerProxy.setUrl(this.getUrl(source)); } samplerProxy.setId(UUID.randomUUID().toString()); samplerProxy.setType("HTTPSamplerProxy"); diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java index 907e0170fb..ecf3e2b261 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java @@ -91,6 +91,9 @@ public class MsHTTPSamplerProxy extends MsTestElement { @JSONField(ordinal = 36) private MsAuthManager authManager; + @JSONField(ordinal = 37) + private boolean urlOrPath; + @Override public void toHashTree(HashTree tree, List hashTree, ParameterConfig config) { // 非导出操作,且不是启用状态则跳过执行 @@ -140,23 +143,26 @@ public class MsHTTPSamplerProxy extends MsTestElement { url = this.getUrl(); isUrl = true; } - URL urlObject = new URL(url); if (isUrl) { + if (StringUtils.isNotEmpty(this.getPort()) && this.getPort().startsWith("${")) { + url.replaceAll(this.getPort(), "10990"); + } + URL urlObject = new URL(url); sampler.setDomain(URLDecoder.decode(urlObject.getHost(), "UTF-8")); - if (urlObject.getPort() > 0) { + if (urlObject.getPort() > 0 && urlObject.getPort() != 10990 && StringUtils.isNotEmpty(this.getPort()) && this.getPort().startsWith("${")) { sampler.setPort(urlObject.getPort()); + } else { + sampler.setProperty("HTTPSampler.port", this.getPort()); } sampler.setProtocol(urlObject.getProtocol()); + sampler.setPath(urlObject.getPath()); } else { sampler.setDomain(config.getConfig().get(this.getProjectId()).getHttpConfig().getDomain()); sampler.setPort(config.getConfig().get(this.getProjectId()).getHttpConfig().getPort()); sampler.setProtocol(config.getConfig().get(this.getProjectId()).getHttpConfig().getProtocol()); + sampler.setPath(this.getPath()); } - String envPath = StringUtils.equals(urlObject.getPath(), "/") ? "" : urlObject.getPath(); - if (StringUtils.isNotBlank(this.getPath()) && !isUrl) { - envPath += this.getPath(); - sampler.setPath(envPath); - } + String envPath = sampler.getPath(); if (CollectionUtils.isNotEmpty(this.getRest()) && this.isRest()) { envPath = getRestParameters(URLDecoder.decode(envPath, "UTF-8")); sampler.setPath(envPath); @@ -327,10 +333,16 @@ public class MsHTTPSamplerProxy extends MsTestElement { } public boolean isURL(String str) { - //转换为小写 try { - new URL(str); - return true; + String regex = "^((https|http|ftp|rtsp|mms)?://)" + + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" + + "(([0-9]{1,3}\\.){3}[0-9]{1,3}" + "|" + "([0-9a-z_!~*'()-]+\\.)*" + + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\\." + + "[a-z]{2,6})" + + "(:[0-9]{1,5})?" + + "((/?)|" + + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$"; + return str.matches(regex) || (str.matches("^(http|https|ftp)://.*$") && str.matches(".*://\\$\\{.*$")); } catch (Exception e) { return false; } @@ -339,5 +351,5 @@ public class MsHTTPSamplerProxy extends MsTestElement { private boolean isRest() { return this.getRest().stream().filter(KeyValue::isEnable).filter(KeyValue::isValid).toArray().length > 0; } - } + diff --git a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue index bab76c1216..4ebeeea4c4 100644 --- a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue +++ b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue @@ -926,7 +926,7 @@ return bodyUploadFiles; }, editScenario() { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { document.getElementById("inputDelay").focus(); // 保存前在input框自动失焦,以免保存失败 this.$refs['currentScenario'].validate((valid) => { if (valid) {