diff --git a/network/resolver/http/http.go b/network/resolver/http/http.go new file mode 100644 index 00000000..80ff4d61 --- /dev/null +++ b/network/resolver/http/http.go @@ -0,0 +1,59 @@ +// Package http resolves ids to network addresses using a http request +package http + +import ( + "encoding/json" + "io/ioutil" + "net/http" + "net/url" + + "github.com/micro/go-micro/network/resolver" +) + +type Resolver struct { + // If not set, defaults to http + Proto string + + // Path sets the path to lookup. Defaults to /network + Path string +} + +// Resolve assumes ID is a domain which can be converted to a http://id/network request +func (r *Resolver) Resolve(id string) ([]*resolver.Record, error) { + proto := "http" + path := "/network" + + if len(r.Proto) > 0 { + proto = r.Proto + } + + if len(r.Path) > 0 { + path = r.Path + } + + uri := &url.URL{ + Scheme: proto, + Path: path, + Host: id, + } + + rsp, err := http.Get(uri.String()) + if err != nil { + return nil, err + } + defer rsp.Body.Close() + + b, err := ioutil.ReadAll(rsp.Body) + if err != nil { + return nil, err + } + + // encoding format is assumed to be json + var records []*resolver.Record + + if err := json.Unmarshal(b, &records); err != nil { + return nil, err + } + + return records, nil +} diff --git a/network/resolver/resolver.go b/network/resolver/resolver.go index ba80e124..ac8de831 100644 --- a/network/resolver/resolver.go +++ b/network/resolver/resolver.go @@ -8,5 +8,5 @@ type Resolver interface { // A resoved id type Record struct { - Address string + Address string `json:"address"` }