diff --git a/openapi2conv/issue440_test.go b/openapi2conv/issue440_test.go new file mode 100644 index 000000000..24f7a29e9 --- /dev/null +++ b/openapi2conv/issue440_test.go @@ -0,0 +1,48 @@ +package openapi2conv + +import ( + "context" + "encoding/json" + "os" + "testing" + + "github.com/getkin/kin-openapi/openapi2" + "github.com/getkin/kin-openapi/openapi3" + "github.com/stretchr/testify/require" +) + +func TestIssue440(t *testing.T) { + doc2file, err := os.Open("testdata/swagger.json") + require.NoError(t, err) + defer doc2file.Close() + var doc2 openapi2.T + err = json.NewDecoder(doc2file).Decode(&doc2) + require.NoError(t, err) + + doc3, err := ToV3(&doc2) + require.NoError(t, err) + err = doc3.Validate(context.Background()) + require.NoError(t, err) + require.Equal(t, openapi3.Servers{ + {URL: "https://petstore.swagger.io/v2"}, + {URL: "http://petstore.swagger.io/v2"}, + }, doc3.Servers) + + doc2.Host = "your-bot-domain.de" + doc2.Schemes = nil + doc2.BasePath = "" + doc3, err = ToV3(&doc2) + require.NoError(t, err) + err = doc3.Validate(context.Background()) + require.NoError(t, err) + require.Equal(t, openapi3.Servers{ + {URL: "https://your-bot-domain.de/"}, + }, doc3.Servers) + + doc2.Host = "https://your-bot-domain.de" + doc2.Schemes = nil + doc2.BasePath = "" + doc3, err = ToV3(&doc2) + require.Error(t, err) + require.Contains(t, err.Error(), `invalid host`) +} diff --git a/openapi2conv/openapi2_conv.go b/openapi2conv/openapi2_conv.go index 6877e88e8..e9f3164c0 100644 --- a/openapi2conv/openapi2_conv.go +++ b/openapi2conv/openapi2_conv.go @@ -26,11 +26,18 @@ func ToV3(doc2 *openapi2.T) (*openapi3.T, error) { } if host := doc2.Host; host != "" { + if strings.Contains(host, "/") { + err := fmt.Errorf("invalid host %q. This MUST be the host only and does not include the scheme nor sub-paths.", host) + return nil, err + } schemes := doc2.Schemes if len(schemes) == 0 { - schemes = []string{"https://"} + schemes = []string{"https"} } basePath := doc2.BasePath + if basePath == "" { + basePath = "/" + } for _, scheme := range schemes { u := url.URL{ Scheme: scheme, diff --git a/openapi2conv/openapi2_conv_test.go b/openapi2conv/openapi2_conv_test.go index adb9b0814..a8322698f 100644 --- a/openapi2conv/openapi2_conv_test.go +++ b/openapi2conv/openapi2_conv_test.go @@ -23,9 +23,9 @@ func TestConvOpenAPIV3ToV2(t *testing.T) { require.NoError(t, err) } - spec2, err := FromV3(&doc3) + doc2, err := FromV3(&doc3) require.NoError(t, err) - data, err := json.Marshal(spec2) + data, err := json.Marshal(doc2) require.NoError(t, err) require.JSONEq(t, exampleV2, string(data)) } @@ -35,11 +35,11 @@ func TestConvOpenAPIV2ToV3(t *testing.T) { err := json.Unmarshal([]byte(exampleV2), &doc2) require.NoError(t, err) - spec3, err := ToV3(&doc2) + doc3, err := ToV3(&doc2) require.NoError(t, err) - err = spec3.Validate(context.Background()) + err = doc3.Validate(context.Background()) require.NoError(t, err) - data, err := json.Marshal(spec3) + data, err := json.Marshal(doc3) require.NoError(t, err) require.JSONEq(t, exampleV3, string(data)) } diff --git a/openapi2conv/testdata/swagger.json b/openapi2conv/testdata/swagger.json new file mode 120000 index 000000000..c211aa245 --- /dev/null +++ b/openapi2conv/testdata/swagger.json @@ -0,0 +1 @@ +../../openapi2/testdata/swagger.json \ No newline at end of file diff --git a/openapi3/schema.go b/openapi3/schema.go index 3793ac19d..443f71980 100644 --- a/openapi3/schema.go +++ b/openapi3/schema.go @@ -1176,7 +1176,7 @@ func (schema *Schema) visitJSONString(settings *schemaValidationSettings, value Value: value, Schema: schema, SchemaField: "pattern", - Reason: fmt.Sprintf("string doesn't match the regular expression \"%s\"", schema.Pattern), + Reason: fmt.Sprintf(`string doesn't match the regular expression "%s"`, schema.Pattern), } if !settings.multiError { return err @@ -1191,7 +1191,7 @@ func (schema *Schema) visitJSONString(settings *schemaValidationSettings, value switch { case f.regexp != nil && f.callback == nil: if cp := f.regexp; !cp.MatchString(value) { - formatErr = fmt.Sprintf("string doesn't match the format %q (regular expression \"%s\")", format, cp.String()) + formatErr = fmt.Sprintf(`string doesn't match the format %q (regular expression "%s")`, format, cp.String()) } case f.regexp == nil && f.callback != nil: if err := f.callback(value); err != nil {