Skip to content

Commit

Permalink
Transport refactoring
Browse files Browse the repository at this point in the history
- extract basic transport interface to the sip package
- move all auto headers append to the gosip.Server
- fix/add tests
  • Loading branch information
ghettovoice committed Jan 25, 2021
1 parent f101d6b commit 911985a
Show file tree
Hide file tree
Showing 10 changed files with 354 additions and 100 deletions.
79 changes: 54 additions & 25 deletions server.go
Expand Up @@ -2,7 +2,9 @@ package gosip

import (
"context"
"errors"
"fmt"
"io"
"net"
"sync"

Expand Down Expand Up @@ -50,7 +52,7 @@ type TransportLayerFactory func(
logger log.Logger,
) transport.Layer

type TransactionLayerFactory func(tpl transport.Layer, logger log.Logger) transaction.Layer
type TransactionLayerFactory func(tpl sip.Transport, logger log.Logger) transaction.Layer

// ServerConfig describes available options
type ServerConfig struct {
Expand All @@ -74,6 +76,7 @@ type server struct {
hmu *sync.RWMutex
requestHandlers map[sip.RequestMethod]RequestHandler
extensions []string
userAgent string

log log.Logger
}
Expand Down Expand Up @@ -130,22 +133,29 @@ func NewServer(
extensions = config.Extensions
}

userAgent := config.UserAgent
if userAgent == "" {
userAgent = "GoSIP"
}

srv := &server{
host: host,
ip: ip,
hwg: new(sync.WaitGroup),
hmu: new(sync.RWMutex),
requestHandlers: make(map[sip.RequestMethod]RequestHandler),
extensions: extensions,
userAgent: userAgent,
}
srv.log = logger.WithFields(log.Fields{
"sip_server_ptr": fmt.Sprintf("%p", srv),
})
srv.tp = tpFactory(ip, dnsResolver, config.MsgMapper, srv.Log())
if tp, ok := srv.tp.(interface{ SetUserAgent(string) }); ok {
tp.SetUserAgent(config.UserAgent)
sipTp := &sipTransport{
tpl: srv.tp,
srv: srv,
}
srv.tx = txFactory(srv.tp, log.AddFieldsFrom(srv.Log(), srv.tp))
srv.tx = txFactory(sipTp, log.AddFieldsFrom(srv.Log(), srv.tp))

srv.running.Set()
go srv.serve()
Expand Down Expand Up @@ -199,7 +209,14 @@ func (srv *server) serve() {
return
}

srv.Log().Errorf("received SIP transport error: %s", err)
var ferr *sip.MalformedMessageError
if errors.Is(err, io.EOF) {
srv.Log().Debugf("received SIP transport error: %s", err)
} else if errors.As(err, &ferr) {
srv.Log().Warnf("received SIP transport error: %s", err)
} else {
srv.Log().Errorf("received SIP transport error: %s", err)
}
}
}
}
Expand Down Expand Up @@ -376,26 +393,6 @@ func (srv *server) RequestWithContext(
}

func (srv *server) prepareRequest(req sip.Request) sip.Request {
if viaHop, ok := req.ViaHop(); ok {
if viaHop.Params == nil {
viaHop.Params = sip.NewParams()
}
if !viaHop.Params.Has("branch") {
viaHop.Params.Add("branch", sip.String{Str: sip.GenerateBranch()})
}
} else {
viaHop = &sip.ViaHop{
ProtocolName: "SIP",
ProtocolVersion: "2.0",
Params: sip.NewParams().
Add("branch", sip.String{Str: sip.GenerateBranch()}),
}

req.PrependHeaderAfter(sip.ViaHeader{
viaHop,
}, "Route")
}

srv.appendAutoHeaders(req)

return req
Expand Down Expand Up @@ -514,6 +511,17 @@ func (srv *server) appendAutoHeaders(msg sip.Message) {
}
}
}

if hdrs := msg.GetHeaders("User-Agent"); len(hdrs) == 0 {
userAgent := sip.UserAgentHeader(srv.userAgent)
msg.AppendHeader(&userAgent)
}

if srv.tp.IsStreamed(msg.Transport()) {
if hdrs := msg.GetHeaders("Content-Length"); len(hdrs) == 0 {
msg.SetBody(msg.Body(), true)
}
}
}

func (srv *server) getAllowedMethods() []sip.RequestMethod {
Expand All @@ -538,3 +546,24 @@ func (srv *server) getAllowedMethods() []sip.RequestMethod {

return methods
}

type sipTransport struct {
tpl transport.Layer
srv *server
}

func (tp *sipTransport) Messages() <-chan sip.Message {
return tp.tpl.Messages()
}

func (tp *sipTransport) Send(msg sip.Message) error {
return tp.srv.Send(msg)
}

func (tp *sipTransport) IsReliable(network string) bool {
return tp.tpl.IsReliable(network)
}

func (tp *sipTransport) IsStreamed(network string) bool {
return tp.tpl.IsStreamed(network)
}

0 comments on commit 911985a

Please sign in to comment.