diff --git a/apps/README.md b/apps/README.md index f20cc1e7..ae5644cb 100644 --- a/apps/README.md +++ b/apps/README.md @@ -121,9 +121,9 @@ Example Code: ```go switcher := Switch(Hosts{ - "mydomain.com": app, - "test.mydomain.com": testSubdomainApp, - "otherdomain.com": "appName", + {Pattern: "mydomain.com", Target: app}, + {Pattern: "test.mydomain.com", Target: testSubdomainApp}, + {Pattern: "otherdomain.com", Target: "appName"}, }) switcher.Listen(":80") ``` @@ -211,7 +211,7 @@ Switch(Join{ App: myapp, }, Hosts{ - {"^test.*$", myapp}, + {Pattern: "^test.*$", Target: myapp}, }, }) ``` diff --git a/apps/switch.go b/apps/switch.go index d3d2dba0..f13a93eb 100644 --- a/apps/switch.go +++ b/apps/switch.go @@ -15,9 +15,9 @@ import ( // Example Code: // // switcher := Switch(Hosts{ -// "mydomain.com": app, -// "test.mydomain.com": testSubdomainApp, -// "otherdomain.com": "appName", +// { Pattern: "mydomain.com", Target: app }, +// { Pattern: "test.mydomain.com", Target: testSubdomainApp }, +// { Pattern: "otherdomain.com", "Target: appName" }, // }) // switcher.Listen(":80") // @@ -35,6 +35,28 @@ import ( // // Wrap with the `Join` slice to pass // more than one provider at the same time. +// +// An alternative way for manually embedding an Iris Application to another one is: +// +// app := iris.New() // root app. +// myOtherApp := api.NewServer(otherServerConfiguration) // embedded app. +// // myOtherApp.Logger().SetLevel("debug") +// +// if err := myOtherApp.Build(); err != nil { +// panic(err) +// } +// +// app.Any("/api/identity/{p:path}", func(ctx iris.Context) { +// apiPath := "/" + ctx.Params().Get("p") +// r := ctx.Request() +// r.URL.Path = apiPath +// r.URL.RawPath = apiPath +// ctx.Params().Remove("p") +// +// myOtherApp.ServeHTTPC(ctx) +// }) +// +// app.Listen(":80") func Switch(provider SwitchProvider, options ...SwitchOption) *iris.Application { cases := provider.GetSwitchCases() if len(cases) == 0 { diff --git a/apps/switch_hosts.go b/apps/switch_hosts.go index 0e4c4ba9..25efec96 100644 --- a/apps/switch_hosts.go +++ b/apps/switch_hosts.go @@ -36,6 +36,22 @@ type ( var _ SwitchProvider = Hosts{} +// AnyDomain is a regexp that matches any domain. +// It can be used as the Pattern field of a Host. +// +// Example: +// +// apps.Switch(apps.Hosts{ +// { +// Pattern: "^id.*$", Target: identityApp, +// }, +// { +// Pattern: apps.AnyDomain, Target: app, +// }, +// }).Listen(":80") +const AnyDomain = `^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z + ]{2,3})$` + // GetSwitchCases completes the SwitchProvider. // It returns a slice of SwitchCase which // if passed on `Switch` function, they act