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
import (
"bytes"
"errors"
"fmt"
"github.com/jart/gosip/sdp"
@ -32,7 +33,7 @@ func ParseMsgBytes(data []byte) (msg *Msg, err error) {
cs := 0
p := 0
pe := len(data)
//eof := len(data)
eof := len(data)
//stack := make([]int, 2)
//top := 0
line := 1
@ -120,15 +121,22 @@ func ParseMsgBytes(data []byte) (msg *Msg, err error) {
fgoto svalue;
}
action svalueDone {
action svalueDone {{
b := data[mark:p - 1]
if dest != nil {
*dest = string(data[mark:p - 1])
*dest = string(b)
} else {
if msg.Headers == nil {
msg.Headers = Headers{}
}
msg.Headers[b1] = string(data[mark:p])
msg.Headers[b1] = string(b)
}
}}
action xheader {
dest = nil;
fhold;
fgoto xheader;
}
action CallID {
@ -218,7 +226,12 @@ func ParseMsgBytes(data []byte) (msg *Msg, err error) {
WSP = SP | HTAB;
LWS = ( WSP* ( CR when lookAheadWSP ) LF )? WSP+;
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_TRIM = ( UTF8+ (LWS* UTF8)* ) >start @collapse;
@ -325,10 +338,10 @@ func ParseMsgBytes(data []byte) (msg *Msg, err error) {
;
svalue := hval CR LF @svalueDone @header;
xheader = token %hname HCOLON @{dest=nil} @svalue;
xheader := token %hname HCOLON <: any @svalue;
header := CR LF @break
| sname HCOLON <: any @svalue
| cheader CR LF @header
| sname >mark @err(xheader) HCOLON <: any @svalue
;
SIPVersion = "SIP/" SIPVersionNo;


+ 18
- 6
sip/msg_test.go View File

@ -16,17 +16,29 @@ type msgTest struct {
var msgTests = []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" +
"\r\n",
msg: sip.Msg{
VersionMajor: 2,
Method: "OPTIONS",
Status: 200,
Phrase: "OK",
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