Skip to content

Commit eef130c

Browse files
committed
Improve SIP parsers.
1 parent f835338 commit eef130c

File tree

10 files changed

+587
-352
lines changed

10 files changed

+587
-352
lines changed

sip/header_params.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ func (hp HeaderParams) Clone() HeaderParams {
6868
}
6969

7070
func (hp HeaderParams) clone() HeaderParams {
71+
if hp == nil {
72+
return nil
73+
}
7174
dup := make(HeaderParams, len(hp))
7275

7376
for k, v := range hp {

sip/parse_address.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ func addressStateHeaderParams(a *nameAddress, s string) (addressFSM, string, err
188188
}
189189

190190
// headerParserTo generates ToHeader
191-
func headerParserTo(headerName string, headerText string) (header Header, err error) {
191+
func headerParserTo(headerName []byte, headerText string) (header Header, err error) {
192192
h := &ToHeader{}
193193
return h, parseToHeader(headerText, h)
194194
}
@@ -214,7 +214,7 @@ func parseToHeader(headerText string, h *ToHeader) error {
214214
}
215215

216216
// headerParserFrom generates FromHeader
217-
func headerParserFrom(headerName string, headerText string) (header Header, err error) {
217+
func headerParserFrom(headerName []byte, headerText string) (header Header, err error) {
218218
h := &FromHeader{}
219219
return h, parseFromHeader(headerText, h)
220220
}
@@ -240,7 +240,7 @@ func parseFromHeader(headerText string, h *FromHeader) error {
240240
return nil
241241
}
242242

243-
func headerParserContact(headerName string, headerText string) (header Header, err error) {
243+
func headerParserContact(headerName []byte, headerText string) (header Header, err error) {
244244
h := ContactHeader{}
245245
return &h, parseContactHeader(headerText, &h)
246246
}
@@ -285,7 +285,7 @@ func parseContactHeader(headerText string, h *ContactHeader) error {
285285
return err
286286
}
287287

288-
func headerParserRoute(headerName string, headerText string) (header Header, err error) {
288+
func headerParserRoute(headerName []byte, headerText string) (header Header, err error) {
289289
// Append a comma to simplify the parsing code; we split address sections
290290
// on commas, so use a comma to signify the end of the final address section.
291291
h := RouteHeader{}
@@ -298,7 +298,7 @@ func parseRouteHeader(headerText string, h *RouteHeader) error {
298298
}
299299

300300
// parseRouteHeader generates RecordRouteHeader
301-
func headerParserRecordRoute(headerName string, headerText string) (header Header, err error) {
301+
func headerParserRecordRoute(headerName []byte, headerText string) (header Header, err error) {
302302
// Append a comma to simplify the parsing code; we split address sections
303303
// on commas, so use a comma to signify the end of the final address section.
304304
h := RecordRouteHeader{}
@@ -309,7 +309,7 @@ func parseRecordRouteHeader(headerText string, h *RecordRouteHeader) error {
309309
return parseRouteAddress(headerText, &h.Address)
310310
}
311311

312-
func headerParserReferTo(headerName string, headerText string) (header Header, err error) {
312+
func headerParserReferTo(headerName []byte, headerText string) (header Header, err error) {
313313
h := ReferToHeader{}
314314
return &h, parseReferToHeader(headerText, &h)
315315
}
@@ -318,7 +318,7 @@ func parseReferToHeader(headerText string, h *ReferToHeader) error {
318318
return parseRouteAddress(headerText, &h.Address) // calling parseRouteAddress because the structure is same
319319
}
320320

321-
func headerParserReferredBy(headerName string, headerText string) (header Header, err error) {
321+
func headerParserReferredBy(headerName []byte, headerText string) (header Header, err error) {
322322
h := &ReferredByHeader{}
323323
return h, parseReferredByHeader(headerText, h)
324324
}

sip/parse_header.go

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package sip
22

33
import (
4+
"bytes"
45
"fmt"
56
"strconv"
67
"strings"
@@ -10,9 +11,9 @@ import (
1011
// Some of headers parsing are moved to different files for better maintance
1112

1213
// A HeaderParser is any function that turns raw header data into one or more Header objects.
13-
type HeaderParser func(headerName string, headerData string) (Header, error)
14+
type HeaderParser func(headerName []byte, headerData string) (Header, error)
1415

15-
type mapHeadersParser map[string]HeaderParser
16+
type HeadersParser map[string]HeaderParser
1617

1718
type errComaDetected int
1819

@@ -37,7 +38,7 @@ func (e errComaDetected) Error() string {
3738
// t To RFC 3261
3839
// u Allow-Events -events- "understand"
3940
// v Via RFC 3261
40-
var headersParsers = mapHeadersParser{
41+
var headersParsers = HeadersParser{
4142
"c": headerParserContentType,
4243
"content-type": headerParserContentType,
4344
"f": headerParserFrom,
@@ -66,56 +67,49 @@ func DefaultHeadersParser() map[string]HeaderParser {
6667
return headersParsers
6768
}
6869

69-
// parseMsgHeader will append any parsed header
70-
// In case comma seperated values it will add them as new in case comma is detected
71-
func (headersParser mapHeadersParser) parseMsgHeader(msg Message, headerText string) (err error) {
72-
// p.log.Tracef("parsing header \"%s\"", headerText)
73-
74-
colonIdx := strings.Index(headerText, ":")
70+
// ParseHeader parses a SIP header from the line and appends it to out.
71+
func (headersParser HeadersParser) ParseHeader(out []Header, line []byte) ([]Header, error) {
72+
colonIdx := bytes.IndexByte(line, ':')
7573
if colonIdx == -1 {
76-
err = fmt.Errorf("field name with no value in header: %s", headerText)
77-
return
74+
return out, fmt.Errorf("field name with no value in header: %q", line)
7875
}
7976

80-
fieldName := strings.TrimSpace(headerText[:colonIdx])
81-
lowerFieldName := HeaderToLower(fieldName)
82-
fieldText := strings.TrimSpace(headerText[colonIdx+1:])
77+
fieldName := bytes.TrimSpace(line[:colonIdx])
78+
lowerFieldName := headerToLower(fieldName)
79+
fieldValue := bytes.TrimSpace(line[colonIdx+1:])
8380

84-
headerParser, ok := headersParser[lowerFieldName]
81+
headerParser, ok := headersParser[string(lowerFieldName)]
8582
if !ok {
8683
// We have no registered parser for this header type,
8784
// so we encapsulate the header data in a GenericHeader struct.
8885
// We do only forwarding on this with trimmed space. Validation and parsing is required by user
89-
90-
header := NewHeader(fieldName, fieldText)
91-
msg.AppendHeader(header)
92-
return nil
86+
h := NewHeader(string(fieldName), string(fieldValue))
87+
out = append(out, h)
88+
return out, nil
9389
}
9490

95-
// Support comma seperated value
91+
fieldText := string(fieldValue)
92+
// Support comma separated values
9693
for {
9794
// We have a registered parser for this header type - use it.
9895
// headerParser should detect comma (,) and return as error
99-
header, err := headerParser(lowerFieldName, fieldText)
100-
101-
// Mostly we will run with no error
96+
h, err := headerParser(lowerFieldName, fieldText)
10297
if err == nil {
103-
msg.AppendHeader(header)
104-
return nil
98+
out = append(out, h)
99+
return out, nil
105100
}
106101

107102
commaErr, ok := err.(errComaDetected)
108103
if !ok {
109-
return err
104+
return out, err
110105
}
111-
112106
// Ok we detected we have comma in header value
113-
msg.AppendHeader(header)
107+
out = append(out, h)
114108
fieldText = fieldText[commaErr+1:]
115109
}
116110
}
117111

118-
func headerParserCallId(headerName string, headerText string) (header Header, err error) {
112+
func headerParserCallId(headerName []byte, headerText string) (header Header, err error) {
119113
var callId CallIDHeader
120114
return &callId, parseCallIdHeader(headerText, &callId)
121115
}
@@ -131,7 +125,7 @@ func parseCallIdHeader(headerText string, callId *CallIDHeader) error {
131125
return nil
132126
}
133127

134-
func headerParserMaxForwards(headerName string, headerText string) (header Header, err error) {
128+
func headerParserMaxForwards(headerName []byte, headerText string) (header Header, err error) {
135129
var maxfwd MaxForwardsHeader
136130
return &maxfwd, parseMaxForwardsHeader(headerText, &maxfwd)
137131
}
@@ -143,7 +137,7 @@ func parseMaxForwardsHeader(headerText string, maxfwd *MaxForwardsHeader) error
143137
return err
144138
}
145139

146-
func headerParserCSeq(headerName string, headerText string) (headers Header, err error) {
140+
func headerParserCSeq(headerName []byte, headerText string) (headers Header, err error) {
147141
var cseq CSeqHeader
148142
return &cseq, parseCSeqHeader(headerText, &cseq)
149143
}
@@ -169,7 +163,7 @@ func parseCSeqHeader(headerText string, cseq *CSeqHeader) error {
169163
return nil
170164
}
171165

172-
func headerParserContentLength(headerName string, headerText string) (header Header, err error) {
166+
func headerParserContentLength(headerName []byte, headerText string) (header Header, err error) {
173167
var contentLength ContentLengthHeader
174168
return &contentLength, parseContentLengthHeader(headerText, &contentLength)
175169
}
@@ -182,7 +176,7 @@ func parseContentLengthHeader(headerText string, contentLength *ContentLengthHea
182176
}
183177

184178
// headerParserContentType parses ContentType header
185-
func headerParserContentType(headerName string, headerText string) (headers Header, err error) {
179+
func headerParserContentType(headerName []byte, headerText string) (headers Header, err error) {
186180
var contentType ContentTypeHeader
187181
return &contentType, parseContentTypeHeader(headerText, &contentType)
188182
}

sip/parse_via.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"strings"
77
)
88

9-
func headerParserVia(headerName string, headerText string) (
9+
func headerParserVia(headerName []byte, headerText string) (
1010
header Header, err error) {
1111
// sections := strings.Split(headerText, ",")
1212
h := ViaHeader{

0 commit comments

Comments
 (0)