Browse Source

UTF8 validation and SIP extension headers.

pull/2/head
Justine Alexandra Roberts Tunney 11 years ago
parent
commit
86a582068a
3 changed files with 6259 additions and 4136 deletions
  1. +6221
    -4123
      sip/msg_parse.go
  2. +20
    -7
      sip/msg_parse.rl
  3. +18
    -6
      sip/msg_test.go

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


+ 20
- 7
sip/msg_parse.rl View File

@ -3,6 +3,7 @@
package sip package sip
import ( import (
"bytes"
"errors" "errors"
"fmt" "fmt"
"github.com/jart/gosip/sdp" "github.com/jart/gosip/sdp"
@ -32,7 +33,7 @@ func ParseMsgBytes(data []byte) (msg *Msg, err error) {
cs := 0 cs := 0
p := 0 p := 0
pe := len(data) pe := len(data)
//eof := len(data)
eof := len(data)
//stack := make([]int, 2) //stack := make([]int, 2)
//top := 0 //top := 0
line := 1 line := 1
@ -120,15 +121,22 @@ func ParseMsgBytes(data []byte) (msg *Msg, err error) {
fgoto svalue; fgoto svalue;
} }
action svalueDone {
action svalueDone {{
b := data[mark:p - 1]
if dest != nil { if dest != nil {
*dest = string(data[mark:p - 1])
*dest = string(b)
} else { } else {
if msg.Headers == nil { if msg.Headers == nil {
msg.Headers = Headers{} msg.Headers = Headers{}
} }
msg.Headers[b1] = string(data[mark:p])
msg.Headers[b1] = string(b)
} }
}}
action xheader {
dest = nil;
fhold;
fgoto xheader;
} }
action CallID { action CallID {
@ -218,7 +226,12 @@ func ParseMsgBytes(data []byte) (msg *Msg, err error) {
WSP = SP | HTAB; WSP = SP | HTAB;
LWS = ( WSP* ( CR when lookAheadWSP ) LF )? WSP+; LWS = ( WSP* ( CR when lookAheadWSP ) LF )? WSP+;
SWS = LWS?; SWS = LWS?;
UTF8_NONASCII = 0x80..0xFD;
UTF8_CONT = 0x80..0xBF;
UTF8_NONASCII = 0xC0..0xDF UTF8_CONT {1}
| 0xE0..0xEF UTF8_CONT {2}
| 0xF0..0xF7 UTF8_CONT {3}
| 0xF8..0xFb UTF8_CONT {4}
| 0xFC..0xFD UTF8_CONT {5};
UTF8 = 0x21..0x7F | UTF8_NONASCII; UTF8 = 0x21..0x7F | UTF8_NONASCII;
UTF8_TRIM = ( UTF8+ (LWS* UTF8)* ) >start @collapse; UTF8_TRIM = ( UTF8+ (LWS* UTF8)* ) >start @collapse;
@ -325,10 +338,10 @@ func ParseMsgBytes(data []byte) (msg *Msg, err error) {
; ;
svalue := hval CR LF @svalueDone @header; svalue := hval CR LF @svalueDone @header;
xheader = token %hname HCOLON @{dest=nil} @svalue;
xheader := token %hname HCOLON <: any @svalue;
header := CR LF @break header := CR LF @break
| sname HCOLON <: any @svalue
| cheader CR LF @header | cheader CR LF @header
| sname >mark @err(xheader) HCOLON <: any @svalue
; ;
SIPVersion = "SIP/" SIPVersionNo; SIPVersion = "SIP/" SIPVersionNo;


+ 18
- 6
sip/msg_test.go View File

@ -16,17 +16,29 @@ type msgTest struct {
var msgTests = []msgTest{ var msgTests = []msgTest{
msgTest{ msgTest{
name: "Digit Padding",
s: "OPTIONS sip:10.11.34.37 SIP/2.0\r\n" +
name: "Left Padding",
s: "SIP/2.0 200 OK\r\n" +
"Expires: 666\r\n" + "Expires: 666\r\n" +
"\r\n", "\r\n",
msg: sip.Msg{ msg: sip.Msg{
VersionMajor: 2, VersionMajor: 2,
Method: "OPTIONS",
Status: 200,
Phrase: "OK",
Expires: 666, Expires: 666,
Request: &sip.URI{
Scheme: "sip",
Host: "10.11.34.37",
},
},
msgTest{
name: "Extension Headers",
s: "SIP/2.0 200 OK\r\n" +
"X-LOL: omfg\r\n" +
"\r\n",
msg: sip.Msg{
VersionMajor: 2,
Status: 200,
Phrase: "OK",
Headers: sip.Headers{
"x-lol": "omfg",
}, },
}, },
}, },


Loading…
Cancel
Save