|
19 | 19 | package com.cloud.hypervisor.kvm.resource.wrapper; |
20 | 20 |
|
21 | 21 | import java.net.URLEncoder; |
22 | | -import java.nio.charset.Charset; |
| 22 | +import java.nio.charset.StandardCharsets; |
23 | 23 | import java.nio.file.Files; |
24 | 24 | import java.nio.file.Path; |
25 | 25 | import java.nio.file.attribute.PosixFilePermission; |
@@ -214,10 +214,10 @@ private String getExportOVAUrlFromRemoteInstance(RemoteInstanceTO vmwareInstance |
214 | 214 | if (StringUtils.isNotBlank(path)) { |
215 | 215 | logger.info("({}) VM path: {}", originalVMName, path); |
216 | 216 | return String.format("vi://%s:%s@%s/%s/%s/%s", |
217 | | - encodedUsername, encodedPassword, vcenter, datacenter, path, vm); |
| 217 | + encodedUsername, encodedPassword, vcenter, encodePathSegments(datacenter), encodePathSegments(path), encodePathSegment(vm)); |
218 | 218 | } |
219 | 219 | return String.format("vi://%s:%s@%s/%s/vm/%s", |
220 | | - encodedUsername, encodedPassword, vcenter, datacenter, vm); |
| 220 | + encodedUsername, encodedPassword, vcenter, encodePathSegments(datacenter), encodePathSegment(vm)); |
221 | 221 | } |
222 | 222 |
|
223 | 223 | protected void sanitizeDisksPath(List<LibvirtVMDef.DiskDef> disks) { |
@@ -296,7 +296,28 @@ protected void addExtraParamsToScript(String extraParams, Script script) { |
296 | 296 | } |
297 | 297 |
|
298 | 298 | protected String encodeUsername(String username) { |
299 | | - return URLEncoder.encode(username, Charset.defaultCharset()); |
| 299 | + return URLEncoder.encode(username, StandardCharsets.UTF_8).replace("+", "%20"); |
| 300 | + } |
| 301 | + |
| 302 | + private String encodePathSegment(String value) { |
| 303 | + if (StringUtils.isBlank(value)) { |
| 304 | + return value; |
| 305 | + } |
| 306 | + return URLEncoder.encode(value, StandardCharsets.UTF_8).replace("+", "%20"); |
| 307 | + } |
| 308 | + |
| 309 | + private String encodePathSegments(String value) { |
| 310 | + if (StringUtils.isBlank(value)) { |
| 311 | + return value; |
| 312 | + } |
| 313 | + StringBuilder encoded = new StringBuilder(); |
| 314 | + for (String seg : value.split("/", -1)) { |
| 315 | + if (encoded.length() > 0) { |
| 316 | + encoded.append("/"); |
| 317 | + } |
| 318 | + encoded.append(encodePathSegment(seg)); |
| 319 | + } |
| 320 | + return encoded.toString(); |
300 | 321 | } |
301 | 322 |
|
302 | 323 | private String resolveVddkSetting(String commandValue, String agentValue) { |
@@ -477,14 +498,14 @@ private String buildVpxUrl(RemoteInstanceTO vmwareInstance) { |
477 | 498 | .append("@") |
478 | 499 | .append(vcenter) |
479 | 500 | .append("/") |
480 | | - .append(datacenter); |
| 501 | + .append(encodePathSegments(datacenter)); |
481 | 502 |
|
482 | 503 | if (StringUtils.isNotBlank(cluster)) { |
483 | | - url.append("/").append(cluster); |
| 504 | + url.append("/").append(encodePathSegments(cluster)); |
484 | 505 | } |
485 | 506 |
|
486 | 507 | if (StringUtils.isNotBlank(host)) { |
487 | | - url.append("/").append(host); |
| 508 | + url.append("/").append(encodePathSegment(host)); |
488 | 509 | } |
489 | 510 |
|
490 | 511 | url.append("?no_verify=1"); |
|
0 commit comments