Skip to content

Commit bc70435

Browse files
author
Jim Minter
committed
update build proxy url parsing for go 1.8
1 parent 81f0fa2 commit bc70435

File tree

7 files changed

+42
-22
lines changed

7 files changed

+42
-22
lines changed

pkg/build/admission/defaults/api/validation/validation.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ import (
66

77
"github.com/openshift/origin/pkg/build/admission/defaults/api"
88
buildvalidation "github.com/openshift/origin/pkg/build/apis/build/validation"
9+
"github.com/openshift/origin/pkg/build/util"
910
)
1011

1112
// ValidateBuildDefaultsConfig tests required fields for a Build.
1213
func ValidateBuildDefaultsConfig(config *api.BuildDefaultsConfig) field.ErrorList {
1314
allErrs := field.ErrorList{}
14-
allErrs = append(allErrs, validateURL(config.GitHTTPProxy, field.NewPath("gitHTTPProxy"))...)
15-
allErrs = append(allErrs, validateURL(config.GitHTTPSProxy, field.NewPath("gitHTTPSProxy"))...)
15+
allErrs = append(allErrs, validateProxyURL(config.GitHTTPProxy, field.NewPath("gitHTTPProxy"))...)
16+
allErrs = append(allErrs, validateProxyURL(config.GitHTTPSProxy, field.NewPath("gitHTTPSProxy"))...)
1617
allErrs = append(allErrs, buildvalidation.ValidateStrategyEnv(config.Env, field.NewPath("env"))...)
1718
allErrs = append(allErrs, buildvalidation.ValidateImageLabels(config.ImageLabels, field.NewPath("imageLabels"))...)
1819
allErrs = append(allErrs, buildvalidation.ValidateNodeSelector(config.NodeSelector, field.NewPath("nodeSelector"))...)
@@ -21,10 +22,10 @@ func ValidateBuildDefaultsConfig(config *api.BuildDefaultsConfig) field.ErrorLis
2122
}
2223

2324
//
24-
func validateURL(u string, path *field.Path) field.ErrorList {
25+
func validateProxyURL(u string, path *field.Path) field.ErrorList {
2526
allErrs := field.ErrorList{}
26-
if !buildvalidation.IsValidURL(u) {
27-
allErrs = append(allErrs, field.Invalid(path, u, "invalid URL"))
27+
if _, err := util.ParseProxyURL(u); err != nil {
28+
allErrs = append(allErrs, field.Invalid(path, u, err.Error()))
2829
}
2930
return allErrs
3031
}

pkg/build/apis/build/validation/validation.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package validation
22

33
import (
44
"fmt"
5-
"net/url"
65
"path"
76
"path/filepath"
87
"strings"
@@ -24,6 +23,7 @@ import (
2423
imageapi "github.com/openshift/origin/pkg/image/apis/image"
2524
imageapivalidation "github.com/openshift/origin/pkg/image/apis/image/validation"
2625
"github.com/openshift/origin/pkg/util/labelselector"
26+
s2igit "github.com/openshift/source-to-image/pkg/scm/git"
2727
)
2828

2929
// ValidateBuild tests required fields for a Build.
@@ -271,14 +271,18 @@ func validateGitSource(git *buildapi.GitBuildSource, fldPath *field.Path) field.
271271
allErrs := field.ErrorList{}
272272
if len(git.URI) == 0 {
273273
allErrs = append(allErrs, field.Required(fldPath.Child("uri"), ""))
274-
} else if !IsValidURL(git.URI) {
275-
allErrs = append(allErrs, field.Invalid(fldPath.Child("uri"), git.URI, "uri is not a valid url"))
274+
} else if _, err := s2igit.Parse(git.URI); err != nil {
275+
allErrs = append(allErrs, field.Invalid(fldPath.Child("uri"), git.URI, err.Error()))
276276
}
277-
if git.HTTPProxy != nil && len(*git.HTTPProxy) != 0 && !IsValidURL(*git.HTTPProxy) {
278-
allErrs = append(allErrs, field.Invalid(fldPath.Child("httpproxy"), *git.HTTPProxy, "proxy is not a valid url"))
277+
if git.HTTPProxy != nil && len(*git.HTTPProxy) != 0 {
278+
if _, err := buildutil.ParseProxyURL(*git.HTTPProxy); err != nil {
279+
allErrs = append(allErrs, field.Invalid(fldPath.Child("httpproxy"), *git.HTTPProxy, err.Error()))
280+
}
279281
}
280-
if git.HTTPSProxy != nil && len(*git.HTTPSProxy) != 0 && !IsValidURL(*git.HTTPSProxy) {
281-
allErrs = append(allErrs, field.Invalid(fldPath.Child("httpsproxy"), *git.HTTPSProxy, "proxy is not a valid url"))
282+
if git.HTTPSProxy != nil && len(*git.HTTPSProxy) != 0 {
283+
if _, err := buildutil.ParseProxyURL(*git.HTTPSProxy); err != nil {
284+
allErrs = append(allErrs, field.Invalid(fldPath.Child("httpsproxy"), *git.HTTPSProxy, err.Error()))
285+
}
282286
}
283287
return allErrs
284288
}
@@ -637,11 +641,6 @@ func validateWebHook(webHook *buildapi.WebHookTrigger, fldPath *field.Path, isGe
637641
return allErrs
638642
}
639643

640-
func IsValidURL(uri string) bool {
641-
_, err := url.Parse(uri)
642-
return err == nil
643-
}
644-
645644
func ValidateBuildLogOptions(opts *buildapi.BuildLogOptions) field.ErrorList {
646645
allErrs := field.ErrorList{}
647646

pkg/build/apis/build/validation/validation_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,7 @@ func TestValidateSource(t *testing.T) {
841841
path: "git.uri",
842842
source: &buildapi.BuildSource{
843843
Git: &buildapi.GitBuildSource{
844-
URI: "::",
844+
URI: "http://%",
845845
},
846846
},
847847
},

pkg/build/builder/sti.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -440,14 +440,14 @@ func scriptProxyConfig(build *buildapi.Build) (*s2iapi.ProxyConfig, error) {
440440
}
441441
config := &s2iapi.ProxyConfig{}
442442
if len(httpProxy) > 0 {
443-
proxyURL, err := url.Parse(httpProxy)
443+
proxyURL, err := util.ParseProxyURL(httpProxy)
444444
if err != nil {
445445
return nil, err
446446
}
447447
config.HTTPProxy = proxyURL
448448
}
449449
if len(httpsProxy) > 0 {
450-
proxyURL, err := url.Parse(httpsProxy)
450+
proxyURL, err := util.ParseProxyURL(httpsProxy)
451451
if err != nil {
452452
return nil, err
453453
}

pkg/build/util/util.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,3 +461,23 @@ func FindDockerSecretAsReference(secrets []kapi.Secret, image string) *kapi.Loca
461461
}
462462
return nil
463463
}
464+
465+
// ParseProxyURL parses a proxy URL and allows fallback to non-URLs like
466+
// myproxy:80 (for example) which url.Parse no longer accepts in Go 1.8. The
467+
// logic is copied from net/http.ProxyFromEnvironment to try to maintain
468+
// backwards compatibility.
469+
func ParseProxyURL(proxy string) (*url.URL, error) {
470+
proxyURL, err := url.Parse(proxy)
471+
472+
// logic copied from net/http.ProxyFromEnvironment
473+
if err != nil || !strings.HasPrefix(proxyURL.Scheme, "http") {
474+
// proxy was bogus. Try prepending "http://" to it and see if that
475+
// parses correctly. If not, we fall through and complain about the
476+
// original one.
477+
if proxyURL, err := url.Parse("http://" + proxy); err == nil {
478+
return proxyURL, nil
479+
}
480+
}
481+
482+
return proxyURL, err
483+
}

test/extended/testdata/bindata.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/extended/testdata/statusfail-genericreason.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ spec:
1515
scripts: "http://example.org/scripts"
1616
env:
1717
- name: http_proxy
18-
value: ":http://example.org"
18+
value: "http://%"

0 commit comments

Comments
 (0)