@@ -2,10 +2,12 @@ package server
2
2
3
3
import (
4
4
"fmt"
5
+ "io/ioutil"
5
6
"net"
6
7
"net/http"
7
8
"net/http/httptest"
8
9
"net/http/httputil"
10
+ "os"
9
11
"time"
10
12
11
13
log "github.com/Sirupsen/logrus"
@@ -76,9 +78,22 @@ type VersionedInterface interface {
76
78
ImplementedInterface () spi.InterfaceSpec
77
79
}
78
80
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
+
79
88
// StartPluginAtPath starts an HTTP server listening on a unix socket at the specified path.
80
89
// Returns a Stoppable that can be used to stop or block on the server.
81
90
func 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
+
82
97
server := rpc .NewServer ()
83
98
server .RegisterCodec (json2 .NewCodec (), "application/json" )
84
99
@@ -160,22 +175,50 @@ func StartPluginAtPath(socketPath string, receiver VersionedInterface, more ...V
160
175
161
176
gracefulServer := graceful.Server {
162
177
Timeout : 10 * time .Second ,
163
- Server : & http.Server {Addr : fmt .Sprintf ("unix://%s" , socketPath ), Handler : router },
164
178
}
165
179
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
+ }
170
196
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
+ }
172
212
173
213
go func () {
174
214
err := gracefulServer .Serve (listener )
175
215
if err != nil {
176
216
log .Warn (err )
177
217
}
178
218
events .Stop ()
219
+ if listen != "" {
220
+ os .Remove (discoverPath )
221
+ }
179
222
}()
180
223
181
224
return & stoppableServer {server : & gracefulServer }, nil
0 commit comments