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


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

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


+ 25
- 12
sip/addr_test.go View File

@ -1,6 +1,7 @@
package sip_test
import (
"bytes"
"github.com/jart/gosip/sip"
"reflect"
"testing"
@ -35,7 +36,7 @@ var addrTests = []addrTest{
Scheme: "sip",
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",
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",
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",
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",
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",
User: "brave",
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",
User: "brave",
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",
User: "jart",
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 {
addr, err := sip.ParseAddr(test.s)
addr, err := ParseAddrBytes([]byte(test.s))
if err != nil {
if test.err == nil {
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()
msg.Append(&dls.b)
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())
if err != nil {


+ 1
- 1
sip/errors.go View File

@ -10,5 +10,5 @@ type ResponseError struct {
}
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";
%% 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.
func ParseMsgBytes(data []byte) (msg *Msg, err error) {
func ParseMsg(data []byte) (msg *Msg, err error) {
if data == nil {
return nil, nil
}


+ 56
- 48
sip/msg_test.go View File

@ -44,11 +44,16 @@ type msgTest struct {
name string
s string
msg sip.Msg
err error
e error
}
var msgTests = []msgTest{
msgTest{
s: "",
e: sip.MsgIncompleteError{Msg: []uint8{}},
},
msgTest{
name: "UTF8 Phrase",
s: "SIP/2.0 200 ◕◡◕\r\n" +
@ -82,7 +87,7 @@ var msgTests = []msgTest{
VersionMajor: 2,
Status: 200,
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" +
" Apples and quinces,\r\n" +
" 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",
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",
Host: "lol.com",
},
Param: &sip.Param{"tag", "◕◡◕", nil},
Param: &sip.Param{Name: "tag", Value: "◕◡◕"},
},
},
},
@ -403,7 +408,7 @@ var msgTests = []msgTest{
Scheme: "sip",
Host: "lol.com",
},
Param: &sip.Param{"tag", "", nil},
Param: &sip.Param{Name: "tag", Value: ""},
},
},
},
@ -422,7 +427,7 @@ var msgTests = []msgTest{
Scheme: "sip",
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",
Transport: "TCP",
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",
Transport: "TCP",
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",
Transport: "UDP",
Host: "192.0.2.2",
Param: &sip.Param{"branch", "390skdjuw", nil},
Param: &sip.Param{Name: "branch", Value: "390skdjuw"},
Next: &sip.Via{
Protocol: "SIP",
Version: "2.0",
Transport: "TCP",
Host: "spindle.example.com",
Param: &sip.Param{"branch", "z9hG4bK9ikj8", nil},
Param: &sip.Param{Name: "branch", Value: "z9hG4bK9ikj8"},
Next: &sip.Via{
Protocol: "SIP",
Version: "2.0",
Transport: "UDP",
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",
Host: "10.11.34.37",
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{
Uri: &sip.URI{
@ -713,9 +722,9 @@ var msgTests = []msgTest{
Scheme: "sip",
Host: "10.11.34.37",
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{
Uri: &sip.URI{
@ -789,9 +798,9 @@ var msgTests = []msgTest{
Scheme: "sip",
Host: "127.0.0.1",
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{
Uri: &sip.URI{
@ -800,7 +809,7 @@ var msgTests = []msgTest{
Host: "127.0.0.1",
Port: 5060,
},
Param: &sip.Param{"tag", "as71a0fa72", nil},
Param: &sip.Param{Name: "tag", Value: "as71a0fa72"},
},
Contact: &sip.Addr{
Uri: &sip.URI{
@ -844,7 +853,7 @@ var msgTests = []msgTest{
Transport: "UDP",
Host: "1.2.3.4",
Port: 55345,
Param: &sip.Param{"branch", "z9hG4bK-d1d81e94a099", nil},
Param: &sip.Param{Name: "branch", Value: "z9hG4bK-d1d81e94a099"},
},
From: &sip.Addr{
Uri: &sip.URI{
@ -852,7 +861,7 @@ var msgTests = []msgTest{
User: "+12126660420",
Host: "fl.gg",
},
Param: &sip.Param{"tag", "68e274dbd83b", nil},
Param: &sip.Param{Name: "tag", Value: "68e274dbd83b"},
},
To: &sip.Addr{
Uri: &sip.URI{
@ -860,7 +869,7 @@ var msgTests = []msgTest{
User: "+12125650666",
Host: "fl.gg",
},
Param: &sip.Param{"tag", "gK0cacc73a", nil},
Param: &sip.Param{Name: "tag", Value: "gK0cacc73a"},
},
Contact: &sip.Addr{
Uri: &sip.URI{
@ -875,14 +884,14 @@ var msgTests = []msgTest{
Scheme: "sip",
Host: "216.115.69.133",
Port: 5060,
Param: &sip.URIParam{"lr", "", nil},
Param: &sip.URIParam{Name: "lr"},
},
Next: &sip.Addr{
Uri: &sip.URI{
Scheme: "sip",
Host: "216.115.69.144",
Port: 5060,
Param: &sip.URIParam{"lr", "", nil},
Param: &sip.URIParam{Name: "lr"},
},
},
},
@ -948,7 +957,11 @@ var msgTests = []msgTest{
Transport: "UDP",
Host: "10.11.34.37",
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{
Uri: &sip.URI{
@ -962,7 +975,7 @@ var msgTests = []msgTest{
Host: "10.11.34.37",
Port: 59516,
},
Param: &sip.Param{"tag", "S1jX7UtK5Zerg", nil},
Param: &sip.Param{Name: "tag", Value: "S1jX7UtK5Zerg"},
},
Contact: &sip.Addr{
Uri: &sip.URI{
@ -1045,7 +1058,7 @@ var msgTests = []msgTest{
Scheme: "sip",
User: "vivekg",
Host: "chair-dnrc.example.com",
Param: &sip.URIParam{"unknownparam", "", nil},
Param: &sip.URIParam{Name: "unknownparam"},
},
To: &sip.Addr{
Uri: &sip.URI{
@ -1053,7 +1066,7 @@ var msgTests = []msgTest{
User: "vivekg",
Host: "chair-dnrc.example.com",
},
Param: &sip.Param{"tag", "1918181833n", nil},
Param: &sip.Param{Name: "tag", Value: "1918181833n"},
},
From: &sip.Addr{
Display: "J Rosenberg \\\"",
@ -1062,7 +1075,7 @@ var msgTests = []msgTest{
User: "jdrosen",
Host: "example.com",
},
Param: &sip.Param{"tag", "98asjd8", nil},
Param: &sip.Param{Name: "tag", Value: "98asjd8"},
},
MaxForwards: 68,
CallID: "wsinv.ndaksdj@192.0.2.1",
@ -1073,19 +1086,19 @@ var msgTests = []msgTest{
Version: "2.0",
Transport: "UDP",
Host: "192.0.2.2",
Param: &sip.Param{"branch", "390skdjuw", nil},
Param: &sip.Param{Name: "branch", Value: "390skdjuw"},
Next: &sip.Via{
Protocol: "SIP",
Version: "2.0",
Transport: "TCP",
Host: "spindle.example.com",
Param: &sip.Param{"branch", "z9hG4bK9ikj8", nil},
Param: &sip.Param{Name: "branch", Value: "z9hG4bK9ikj8"},
Next: &sip.Via{
Protocol: "SIP",
Version: "2.0",
Transport: "UDP",
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",
Host: "services.example.com",
Param: &sip.URIParam{
Name: "unknown-no-value",
Value: "",
Name: "unknown-no-value",
Next: &sip.URIParam{
Name: "unknownwith",
Value: "value",
Next: &sip.URIParam{
Name: "lr",
Value: "",
},
Next: &sip.URIParam{Name: "lr"},
},
},
},
@ -1127,8 +1136,7 @@ var msgTests = []msgTest{
Name: "q",
Value: "0.33",
Next: &sip.Param{
Name: "secondparam",
Value: "",
Name: "secondparam",
Next: &sip.Param{
Name: "newparam",
Value: "newvalue",
@ -1171,7 +1179,7 @@ var msgTests = []msgTest{
Version: "2.0",
Transport: "TCP",
Host: "host1.example.com",
Param: &sip.Param{"branch", "z9hG4bK-.!%66*_+`'~", nil},
Param: &sip.Param{Name: "branch", Value: "z9hG4bK-.!%66*_+`'~"},
},
To: &sip.Addr{
Display: "BEL:\x07 NUL:\x00 DEL:\x7F",
@ -1207,13 +1215,16 @@ var msgTests = []msgTest{
func TestParseMsg(t *testing.T) {
for _, test := range msgTests {
msg, err := sip.ParseMsg(test.s)
msg, err := sip.ParseMsg([]byte(test.s))
if err != nil {
if test.err == nil {
if test.e == nil {
t.Errorf("%v", err)
continue
} 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) {
@ -1226,9 +1237,6 @@ func TestParseMsg(t *testing.T) {
}
if !reflect.DeepEqual(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) {
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
msg := []byte(flowroute)
for i := 0; i < b.N; i++ {
sip.ParseMsgBytes(msg)
sip.ParseMsg(msg)
}
}
func BenchmarkParseMsgTorture2(b *testing.B) { // 31397 ns/op
msg := []byte(torture2)
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
}
ts := time.Now()
packet := string(buf[0:amt])
packet := buf[0:amt]
if *tracing {
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)
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
}


+ 2
- 2
sip/sip.rl View File

@ -109,7 +109,7 @@ action VersionMinor {
}
action RequestURI {
msg.Request, err = ParseURIBytes(data[mark:p])
msg.Request, err = ParseURI(data[mark:p])
if err != nil { return nil, err }
}
@ -190,7 +190,7 @@ action AddrUnquotedDisplay {{
}}
action AddrUri {
addr.Uri, err = ParseURIBytes(data[mark:p])
addr.Uri, err = ParseURI(data[mark:p])
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")
)
func trace(dir, pkt string, addr net.Addr) {
func trace(dir string, pkt []byte, addr net.Addr) {
size := len(pkt)
bar := strings.Repeat("-", 72)
suffix := "\n"
if pkt != "" && pkt[len(pkt)-1] == '\n' {
if pkt != nil && len(pkt) > 0 && pkt[len(pkt)-1] == '\n' {
suffix = ""
}
log.Printf(


+ 1
- 1
sip/transport.go View File

@ -73,7 +73,7 @@ func (tp *Transport) Send(msg *Msg) error {
var b bytes.Buffer
msg.Append(&b)
if *tracing {
trace("send", b.String(), addr)
trace("send", b.Bytes(), addr)
}
_, err = tp.Sock.WriteTo(b.Bytes(), addr)
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;
%% 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.
func ParseURIBytes(data []byte) (uri *URI, err error) {
func ParseURI(data []byte) (uri *URI, err error) {
if data == nil {
return nil, nil
}
@ -31,19 +23,10 @@ func ParseURIBytes(data []byte) (uri *URI, err error) {
eof := len(data)
buf := make([]byte, len(data))
amt := 0
// mark := 0
var b1, b2 string
var hex byte
%%{
action mark {
mark = p
}
action backtrack {
fexec mark;
}
action start {
amt = 0
}


+ 14
- 7
sip/uri_test.go View File

@ -18,7 +18,7 @@ var uriTests = []uriTest{
uriTest{
s: "",
e: errors.New("Empty URI"),
e: errors.New("Incomplete URI: "),
},
uriTest{
@ -127,7 +127,7 @@ var uriTests = []uriTest{
Pass: "priceisright",
Host: "dead:beef::666",
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",
User: "alice",
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",
Pass: "1234",
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{
Scheme: "sip",
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) {
for _, test := range uriTests {
uri, err := sip.ParseURI(test.s)
uri, err := sip.ParseURI([]byte(test.s))
if err != nil {
if !reflect.DeepEqual(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"
)
// 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 {
operr, ok := err.(*net.OpError)
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 {
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 {
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 {
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 {
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 {
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 {
lol := randomBytes(15)
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
}
// Generates a random ID for an SDP.
// Generate a random ID for an SDP.
func GenerateOriginID() string {
return strconv.FormatUint(uint64(rand.Uint32()), 10)
}


Loading…
Cancel
Save