Skip to content

Commit d84f51c

Browse files
committed
Change API so that the "Header" option adds one header entry.
Previously an entire header could be appended. While more flexible, most usages just want to add one or two custom header entries, and this new way looks cleaner. It also removes the need for the calling program to have a reference to the stomp/frame package.
1 parent 6b08341 commit d84f51c

File tree

5 files changed

+34
-32
lines changed

5 files changed

+34
-32
lines changed

conn_options.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,10 @@ var ConnOpt struct {
124124
// shorter time duration during unit testing.
125125
HeartBeatError func(errorTimeout time.Duration) func(*Conn) error
126126

127-
// Header is a connect option that allows the client to specify custom header
128-
// elements in the CONNECT/STOMP frame.
129-
Header func(header *frame.Header) func(*Conn) error
127+
// Header is a connect option that allows the client to specify a custom
128+
// header entry in the STOMP frame. This connect option can be specified
129+
// multiple times for multiple custom headers.
130+
Header func(key, value string) func(*Conn) error
130131
}
131132

132133
func init() {
@@ -177,9 +178,13 @@ func init() {
177178
}
178179
}
179180

180-
ConnOpt.Header = func(header *frame.Header) func(*Conn) error {
181+
ConnOpt.Header = func(key, value string) func(*Conn) error {
181182
return func(c *Conn) error {
182-
c.options.Header = header
183+
if c.options.Header == nil {
184+
c.options.Header = frame.NewHeader(key, value)
185+
} else {
186+
c.options.Header.Add(key, value)
187+
}
183188
return nil
184189
}
185190
}

conn_test.go

+7-16
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ func (s *StompSuite) Test_successful_connect_with_nonstandard_header(c *C) {
176176
client, err := Connect(fc1,
177177
ConnOpt.Login("guest", "guest"),
178178
ConnOpt.Host("/"),
179-
ConnOpt.Header(frame.NewHeader("x-max-length", "50")))
179+
ConnOpt.Header("x-max-length", "50"))
180180
c.Assert(err, IsNil)
181181
c.Assert(client, NotNil)
182182
c.Assert(client.Version(), Equals, V10)
@@ -220,17 +220,18 @@ func connectHelper(c *C, version Version) (*Conn, *fakeReaderWriter) {
220220
func (s *StompSuite) Test_subscribe(c *C) {
221221
ackModes := []AckMode{AckAuto, AckClient, AckClientIndividual}
222222
versions := []Version{V10, V11, V12}
223-
header := frame.NewHeader("id", "client-1", "custom", "true")
224223

225224
for _, ackMode := range ackModes {
226225
for _, version := range versions {
227-
subscribeHelper(c, ackMode, version, nil)
228-
subscribeHelper(c, ackMode, version, header)
226+
subscribeHelper(c, ackMode, version)
227+
subscribeHelper(c, ackMode, version,
228+
SubscribeOpt.Header("id", "client-1"),
229+
SubscribeOpt.Header("custom", "true"))
229230
}
230231
}
231232
}
232233

233-
func subscribeHelper(c *C, ackMode AckMode, version Version, header *frame.Header) {
234+
func subscribeHelper(c *C, ackMode AckMode, version Version, opts ...func(*frame.Frame) error) {
234235
conn, rw := connectHelper(c, version)
235236
stop := make(chan struct{})
236237

@@ -247,16 +248,6 @@ func subscribeHelper(c *C, ackMode AckMode, version Version, header *frame.Heade
247248
id, ok := f3.Header.Contains("id")
248249
c.Assert(ok, Equals, true)
249250

250-
if header != nil {
251-
for i := 0; i < header.Len(); i++ {
252-
k, v := header.GetAt(i)
253-
if k != frame.Id {
254-
headerV, _ := f3.Header.Contains(k)
255-
c.Assert(headerV, Equals, v)
256-
}
257-
}
258-
}
259-
260251
destination := f3.Header.Get("destination")
261252
c.Assert(destination, Equals, "/queue/test-1")
262253
ack := f3.Header.Get("ack")
@@ -302,7 +293,7 @@ func subscribeHelper(c *C, ackMode AckMode, version Version, header *frame.Heade
302293

303294
var sub *Subscription
304295
var err error
305-
sub, err = conn.Subscribe("/queue/test-1", ackMode, SubscribeOpt.Header(header))
296+
sub, err = conn.Subscribe("/queue/test-1", ackMode, opts...)
306297

307298
c.Assert(sub, NotNil)
308299
c.Assert(err, IsNil)

example_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func ExampleConn_Send(c *stomp.Conn) error {
1616
"text/plain", // content-type
1717
[]byte("Message number 1"), // body
1818
stomp.SendOpt.Receipt,
19-
stomp.SendOpt.Header(frame.NewHeader("expires", "2049-12-31 23:59:59")))
19+
stomp.SendOpt.Header("expires", "2049-12-31 23:59:59"))
2020
if err != nil {
2121
return err
2222
}
@@ -122,8 +122,8 @@ func ExampleConn_Subscribe_2(c *stomp.Conn) error {
122122
}
123123

124124
// Subscribe to queue with client acknowledgement and a custom header value
125-
customHeader := frame.NewHeader("x-custom-header", "some-value")
126-
sub2, err := c.Subscribe("/queue/test-2", stomp.AckClient, stomp.SubscribeOpt.Header(customHeader))
125+
sub2, err := c.Subscribe("/queue/test-2", stomp.AckClient,
126+
stomp.SubscribeOpt.Header("x-custom-header", "some-value"))
127127
if err != nil {
128128
return err
129129
}
@@ -225,7 +225,7 @@ func ExampleDial_2() error {
225225
stomp.ConnOpt.AcceptVersion(stomp.V11),
226226
stomp.ConnOpt.AcceptVersion(stomp.V12),
227227
stomp.ConnOpt.Host("dragon"),
228-
stomp.ConnOpt.Header(frame.NewHeader("nonce", "B256B26D320A")))
228+
stomp.ConnOpt.Header("nonce", "B256B26D320A"))
229229
if err != nil {
230230
return err
231231
}

send_options.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ var SendOpt struct {
1919
NoContentType func(*frame.Frame) error
2020

2121
// Header provides the opportunity to include custom header entries
22-
// in the SEND frame that the client sends to the server.
23-
Header func(header *frame.Header) func(*frame.Frame) error
22+
// in the SEND frame that the client sends to the server. This option
23+
// can be specified multiple times if multiple custom header entries
24+
// are required.
25+
Header func(key, value string) func(*frame.Frame) error
2426
}
2527

2628
func init() {
@@ -33,12 +35,12 @@ func init() {
3335
return nil
3436
}
3537

36-
SendOpt.Header = func(header *frame.Header) func(*frame.Frame) error {
38+
SendOpt.Header = func(key, value string) func(*frame.Frame) error {
3739
return func(f *frame.Frame) error {
3840
if f.Command != frame.SEND {
3941
return ErrInvalidCommand
4042
}
41-
f.Header.AddHeader(header)
43+
f.Header.Add(key, value)
4244
return nil
4345
}
4446
}

subscribe_options.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,20 @@ import (
88
var SubscribeOpt struct {
99
// Header provides the opportunity to include custom header entries
1010
// in the SUBSCRIBE frame that the client sends to the server.
11-
Header func(header *frame.Header) func(*frame.Frame) error
11+
Header func(key, value string) func(*frame.Frame) error
1212
}
1313

1414
func init() {
15-
SubscribeOpt.Header = func(header *frame.Header) func(*frame.Frame) error {
15+
SubscribeOpt.Header = func(key, value string) func(*frame.Frame) error {
1616
return func(f *frame.Frame) error {
1717
if f.Command != frame.SUBSCRIBE {
1818
return ErrInvalidCommand
1919
}
20-
f.Header.AddHeader(header)
20+
if f.Header == nil {
21+
f.Header = frame.NewHeader(key, value)
22+
} else {
23+
f.Header.Add(key, value)
24+
}
2125
return nil
2226
}
2327
}

0 commit comments

Comments
 (0)