Skip to content

Commit

Permalink
Merge pull request hashicorp#6110 from hashicorp/fix_6091
Browse files Browse the repository at this point in the history
replace QueryEscape with url.URL hack to fix encoding of spaces
  • Loading branch information
SwampDragons authored Apr 6, 2018
2 parents f094b3b + 6855216 commit 8850a6e
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 3 deletions.
13 changes: 10 additions & 3 deletions post-processor/vsphere/post-processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,9 @@ func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (pac
return nil, false, fmt.Errorf("VMX, OVF or OVA file not found")
}

password := url.QueryEscape(p.config.Password)
password := escapeWithSpaces(p.config.Password)
ovftool_uri := fmt.Sprintf("vi://%s:%s@%s/%s/host/%s",
url.QueryEscape(p.config.Username),
escapeWithSpaces(p.config.Username),
password,
p.config.Host,
p.config.Datacenter,
Expand Down Expand Up @@ -146,7 +146,7 @@ func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (pac
}

func (p *PostProcessor) filterLog(s string) string {
password := url.QueryEscape(p.config.Password)
password := escapeWithSpaces(p.config.Password)
return strings.Replace(s, password, "<password>", -1)
}

Expand Down Expand Up @@ -186,3 +186,10 @@ func (p *PostProcessor) BuildArgs(source, ovftool_uri string) ([]string, error)

return args, nil
}

// Encode everything except for + signs
func escapeWithSpaces(stringToEscape string) string {
escapedString := url.QueryEscape(stringToEscape)
escapedString = strings.Replace(escapedString, "+", `%20`, -1)
return escapedString
}
31 changes: 31 additions & 0 deletions post-processor/vsphere/post-processor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,34 @@ func TestArgs(t *testing.T) {

t.Logf("ovftool %s", strings.Join(args, " "))
}

func TestEscaping(t *testing.T) {
type escapeCases struct {
Input string
Expected string
}

cases := []escapeCases{
{`this has spaces`, `this%20has%20spaces`},
{`exclaimation_!`, `exclaimation_%21`},
{`hash_#_dollar_$`, `hash_%23_dollar_%24`},
{`ampersand_&awesome`, `ampersand_%26awesome`},
{`single_quote_'_and_another_'`, `single_quote_%27_and_another_%27`},
{`open_paren_(_close_paren_)`, `open_paren_%28_close_paren_%29`},
{`asterisk_*_plus_+`, `asterisk_%2A_plus_%2B`},
{`comma_,slash_/`, `comma_%2Cslash_%2F`},
{`colon_:semicolon_;`, `colon_%3Asemicolon_%3B`},
{`equal_=question_?`, `equal_%3Dquestion_%3F`},
{`at_@`, `at_%40`},
{`open_bracket_[closed_bracket]`, `open_bracket_%5Bclosed_bracket%5D`},
{`user:password with $paces@host/name.foo`, `user%3Apassword%20with%20%24paces%40host%2Fname.foo`},
}
for _, escapeCase := range cases {
received := escapeWithSpaces(escapeCase.Input)

if escapeCase.Expected != received {
t.Errorf("Error escaping URL; expected %s got %s", escapeCase.Expected, received)
}
}

}

0 comments on commit 8850a6e

Please sign in to comment.