Browse Source

Remove some dead code.

pull/2/head
Justine Alexandra Roberts Tunney 11 years ago
parent
commit
202d14c882
19 changed files with 517 additions and 602 deletions
  1. +5
    -5
      example/echo/echo_test.go
  2. +3
    -3
      example/options/options_test.go
  3. +0
    -16
      sip/addr.go
  4. +25
    -12
      sip/addr_test.go
  5. +0
    -29
      sip/compact.go
  6. +1
    -1
      sip/dialog.go
  7. +1
    -1
      sip/errors.go
  8. +189
    -197
      sip/msg_parse.go
  9. +1
    -9
      sip/msg_parse.rl
  10. +56
    -48
      sip/msg_test.go
  11. +1
    -1
      sip/receiver.go
  12. +1
    -1
      sip/route.go
  13. +2
    -2
      sip/sip.rl
  14. +2
    -2
      sip/trace.go
  15. +1
    -1
      sip/transport.go
  16. +199
    -208
      sip/uri_parse.go
  17. +1
    -18
      sip/uri_parse.rl
  18. +14
    -7
      sip/uri_test.go
  19. +15
    -41
      util/util.go

+ 5
- 5
example/echo/echo_test.go View File

@ -179,7 +179,7 @@ func TestCallToEchoApp(t *testing.T) {
Via: &sip.Via{ Via: &sip.Via{
Host: laddr.IP.String(), Host: laddr.IP.String(),
Port: uint16(laddr.Port), Port: uint16(laddr.Port),
Param: &sip.Param{"branch", util.GenerateBranch(), nil},
Param: &sip.Param{Name: "branch", Value: util.GenerateBranch()},
}, },
From: &sip.Addr{ From: &sip.Addr{
Display: "Echo Test", Display: "Echo Test",
@ -188,7 +188,7 @@ func TestCallToEchoApp(t *testing.T) {
Host: laddr.IP.String(), Host: laddr.IP.String(),
Port: uint16(laddr.Port), Port: uint16(laddr.Port),
}, },
Param: &sip.Param{"tag", util.GenerateTag(), nil},
Param: &sip.Param{Name: "tag", Value: util.GenerateTag()},
}, },
To: &sip.Addr{ To: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -224,7 +224,7 @@ func TestCallToEchoApp(t *testing.T) {
t.Fatal("read 100 trying:", err) t.Fatal("read 100 trying:", err)
} }
log.Printf("<<< %s\n%s\n", raddr, string(memory[0:amt])) log.Printf("<<< %s\n%s\n", raddr, string(memory[0:amt]))
msg, err := sip.ParseMsg(string(memory[0:amt]))
msg, err := sip.ParseMsg(memory[0:amt])
if err != nil { if err != nil {
t.Fatal("parse 100 trying", err) t.Fatal("parse 100 trying", err)
} }
@ -239,7 +239,7 @@ func TestCallToEchoApp(t *testing.T) {
t.Fatal("read 200 ok:", err) t.Fatal("read 200 ok:", err)
} }
log.Printf("<<< %s\n%s\n", raddr, string(memory[0:amt])) log.Printf("<<< %s\n%s\n", raddr, string(memory[0:amt]))
msg, err = sip.ParseMsg(string(memory[0:amt]))
msg, err = sip.ParseMsg(memory[0:amt])
if err != nil { if err != nil {
t.Fatal("parse 200 ok:", err) t.Fatal("parse 200 ok:", err)
} }
@ -341,7 +341,7 @@ func TestCallToEchoApp(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
msg, err = sip.ParseMsg(string(memory[0:amt]))
msg, err = sip.ParseMsg(memory[0:amt])
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }


+ 3
- 3
example/options/options_test.go View File

@ -39,7 +39,7 @@ func TestOptions(t *testing.T) {
Protocol: "UDP", Protocol: "UDP",
Host: laddr.IP.String(), Host: laddr.IP.String(),
Port: uint16(laddr.Port), Port: uint16(laddr.Port),
Param: &sip.Param{"branch", util.GenerateBranch(), nil},
Param: &sip.Param{Name: "branch", Value: util.GenerateBranch()},
}, },
Contact: &sip.Addr{ Contact: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -53,7 +53,7 @@ func TestOptions(t *testing.T) {
Host: "justinetunney.com", Host: "justinetunney.com",
Port: 5060, Port: 5060,
}, },
Param: &sip.Param{"tag", util.GenerateTag(), nil},
Param: &sip.Param{Name: "tag", Value: util.GenerateTag()},
}, },
To: &sip.Addr{ To: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -76,7 +76,7 @@ func TestOptions(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
msg, err := sip.ParseMsg(string(memory[0:amt]))
msg, err := sip.ParseMsg(memory[0:amt])
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }


+ 0
- 16
sip/addr.go View File

@ -31,22 +31,6 @@ type Addr struct {
Next *Addr // for comma separated lists of addresses Next *Addr // for comma separated lists of addresses
} }
func ParseAddr(s string) (addr *Addr, err error) {
return ParseAddrBytes([]byte(s))
}
func ParseAddrBytes(s []byte) (addr *Addr, err error) {
var b bytes.Buffer
b.WriteString("SIP/2.0 900 ParseAddr()\r\nContact:")
b.Write(s)
b.WriteString("\r\n\r\n")
msg, err := ParseMsgBytes(b.Bytes())
if err != nil {
return nil, err
}
return msg.Contact, nil
}
func (addr *Addr) String() string { func (addr *Addr) String() string {
var b bytes.Buffer var b bytes.Buffer
addr.Append(&b) addr.Append(&b)


+ 25
- 12
sip/addr_test.go View File

@ -1,6 +1,7 @@
package sip_test package sip_test
import ( import (
"bytes"
"github.com/jart/gosip/sip" "github.com/jart/gosip/sip"
"reflect" "reflect"
"testing" "testing"
@ -35,7 +36,7 @@ var addrTests = []addrTest{
Scheme: "sip", Scheme: "sip",
Host: "pokemon.net", Host: "pokemon.net",
}, },
Param: &sip.Param{"tag", "deadbeef", nil},
Param: &sip.Param{Name: "tag", Value: "deadbeef"},
}, },
}, },
@ -48,7 +49,7 @@ var addrTests = []addrTest{
Scheme: "sip", Scheme: "sip",
Host: "pokemon.net", Host: "pokemon.net",
}, },
Param: &sip.Param{"tag", "deadbeef", nil},
Param: &sip.Param{Name: "tag", Value: "deadbeef"},
}, },
}, },
@ -61,7 +62,7 @@ var addrTests = []addrTest{
Scheme: "sip", Scheme: "sip",
Host: "pokemon.net", Host: "pokemon.net",
}, },
Param: &sip.Param{"tag", "deadbeef", nil},
Param: &sip.Param{Name: "tag", Value: "deadbeef"},
}, },
}, },
@ -74,7 +75,7 @@ var addrTests = []addrTest{
Scheme: "sip", Scheme: "sip",
Host: "pokemon.net", Host: "pokemon.net",
}, },
Param: &sip.Param{"tag", "deadbeef", nil},
Param: &sip.Param{Name: "tag", Value: "deadbeef"},
}, },
}, },
@ -86,7 +87,7 @@ var addrTests = []addrTest{
Scheme: "sip", Scheme: "sip",
Host: "pokemon.net", Host: "pokemon.net",
}, },
Param: &sip.Param{"tag", "\"deadbeef\"", nil},
Param: &sip.Param{Name: "tag", Value: "\"deadbeef\""},
}, },
}, },
@ -98,7 +99,7 @@ var addrTests = []addrTest{
Scheme: "sip", Scheme: "sip",
User: "brave", User: "brave",
Host: "toaster.net", Host: "toaster.net",
Param: &sip.URIParam{"isup-oli", "29", nil},
Param: &sip.URIParam{Name: "isup-oli", Value: "29"},
}, },
}, },
}, },
@ -111,9 +112,9 @@ var addrTests = []addrTest{
Scheme: "sip", Scheme: "sip",
User: "brave", User: "brave",
Host: "toaster.net", Host: "toaster.net",
Param: &sip.URIParam{"isup-oli", "29", nil},
Param: &sip.URIParam{Name: "isup-oli", Value: "29"},
}, },
Param: &sip.Param{"tag", "deadbeef", nil},
Param: &sip.Param{Name: "tag", Value: "deadbeef"},
}, },
}, },
@ -166,16 +167,28 @@ var addrTests = []addrTest{
Scheme: "sip", Scheme: "sip",
User: "jart", User: "jart",
Host: "google.com", Host: "google.com",
Param: &sip.URIParam{"isup-oli", "29", nil},
Param: &sip.URIParam{Name: "isup-oli", Value: "29"},
}, },
Param: &sip.Param{"tag", "deadbeef", nil},
Param: &sip.Param{Name: "tag", Value: "deadbeef"},
}, },
}, },
} }
func TestParseAddr(t *testing.T) {
func ParseAddrBytes(s []byte) (addr *sip.Addr, err error) {
var b bytes.Buffer
b.WriteString("SIP/2.0 900 ParseAddrBytes()\r\nContact:")
b.Write(s)
b.WriteString("\r\n\r\n")
msg, err := sip.ParseMsg(b.Bytes())
if err != nil {
return nil, err
}
return msg.Contact, nil
}
func TestParseAddrBytes(t *testing.T) {
for _, test := range addrTests { for _, test := range addrTests {
addr, err := sip.ParseAddr(test.s)
addr, err := ParseAddrBytes([]byte(test.s))
if err != nil { if err != nil {
if test.err == nil { if test.err == nil {
t.Error(err) t.Error(err)


+ 0
- 29
sip/compact.go View File

@ -1,29 +0,0 @@
// SIP Compact Header Definitions
package sip
func uncompactHeader(k string) string {
if header, ok := compactHeaders[k]; ok {
return header
}
return k
}
// http://www.cs.columbia.edu/sip/compact.html
var compactHeaders = map[string]string{
"a": "Accept-Contact",
"b": "Referred-By",
"c": "Content-Type",
"e": "Content-Encoding",
"f": "From",
"i": "Call-ID",
"k": "Supported",
"l": "Content-Length",
"m": "Contact",
"o": "Event",
"r": "Refer-To",
"s": "Subject",
"t": "To",
"u": "Allow-Events",
"v": "Via",
}

+ 1
- 1
sip/dialog.go View File

@ -373,7 +373,7 @@ func (dls *dialogState) send(msg *Msg) bool {
dls.b.Reset() dls.b.Reset()
msg.Append(&dls.b) msg.Append(&dls.b)
if *tracing { if *tracing {
trace("send", dls.b.String(), dls.sock.RemoteAddr())
trace("send", dls.b.Bytes(), dls.sock.RemoteAddr())
} }
_, err := dls.sock.Write(dls.b.Bytes()) _, err := dls.sock.Write(dls.b.Bytes())
if err != nil { if err != nil {


+ 1
- 1
sip/errors.go View File

@ -10,5 +10,5 @@ type ResponseError struct {
} }
func (err *ResponseError) Error() string { func (err *ResponseError) Error() string {
return fmt.Sprintf("%s: %d", err.Msg.Status, err.Msg.Phrase)
return fmt.Sprintf("%d: %s", err.Msg.Status, err.Msg.Phrase)
} }

+ 189
- 197
sip/msg_parse.go
File diff suppressed because it is too large
View File


+ 1
- 9
sip/msg_parse.rl View File

@ -12,16 +12,8 @@ import (
%% include sip "sip.rl"; %% include sip "sip.rl";
%% write data; %% write data;
// ParseMsg turns a SIP message into a data structure.
func ParseMsg(s string) (msg *Msg, err error) {
if s == "" {
return nil, errors.New("Empty SIP message")
}
return ParseMsgBytes([]byte(s))
}
// ParseMsg turns a SIP message byte slice into a data structure. // ParseMsg turns a SIP message byte slice into a data structure.
func ParseMsgBytes(data []byte) (msg *Msg, err error) {
func ParseMsg(data []byte) (msg *Msg, err error) {
if data == nil { if data == nil {
return nil, nil return nil, nil
} }


+ 56
- 48
sip/msg_test.go View File

@ -44,11 +44,16 @@ type msgTest struct {
name string name string
s string s string
msg sip.Msg msg sip.Msg
err error
e error
} }
var msgTests = []msgTest{ var msgTests = []msgTest{
msgTest{
s: "",
e: sip.MsgIncompleteError{Msg: []uint8{}},
},
msgTest{ msgTest{
name: "UTF8 Phrase", name: "UTF8 Phrase",
s: "SIP/2.0 200 ◕◡◕\r\n" + s: "SIP/2.0 200 ◕◡◕\r\n" +
@ -82,7 +87,7 @@ var msgTests = []msgTest{
VersionMajor: 2, VersionMajor: 2,
Status: 200, Status: 200,
Phrase: "OK", Phrase: "OK",
XHeader: &sip.XHeader{"X-LOL", []byte("omfg"), nil},
XHeader: &sip.XHeader{Name: "X-LOL", Value: []byte("omfg")},
}, },
}, },
@ -154,7 +159,7 @@ var msgTests = []msgTest{
" Come buy, come buy:\r\n" + " Come buy, come buy:\r\n" +
" Apples and quinces,\r\n" + " Apples and quinces,\r\n" +
" Lemons and oranges", " Lemons and oranges",
XHeader: &sip.XHeader{"X-LOL", []byte("omfg"), nil},
XHeader: &sip.XHeader{Name: "X-LOL", Value: []byte("omfg")},
}, },
}, },
@ -364,7 +369,7 @@ var msgTests = []msgTest{
Scheme: "sip", Scheme: "sip",
Host: "lol.com", Host: "lol.com",
}, },
Param: &sip.Param{"tag", "omfg", nil},
Param: &sip.Param{Name: "tag", Value: "omfg"},
}, },
}, },
}, },
@ -384,7 +389,7 @@ var msgTests = []msgTest{
Scheme: "sip", Scheme: "sip",
Host: "lol.com", Host: "lol.com",
}, },
Param: &sip.Param{"tag", "◕◡◕", nil},
Param: &sip.Param{Name: "tag", Value: "◕◡◕"},
}, },
}, },
}, },
@ -403,7 +408,7 @@ var msgTests = []msgTest{
Scheme: "sip", Scheme: "sip",
Host: "lol.com", Host: "lol.com",
}, },
Param: &sip.Param{"tag", "", nil},
Param: &sip.Param{Name: "tag", Value: ""},
}, },
}, },
}, },
@ -422,7 +427,7 @@ var msgTests = []msgTest{
Scheme: "sip", Scheme: "sip",
Host: "lol.com", Host: "lol.com",
}, },
Param: &sip.Param{"tag", "omfg", nil},
Param: &sip.Param{Name: "tag", Value: "omfg"},
}, },
}, },
}, },
@ -603,7 +608,7 @@ var msgTests = []msgTest{
Version: "2.0", Version: "2.0",
Transport: "TCP", Transport: "TCP",
Host: "spindle.example.com", Host: "spindle.example.com",
Param: &sip.Param{"branch", "z9hG4bK9ikj8", nil},
Param: &sip.Param{Name: "branch", Value: "z9hG4bK9ikj8"},
}, },
}, },
}, },
@ -623,7 +628,7 @@ var msgTests = []msgTest{
Version: "2.0", Version: "2.0",
Transport: "TCP", Transport: "TCP",
Host: "spindle.example.com", Host: "spindle.example.com",
Param: &sip.Param{"branch", "z9hG4bK9ikj8", nil},
Param: &sip.Param{Name: "branch", Value: "z9hG4bK9ikj8"},
}, },
}, },
}, },
@ -648,19 +653,19 @@ var msgTests = []msgTest{
Version: "2.0", Version: "2.0",
Transport: "UDP", Transport: "UDP",
Host: "192.0.2.2", Host: "192.0.2.2",
Param: &sip.Param{"branch", "390skdjuw", nil},
Param: &sip.Param{Name: "branch", Value: "390skdjuw"},
Next: &sip.Via{ Next: &sip.Via{
Protocol: "SIP", Protocol: "SIP",
Version: "2.0", Version: "2.0",
Transport: "TCP", Transport: "TCP",
Host: "spindle.example.com", Host: "spindle.example.com",
Param: &sip.Param{"branch", "z9hG4bK9ikj8", nil},
Param: &sip.Param{Name: "branch", Value: "z9hG4bK9ikj8"},
Next: &sip.Via{ Next: &sip.Via{
Protocol: "SIP", Protocol: "SIP",
Version: "2.0", Version: "2.0",
Transport: "UDP", Transport: "UDP",
Host: "192.168.255.111", Host: "192.168.255.111",
Param: &sip.Param{"branch", "z9hG4bK30239", nil},
Param: &sip.Param{Name: "branch", Value: "z9hG4bK30239"},
}, },
}, },
}, },
@ -699,7 +704,11 @@ var msgTests = []msgTest{
Transport: "UDP", Transport: "UDP",
Host: "10.11.34.37", Host: "10.11.34.37",
Port: 42367, Port: 42367,
Param: &sip.Param{"branch", "9dc39c3c3e84", &sip.Param{"rport", "", nil}},
Param: &sip.Param{
Name: "branch",
Value: "9dc39c3c3e84",
Next: &sip.Param{Name: "rport"},
},
}, },
To: &sip.Addr{ To: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -713,9 +722,9 @@ var msgTests = []msgTest{
Scheme: "sip", Scheme: "sip",
Host: "10.11.34.37", Host: "10.11.34.37",
Port: 42367, Port: 42367,
Param: &sip.URIParam{"laffo", "", nil},
Param: &sip.URIParam{Name: "laffo"},
}, },
Param: &sip.Param{"tag", "11917cbc0513", nil},
Param: &sip.Param{Name: "tag", Value: "11917cbc0513"},
}, },
Contact: &sip.Addr{ Contact: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -789,9 +798,9 @@ var msgTests = []msgTest{
Scheme: "sip", Scheme: "sip",
Host: "127.0.0.1", Host: "127.0.0.1",
Port: 52711, Port: 52711,
Param: &sip.URIParam{"transport", "udp", nil},
Param: &sip.URIParam{Name: "transport", Value: "udp"},
}, },
Param: &sip.Param{"tag", "4568e274dbd8", nil},
Param: &sip.Param{Name: "tag", Value: "4568e274dbd8"},
}, },
To: &sip.Addr{ To: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -800,7 +809,7 @@ var msgTests = []msgTest{
Host: "127.0.0.1", Host: "127.0.0.1",
Port: 5060, Port: 5060,
}, },
Param: &sip.Param{"tag", "as71a0fa72", nil},
Param: &sip.Param{Name: "tag", Value: "as71a0fa72"},
}, },
Contact: &sip.Addr{ Contact: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -844,7 +853,7 @@ var msgTests = []msgTest{
Transport: "UDP", Transport: "UDP",
Host: "1.2.3.4", Host: "1.2.3.4",
Port: 55345, Port: 55345,
Param: &sip.Param{"branch", "z9hG4bK-d1d81e94a099", nil},
Param: &sip.Param{Name: "branch", Value: "z9hG4bK-d1d81e94a099"},
}, },
From: &sip.Addr{ From: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -852,7 +861,7 @@ var msgTests = []msgTest{
User: "+12126660420", User: "+12126660420",
Host: "fl.gg", Host: "fl.gg",
}, },
Param: &sip.Param{"tag", "68e274dbd83b", nil},
Param: &sip.Param{Name: "tag", Value: "68e274dbd83b"},
}, },
To: &sip.Addr{ To: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -860,7 +869,7 @@ var msgTests = []msgTest{
User: "+12125650666", User: "+12125650666",
Host: "fl.gg", Host: "fl.gg",
}, },
Param: &sip.Param{"tag", "gK0cacc73a", nil},
Param: &sip.Param{Name: "tag", Value: "gK0cacc73a"},
}, },
Contact: &sip.Addr{ Contact: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -875,14 +884,14 @@ var msgTests = []msgTest{
Scheme: "sip", Scheme: "sip",
Host: "216.115.69.133", Host: "216.115.69.133",
Port: 5060, Port: 5060,
Param: &sip.URIParam{"lr", "", nil},
Param: &sip.URIParam{Name: "lr"},
}, },
Next: &sip.Addr{ Next: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
Scheme: "sip", Scheme: "sip",
Host: "216.115.69.144", Host: "216.115.69.144",
Port: 5060, Port: 5060,
Param: &sip.URIParam{"lr", "", nil},
Param: &sip.URIParam{Name: "lr"},
}, },
}, },
}, },
@ -948,7 +957,11 @@ var msgTests = []msgTest{
Transport: "UDP", Transport: "UDP",
Host: "10.11.34.37", Host: "10.11.34.37",
Port: 59516, Port: 59516,
Param: &sip.Param{"branch", "z9hG4bKS308QB9UUpNyD", &sip.Param{"rport", "", nil}},
Param: &sip.Param{
Name: "branch",
Value: "z9hG4bKS308QB9UUpNyD",
Next: &sip.Param{Name: "rport"},
},
}, },
To: &sip.Addr{ To: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -962,7 +975,7 @@ var msgTests = []msgTest{
Host: "10.11.34.37", Host: "10.11.34.37",
Port: 59516, Port: 59516,
}, },
Param: &sip.Param{"tag", "S1jX7UtK5Zerg", nil},
Param: &sip.Param{Name: "tag", Value: "S1jX7UtK5Zerg"},
}, },
Contact: &sip.Addr{ Contact: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -1045,7 +1058,7 @@ var msgTests = []msgTest{
Scheme: "sip", Scheme: "sip",
User: "vivekg", User: "vivekg",
Host: "chair-dnrc.example.com", Host: "chair-dnrc.example.com",
Param: &sip.URIParam{"unknownparam", "", nil},
Param: &sip.URIParam{Name: "unknownparam"},
}, },
To: &sip.Addr{ To: &sip.Addr{
Uri: &sip.URI{ Uri: &sip.URI{
@ -1053,7 +1066,7 @@ var msgTests = []msgTest{
User: "vivekg", User: "vivekg",
Host: "chair-dnrc.example.com", Host: "chair-dnrc.example.com",
}, },
Param: &sip.Param{"tag", "1918181833n", nil},
Param: &sip.Param{Name: "tag", Value: "1918181833n"},
}, },
From: &sip.Addr{ From: &sip.Addr{
Display: "J Rosenberg \\\"", Display: "J Rosenberg \\\"",
@ -1062,7 +1075,7 @@ var msgTests = []msgTest{
User: "jdrosen", User: "jdrosen",
Host: "example.com", Host: "example.com",
}, },
Param: &sip.Param{"tag", "98asjd8", nil},
Param: &sip.Param{Name: "tag", Value: "98asjd8"},
}, },
MaxForwards: 68, MaxForwards: 68,
CallID: "wsinv.ndaksdj@192.0.2.1", CallID: "wsinv.ndaksdj@192.0.2.1",
@ -1073,19 +1086,19 @@ var msgTests = []msgTest{
Version: "2.0", Version: "2.0",
Transport: "UDP", Transport: "UDP",
Host: "192.0.2.2", Host: "192.0.2.2",
Param: &sip.Param{"branch", "390skdjuw", nil},
Param: &sip.Param{Name: "branch", Value: "390skdjuw"},
Next: &sip.Via{ Next: &sip.Via{
Protocol: "SIP", Protocol: "SIP",
Version: "2.0", Version: "2.0",
Transport: "TCP", Transport: "TCP",
Host: "spindle.example.com", Host: "spindle.example.com",
Param: &sip.Param{"branch", "z9hG4bK9ikj8", nil},
Param: &sip.Param{Name: "branch", Value: "z9hG4bK9ikj8"},
Next: &sip.Via{ Next: &sip.Via{
Protocol: "SIP", Protocol: "SIP",
Version: "2.0", Version: "2.0",
Transport: "UDP", Transport: "UDP",
Host: "192.168.255.111", Host: "192.168.255.111",
Param: &sip.Param{"branch", "z9hG4bK30239", nil},
Param: &sip.Param{Name: "branch", Value: "z9hG4bK30239"},
}, },
}, },
}, },
@ -1103,15 +1116,11 @@ var msgTests = []msgTest{
Scheme: "sip", Scheme: "sip",
Host: "services.example.com", Host: "services.example.com",
Param: &sip.URIParam{ Param: &sip.URIParam{
Name: "unknown-no-value",
Value: "",
Name: "unknown-no-value",
Next: &sip.URIParam{ Next: &sip.URIParam{
Name: "unknownwith", Name: "unknownwith",
Value: "value", Value: "value",
Next: &sip.URIParam{
Name: "lr",
Value: "",
},
Next: &sip.URIParam{Name: "lr"},
}, },
}, },
}, },
@ -1127,8 +1136,7 @@ var msgTests = []msgTest{
Name: "q", Name: "q",
Value: "0.33", Value: "0.33",
Next: &sip.Param{ Next: &sip.Param{
Name: "secondparam",
Value: "",
Name: "secondparam",
Next: &sip.Param{ Next: &sip.Param{
Name: "newparam", Name: "newparam",
Value: "newvalue", Value: "newvalue",
@ -1171,7 +1179,7 @@ var msgTests = []msgTest{
Version: "2.0", Version: "2.0",
Transport: "TCP", Transport: "TCP",
Host: "host1.example.com", Host: "host1.example.com",
Param: &sip.Param{"branch", "z9hG4bK-.!%66*_+`'~", nil},
Param: &sip.Param{Name: "branch", Value: "z9hG4bK-.!%66*_+`'~"},
}, },
To: &sip.Addr{ To: &sip.Addr{
Display: "BEL:\x07 NUL:\x00 DEL:\x7F", Display: "BEL:\x07 NUL:\x00 DEL:\x7F",
@ -1207,13 +1215,16 @@ var msgTests = []msgTest{
func TestParseMsg(t *testing.T) { func TestParseMsg(t *testing.T) {
for _, test := range msgTests { for _, test := range msgTests {
msg, err := sip.ParseMsg(test.s)
msg, err := sip.ParseMsg([]byte(test.s))
if err != nil { if err != nil {
if test.err == nil {
if test.e == nil {
t.Errorf("%v", err) t.Errorf("%v", err)
continue continue
} else { // test was supposed to fail } else { // test was supposed to fail
panic("TODO(jart): Implement failing support.")
if !reflect.DeepEqual(test.e, err) {
t.Errorf("%s\nWant: %#v\nGot: %#v", test.s, test.e, err)
}
continue
} }
} }
if !reflect.DeepEqual(&test.msg, msg) { if !reflect.DeepEqual(&test.msg, msg) {
@ -1226,9 +1237,6 @@ func TestParseMsg(t *testing.T) {
} }
if !reflect.DeepEqual(test.msg.Via, msg.Via) { if !reflect.DeepEqual(test.msg.Via, msg.Via) {
t.Errorf("Via:\n%#v !=\n%#v", test.msg.Via, msg.Via) t.Errorf("Via:\n%#v !=\n%#v", test.msg.Via, msg.Via)
// t.Errorf("Via #2:\n%#v !=\n%#v", test.msg.Via.Next, msg.Via.Next)
// t.Errorf("Via #3:\n%#v !=\n%#v", test.msg.Via.Next.Next, msg.Via.Next.Next)
// t.Errorf("Via #4:\n%#v !=\n%#v", test.msg.Via.Next.Next.Next, msg.Via.Next.Next.Next)
} }
if !reflect.DeepEqual(test.msg.Request, msg.Request) { if !reflect.DeepEqual(test.msg.Request, msg.Request) {
t.Errorf("Request:\n%#v !=\n%#v", test.msg.Request, msg.Request) t.Errorf("Request:\n%#v !=\n%#v", test.msg.Request, msg.Request)
@ -1252,13 +1260,13 @@ func TestParseMsg(t *testing.T) {
func BenchmarkParseMsgFlowroute(b *testing.B) { // 26653 ns/op func BenchmarkParseMsgFlowroute(b *testing.B) { // 26653 ns/op
msg := []byte(flowroute) msg := []byte(flowroute)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
sip.ParseMsgBytes(msg)
sip.ParseMsg(msg)
} }
} }
func BenchmarkParseMsgTorture2(b *testing.B) { // 31397 ns/op func BenchmarkParseMsgTorture2(b *testing.B) { // 31397 ns/op
msg := []byte(torture2) msg := []byte(torture2)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
sip.ParseMsgBytes(msg)
sip.ParseMsg(msg)
} }
} }

+ 1
- 1
sip/receiver.go View File

@ -19,7 +19,7 @@ func ReceiveMessages(sock *net.UDPConn, c chan<- *Msg, e chan<- error) {
break break
} }
ts := time.Now() ts := time.Now()
packet := string(buf[0:amt])
packet := buf[0:amt]
if *tracing { if *tracing {
trace("recv", packet, addr) trace("recv", packet, addr)
} }


+ 1
- 1
sip/route.go View File

@ -108,7 +108,7 @@ func RouteAddress(host string, port uint16, wantSRV bool) (routes *AddressRoute,
log.Printf("%s routes to: %s", host, s) log.Printf("%s routes to: %s", host, s)
return routes, nil return routes, nil
} }
log.Println("net.LookupSRV(sip, udp, %s) failed: %s", err)
log.Printf("net.LookupSRV(sip, udp, %s) failed: %s", host, err)
} }
port = 5060 port = 5060
} }


+ 2
- 2
sip/sip.rl View File

@ -109,7 +109,7 @@ action VersionMinor {
} }
action RequestURI { action RequestURI {
msg.Request, err = ParseURIBytes(data[mark:p])
msg.Request, err = ParseURI(data[mark:p])
if err != nil { return nil, err } if err != nil { return nil, err }
} }
@ -190,7 +190,7 @@ action AddrUnquotedDisplay {{
}} }}
action AddrUri { action AddrUri {
addr.Uri, err = ParseURIBytes(data[mark:p])
addr.Uri, err = ParseURI(data[mark:p])
if err != nil { return nil, err } if err != nil { return nil, err }
} }


+ 2
- 2
sip/trace.go View File

@ -12,11 +12,11 @@ var (
timestampTagging = flag.Bool("timestampTagging", false, "Add microsecond timestamps to Via tags") timestampTagging = flag.Bool("timestampTagging", false, "Add microsecond timestamps to Via tags")
) )
func trace(dir, pkt string, addr net.Addr) {
func trace(dir string, pkt []byte, addr net.Addr) {
size := len(pkt) size := len(pkt)
bar := strings.Repeat("-", 72) bar := strings.Repeat("-", 72)
suffix := "\n" suffix := "\n"
if pkt != "" && pkt[len(pkt)-1] == '\n' {
if pkt != nil && len(pkt) > 0 && pkt[len(pkt)-1] == '\n' {
suffix = "" suffix = ""
} }
log.Printf( log.Printf(


+ 1
- 1
sip/transport.go View File

@ -73,7 +73,7 @@ func (tp *Transport) Send(msg *Msg) error {
var b bytes.Buffer var b bytes.Buffer
msg.Append(&b) msg.Append(&b)
if *tracing { if *tracing {
trace("send", b.String(), addr)
trace("send", b.Bytes(), addr)
} }
_, err = tp.Sock.WriteTo(b.Bytes(), addr) _, err = tp.Sock.WriteTo(b.Bytes(), addr)
if err != nil { if err != nil {


+ 199
- 208
sip/uri_parse.go
File diff suppressed because it is too large
View File


+ 1
- 18
sip/uri_parse.rl View File

@ -11,16 +11,8 @@ import (
%% machine uri; %% machine uri;
%% write data; %% write data;
// ParseURI turns a a SIP URI into a data structure.
func ParseURI(s string) (uri *URI, err error) {
if s == "" {
return nil, errors.New("Empty URI")
}
return ParseURIBytes([]byte(s))
}
// ParseURI turns a a SIP URI byte slice into a data structure. // ParseURI turns a a SIP URI byte slice into a data structure.
func ParseURIBytes(data []byte) (uri *URI, err error) {
func ParseURI(data []byte) (uri *URI, err error) {
if data == nil { if data == nil {
return nil, nil return nil, nil
} }
@ -31,19 +23,10 @@ func ParseURIBytes(data []byte) (uri *URI, err error) {
eof := len(data) eof := len(data)
buf := make([]byte, len(data)) buf := make([]byte, len(data))
amt := 0 amt := 0
// mark := 0
var b1, b2 string var b1, b2 string
var hex byte var hex byte
%%{ %%{
action mark {
mark = p
}
action backtrack {
fexec mark;
}
action start { action start {
amt = 0 amt = 0
} }


+ 14
- 7
sip/uri_test.go View File

@ -18,7 +18,7 @@ var uriTests = []uriTest{
uriTest{ uriTest{
s: "", s: "",
e: errors.New("Empty URI"),
e: errors.New("Incomplete URI: "),
}, },
uriTest{ uriTest{
@ -127,7 +127,7 @@ var uriTests = []uriTest{
Pass: "priceisright", Pass: "priceisright",
Host: "dead:beef::666", Host: "dead:beef::666",
Port: 5060, Port: 5060,
Param: &sip.URIParam{"isup-oli", "00", nil},
Param: &sip.URIParam{Name: "isup-oli", Value: "00"},
}, },
}, },
@ -151,7 +151,14 @@ var uriTests = []uriTest{
Scheme: "sips", Scheme: "sips",
User: "alice", User: "alice",
Host: "atlanta.com", Host: "atlanta.com",
Header: &sip.URIHeader{"subject", "project x", &sip.URIHeader{"priority", "urgent", nil}},
Header: &sip.URIHeader{
Name: "subject",
Value: "project x",
Next: &sip.URIHeader{
Name: "priority",
Value: "urgent",
},
},
}, },
}, },
@ -162,7 +169,7 @@ var uriTests = []uriTest{
User: "+1-212-555-1212", User: "+1-212-555-1212",
Pass: "1234", Pass: "1234",
Host: "gateway.com", Host: "gateway.com",
Param: &sip.URIParam{"user", "phone", nil},
Param: &sip.URIParam{Name: "user", Value: "phone"},
}, },
}, },
@ -171,8 +178,8 @@ var uriTests = []uriTest{
uri: &sip.URI{ uri: &sip.URI{
Scheme: "sip", Scheme: "sip",
Host: "atlanta.com", Host: "atlanta.com",
Param: &sip.URIParam{"method", "register", nil},
Header: &sip.URIHeader{"to", "alice@atlanta.com", nil},
Param: &sip.URIParam{Name: "method", Value: "register"},
Header: &sip.URIHeader{Name: "to", Value: "alice@atlanta.com"},
}, },
}, },
@ -189,7 +196,7 @@ var uriTests = []uriTest{
func TestParseURI(t *testing.T) { func TestParseURI(t *testing.T) {
for _, test := range uriTests { for _, test := range uriTests {
uri, err := sip.ParseURI(test.s)
uri, err := sip.ParseURI([]byte(test.s))
if err != nil { if err != nil {
if !reflect.DeepEqual(test.e, err) { if !reflect.DeepEqual(test.e, err) {
t.Errorf("%s\nWant: %#v\nGot: %#v", test.s, test.e, err) t.Errorf("%s\nWant: %#v\nGot: %#v", test.s, test.e, err)


+ 15
- 41
util/util.go View File

@ -9,77 +9,51 @@ import (
"syscall" "syscall"
) )
// Returns true if error is an i/o timeout.
func IsTimeout(err error) bool {
operr, ok := err.(*net.OpError)
return ok && operr.Timeout()
}
// Returns true if error is ICMP connection refused.
// Return true if error is ICMP connection refused.
func IsRefused(err error) bool { func IsRefused(err error) bool {
operr, ok := err.(*net.OpError) operr, ok := err.(*net.OpError)
return ok && operr.Err == syscall.ECONNREFUSED return ok && operr.Err == syscall.ECONNREFUSED
} }
// Returns true if error was caused by reading from a closed socket.
// Return true if error was caused by reading from a closed socket.
func IsUseOfClosed(err error) bool { func IsUseOfClosed(err error) bool {
return strings.Contains(err.Error(), "use of closed network connection") return strings.Contains(err.Error(), "use of closed network connection")
} }
// Returns true if IP contains a colon.
// Return true if IP contains a colon.
func IsIPv6(ip string) bool { func IsIPv6(ip string) bool {
n := strings.Index(ip, ":")
return n >= 0
}
// Returns true if IPv4 and is a LAN address as defined by RFC 1918.
func IsIPPrivate(ip net.IP) bool {
if ip != nil {
ip = ip.To4()
if ip != nil {
switch ip[0] {
case 10:
return true
case 172:
if ip[1] >= 16 && ip[1] <= 31 {
return true
}
case 192:
if ip[1] == 168 {
return true
}
}
}
}
return false
return strings.Index(ip, ":") >= 0
} }
// Generates a secure random number between 0 and 50,000.
// Generate a secure random number between 0 and 50,000.
func GenerateCSeq() int { func GenerateCSeq() int {
return rand.Int() % 50000 return rand.Int() % 50000
} }
// Generates a 48-bit secure random string like: 27c97271d363.
// Generate a 48-bit secure random string like: 27c97271d363.
func GenerateTag() string { func GenerateTag() string {
return hex.EncodeToString(randomBytes(6)) return hex.EncodeToString(randomBytes(6))
} }
// This is used in the Via tag. Probably not suitable for use by stateless
// proxies.
// Generate a SIP 2.0 Via branch ID. This is probably not suitable for use by
// stateless proxies.
func GenerateBranch() string { func GenerateBranch() string {
return "z9hG4bK-" + GenerateTag() return "z9hG4bK-" + GenerateTag()
} }
// Generates a secure UUID4, e.g.f47ac10b-58cc-4372-a567-0e02b2c3d479
// Generate a secure UUID4, e.g.f47ac10b-58cc-4372-a567-0e02b2c3d479
func GenerateCallID() string { func GenerateCallID() string {
lol := randomBytes(15) lol := randomBytes(15)
digs := hex.EncodeToString(lol) digs := hex.EncodeToString(lol)
uuid4 := digs[0:8] + "-" + digs[8:12] + "-4" + digs[12:15] +
"-a" + digs[15:18] + "-" + digs[18:]
uuid4 := digs[0:8] +
"-" + digs[8:12] +
"-4" + digs[12:15] +
"-a" + digs[15:18] +
"-" + digs[18:]
return uuid4 return uuid4
} }
// Generates a random ID for an SDP.
// Generate a random ID for an SDP.
func GenerateOriginID() string { func GenerateOriginID() string {
return strconv.FormatUint(uint64(rand.Uint32()), 10) return strconv.FormatUint(uint64(rand.Uint32()), 10)
} }


Loading…
Cancel
Save