@@ -2,10 +2,12 @@ package server
22
33import (
44 "fmt"
5+ "io/ioutil"
56 "net"
67 "net/http"
78 "net/http/httptest"
89 "net/http/httputil"
10+ "os"
911 "time"
1012
1113 log "github.com/Sirupsen/logrus"
@@ -76,9 +78,22 @@ type VersionedInterface interface {
7678 ImplementedInterface () spi.InterfaceSpec
7779}
7880
81+ // StartListenerAtPath starts an HTTP server listening on tcp port with discovery entry at specified path.
82+ // Returns a Stoppable that can be used to stop or block on the server.
83+ func StartListenerAtPath (listen , discoverPath string ,
84+ receiver VersionedInterface , more ... VersionedInterface ) (Stoppable , error ) {
85+ return startAtPath (listen , discoverPath , receiver , more ... )
86+ }
87+
7988// StartPluginAtPath starts an HTTP server listening on a unix socket at the specified path.
8089// Returns a Stoppable that can be used to stop or block on the server.
8190func StartPluginAtPath (socketPath string , receiver VersionedInterface , more ... VersionedInterface ) (Stoppable , error ) {
91+ return startAtPath ("" , socketPath , receiver , more ... )
92+ }
93+
94+ func startAtPath (listen , discoverPath string ,
95+ receiver VersionedInterface , more ... VersionedInterface ) (Stoppable , error ) {
96+
8297 server := rpc .NewServer ()
8398 server .RegisterCodec (json2 .NewCodec (), "application/json" )
8499
@@ -160,22 +175,50 @@ func StartPluginAtPath(socketPath string, receiver VersionedInterface, more ...V
160175
161176 gracefulServer := graceful.Server {
162177 Timeout : 10 * time .Second ,
163- Server : & http.Server {Addr : fmt .Sprintf ("unix://%s" , socketPath ), Handler : router },
164178 }
165179
166- listener , err := net .Listen ("unix" , socketPath )
167- if err != nil {
168- return nil , err
169- }
180+ var listener net.Listener
181+
182+ if listen != "" {
183+ gracefulServer .Server = & http.Server {
184+ Addr : listen ,
185+ Handler : router ,
186+ }
187+ l , err := net .Listen ("tcp" , listen )
188+ if err != nil {
189+ return nil , err
190+ }
191+ listener = l
192+
193+ if err := ioutil .WriteFile (discoverPath , []byte (fmt .Sprintf ("tcp://%s" , listen )), 0644 ); err != nil {
194+ return nil , err
195+ }
170196
171- log .Infof ("Listening at: %s" , socketPath )
197+ log .Infof ("Listening at: %s, discoverable at %s" , listen , discoverPath )
198+
199+ } else {
200+ gracefulServer .Server = & http.Server {
201+ Addr : fmt .Sprintf ("unix://%s" , discoverPath ),
202+ Handler : router ,
203+ }
204+ l , err := net .Listen ("unix" , discoverPath )
205+ if err != nil {
206+ return nil , err
207+ }
208+ listener = l
209+ log .Infof ("Listening at: %s" , discoverPath )
210+
211+ }
172212
173213 go func () {
174214 err := gracefulServer .Serve (listener )
175215 if err != nil {
176216 log .Warn (err )
177217 }
178218 events .Stop ()
219+ if listen != "" {
220+ os .Remove (discoverPath )
221+ }
179222 }()
180223
181224 return & stoppableServer {server : & gracefulServer }, nil
0 commit comments