public abstract class SipMessageBuilder<T extends SipMessage> extends Object implements SipMessage.Builder<T>
Modifier | Constructor and Description |
---|---|
protected |
SipMessageBuilder() |
protected |
SipMessageBuilder(int headerSizeHint) |
Modifier and Type | Method and Description |
---|---|
T |
build() |
protected abstract SipInitialLine |
buildInitialLine() |
protected abstract CSeqHeader |
generateDefaultCSeqHeader() |
protected abstract ToHeader |
generateDefaultToHeader() |
protected java.util.function.Function<SipURI,SipURI> |
getRequestURIFunction() |
protected abstract T |
internalBuild(Buffer message,
SipInitialLine initialLine,
List<SipHeader> headers,
short indexOfTo,
short indexOfFrom,
short indexOfCSeq,
short indexOfCallId,
short indexOfMaxForwards,
short indexOfVia,
short indexOfRoute,
short indexOfRecordRoute,
short indexOfContact,
Buffer body) |
protected boolean |
isBuildingRequest()
Indicates whether or not we are building a request.
|
protected boolean |
isBuildingResponse()
Indicates whether or not we are building a response.
|
SipMessage.Builder<T> |
onCommit(java.util.function.Consumer<SipMessage> f)
After the
SipMessage has been fully built and created the "end result"
will be conveyed to the registered function. |
SipMessage.Builder<T> |
onContactHeader(java.util.function.Consumer<AddressParametersHeader.Builder<ContactHeader>> f) |
SipMessage.Builder<T> |
onCSeqHeader(java.util.function.Consumer<CSeqHeader.Builder> f) |
SipMessage.Builder<T> |
onFromHeader(java.util.function.Consumer<AddressParametersHeader.Builder<FromHeader>> f) |
SipMessage.Builder<T> |
onHeader(java.util.function.Function<SipHeader,SipHeader> f)
Whenever a header is about to be pushed onto the new
SipMessage
you have a chance to change the value of that header. |
SipMessage.Builder<T> |
onMaxForwardsHeader(java.util.function.Consumer<MaxForwardsHeader.Builder> f) |
SipMessage.Builder<T> |
onRecordRouteHeader(java.util.function.Consumer<AddressParametersHeader.Builder<RecordRouteHeader>> f)
Called when a Record-Route header is processed (except for the top-most one,
then
SipMessage.Builder.onTopMostRecordRouteHeader(Consumer)
is called instead) |
SipMessage.Builder<T> |
onRequestURI(java.util.function.Function<SipURI,SipURI> f) |
SipMessage.Builder<T> |
onRouteHeader(java.util.function.Consumer<AddressParametersHeader.Builder<RouteHeader>> f)
Called when a Route header is processed (except for the top-most one,
then
SipMessage.Builder.onTopMostRouteHeader(Consumer)
is called instead) |
SipMessage.Builder<T> |
onToHeader(java.util.function.Consumer<AddressParametersHeader.Builder<ToHeader>> f) |
SipMessage.Builder<T> |
onTopMostRecordRouteHeader(java.util.function.Consumer<AddressParametersHeader.Builder<RecordRouteHeader>> f)
Called when the top-most Record Route header is processed.
|
SipMessage.Builder<T> |
onTopMostRouteHeader(java.util.function.Consumer<AddressParametersHeader.Builder<RouteHeader>> f)
Called when the top-most Route header is processed.
|
SipMessage.Builder<T> |
onTopMostViaHeader(java.util.function.Consumer<ViaHeader.Builder> f)
Called when the top-most Via header is processed.
|
SipMessage.Builder<T> |
onViaHeader(java.util.function.BiConsumer<Integer,ViaHeader.Builder> f)
Called when a Via header is processed and the first argument is the
index of the Via being processed.
|
SipMessage.Builder<T> |
withBody(Buffer body) |
SipMessage.Builder<T> |
withCallIdHeader(CallIdHeader callID) |
SipMessage.Builder<T> |
withContactHeader(ContactHeader contact) |
SipMessage.Builder<T> |
withCSeqHeader(CSeqHeader cseq) |
SipMessage.Builder<T> |
withFromHeader(FromHeader from)
Set the
FromHeader to be used by the new SipMessage . |
SipMessage.Builder<T> |
withFromHeader(String from) |
SipMessage.Builder<T> |
withHeader(SipHeader header)
Adds the header to the list of headers already specified within this builder.
|
SipMessage.Builder<T> |
withHeaders(List<SipHeader> headers) |
SipMessage.Builder<T> |
withMaxForwardsHeader(MaxForwardsHeader maxForwards) |
SipMessage.Builder<T> |
withNoDefaults()
By default, the following headers will automatically be generated if not
explicitly provided (note: there is a slight difference between request/response):
ToHeader - the request-uri will be used to construct the to-header
in the case of a request. |
SipMessage.Builder<T> |
withNoRoutes()
Sometimes you may want to just wipe out all the potential
RouteHeader s
that e.g. |
SipMessage.Builder<T> |
withPoppedRoute()
Pop the top-most route.
|
SipMessage.Builder<T> |
withPoppedVia()
Pop the top-most via.
|
SipMessage.Builder<T> |
withPushHeader(SipHeader header)
Push the header to be the first on the list of existing headers already
added to this builder.
|
SipMessage.Builder<T> |
withRecordRouteHeader(RecordRouteHeader recordRoute)
Set a Record Router header to be used on the message that is being built.
|
SipMessage.Builder<T> |
withRecordRouteHeaders(List<RecordRouteHeader> recordRoutes) |
SipMessage.Builder<T> |
withRecordRouteHeaders(RecordRouteHeader... recordRoutes)
Set a list of Record Route headers.
|
SipMessage.Builder<T> |
withRouteHeader(RouteHeader route)
Set a Router header to be used on the message that is being built.
|
SipMessage.Builder<T> |
withRouteHeaders(List<RouteHeader> routes) |
SipMessage.Builder<T> |
withRouteHeaders(RouteHeader... routes)
Set a list of Route headers.
|
SipMessage.Builder<T> |
withToHeader(String to) |
SipMessage.Builder<T> |
withToHeader(ToHeader to) |
SipMessage.Builder<T> |
withTopMostRecordRouteHeader(RecordRouteHeader recordRoute)
Push the given Record Route header to the top of the potential list of existing
Record Route headers.
|
SipMessage.Builder<T> |
withTopMostRouteHeader(RouteHeader route)
Push the given Route header to the top of the potential list of existing
Route headers.
|
SipMessage.Builder<T> |
withTopMostViaHeader()
Typically the
ViaHeader will have to be filled out by the stack at some
later point, which is when the message is about to be sent, so when you create
the message you don't have all the details just yet. |
SipMessage.Builder<T> |
withTopMostViaHeader(ViaHeader via)
Push the given Via header to the top of the potential list of existing
Via headers.
|
SipMessage.Builder<T> |
withViaHeader(ViaHeader via)
Add a Via header to be used on the message that is being built.
|
SipMessage.Builder<T> |
withViaHeaders(List<ViaHeader> vias)
Set a list of Via headers.
|
SipMessage.Builder<T> |
withViaHeaders(ViaHeader... vias)
Set a list of Via headers.
|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
isSipRequestBuilder, isSipResponseBuilder, toSipRequestBuilder, toSipResponseBuilder
protected SipMessageBuilder(int headerSizeHint)
protected SipMessageBuilder()
public SipMessage.Builder<T> withNoDefaults()
SipMessage.Builder
ToHeader
- the request-uri will be used to construct the to-header
in the case of a request. For a response you have to supply itCSeqHeader
- a new CSeq header will be added where the
method is the same as this message and the sequence number is set to 1CallIdHeader
- a new random call-id will be addedMaxForwardsHeader
- if we are building a request, a max forwards of 70 will be addedContentLengthHeader
- Will be added if there is a body
on the message and the length set to the correct length.SipMessage
you are then responsible for adding
the mandatory headers to this builder (unless you don't care of course
because perhaps you are building a test tool meant to torture test
a SIP server).withNoDefaults
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> onHeader(java.util.function.Function<SipHeader,SipHeader> f) throws IllegalStateException
SipMessage.Builder
SipMessage
you have a chance to change the value of that header. You do so
by registering a function that accepts a SipHeader
as an argument and that
returns a SipHeader
, which is the header that will be pushed onto the new
SipMessage
. If you do not want to include the header, then simply return
null and the header will be dropped.
If you wish to leave the header un-touched, then simply return it has is.
Also note that the following headers have explicit "on" methods (they are considered
to be "system" headers):
The reason is simply because these are typically manipulated before
copying them over to a new request or response (e.g., Max Forwards is decremented,
CSeq may increase etc) and therefore it makes life easier if those headers are
"down casted" to their specific types.onHeader
in interface SipMessage.Builder<T extends SipMessage>
IllegalStateException
- in case a function already had been registered with
this builder.public SipMessage.Builder<T> withHeader(SipHeader header)
SipMessage.Builder
SipMessage
used as a template, then those headers will
TODO: this is essentially an "add header" so should it be called that?
TODO: and then should there be a set version? Just goes bad with a fluent
TODO: naming.withHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withHeaders(List<SipHeader> headers)
withHeaders
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withPushHeader(SipHeader header)
SipMessage.Builder
withPushHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> onFromHeader(java.util.function.Consumer<AddressParametersHeader.Builder<FromHeader>> f)
onFromHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withFromHeader(FromHeader from)
SipMessage.Builder
FromHeader
to be used by the new SipMessage
. If there already
is a FromHeader
present, either through a template or because this method
has been called previously, that value will be overwritten.withFromHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withFromHeader(String from)
withFromHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> onToHeader(java.util.function.Consumer<AddressParametersHeader.Builder<ToHeader>> f)
onToHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withToHeader(ToHeader to)
withToHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withToHeader(String to)
withToHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> onContactHeader(java.util.function.Consumer<AddressParametersHeader.Builder<ContactHeader>> f)
onContactHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withContactHeader(ContactHeader contact)
withContactHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> onCSeqHeader(java.util.function.Consumer<CSeqHeader.Builder> f)
onCSeqHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withCSeqHeader(CSeqHeader cseq)
withCSeqHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withCallIdHeader(CallIdHeader callID)
withCallIdHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> onMaxForwardsHeader(java.util.function.Consumer<MaxForwardsHeader.Builder> f)
onMaxForwardsHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withMaxForwardsHeader(MaxForwardsHeader maxForwards)
withMaxForwardsHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> onTopMostViaHeader(java.util.function.Consumer<ViaHeader.Builder> f)
SipMessage.Builder
io.pkts.packet.sip.SipMessage.Builder#onViaHeader(Consumer)
consumeronTopMostViaHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> onViaHeader(java.util.function.BiConsumer<Integer,ViaHeader.Builder> f)
SipMessage.Builder
SipMessage.Builder.onTopMostViaHeader(Consumer)
.
I.e., Let's say you have the following message (request or response, same same):
...
Via: SIP/2.0/TCP 12.13.14.15;branch=z9hG4bK-asdf
Via: SIP/2.0/UDP 60.61.62.63;branch=z9hG4bK-1234
Via: SIP/2.0/UDP 96.97.98.99;branch=z9hG4bK-wxyz
...
SipMessage.Builder.onTopMostViaHeader(Consumer)
will be called.
SipMessage.Builder.onViaHeader(BiConsumer)
will be called where the index will
be '1' since this is the second via on the list and we of course start counting
at zero.
SipMessage.Builder.onViaHeader(BiConsumer)
will be called where the index will
be '2' since this is the third via on the list and so on...
onViaHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> onTopMostRouteHeader(java.util.function.Consumer<AddressParametersHeader.Builder<RouteHeader>> f)
SipMessage.Builder
SipMessage.Builder.onRouteHeader(Consumer)
onTopMostRouteHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> onRouteHeader(java.util.function.Consumer<AddressParametersHeader.Builder<RouteHeader>> f)
SipMessage.Builder
SipMessage.Builder.onTopMostRouteHeader(Consumer)
is called instead)onRouteHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withRouteHeader(RouteHeader route)
SipMessage.Builder
SipMessage.Builder.withRouteHeaders(RouteHeader...)
.
If you want to push a Route header to a potentially already existing list
of Record Route headers, then use SipMessage.Builder.withTopMostRouteHeader(RouteHeader)
withRouteHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withRouteHeaders(RouteHeader... routes)
SipMessage.Builder
withRouteHeaders
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withRouteHeaders(List<RouteHeader> routes)
withRouteHeaders
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withTopMostRouteHeader(RouteHeader route)
SipMessage.Builder
withTopMostRouteHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withPoppedRoute()
SipMessage.Builder
RouteHeader
via the method
SipMessage.Builder.withTopMostRouteHeader(RouteHeader)
followed
by this method, then the route you just added will be removed again. Order is important!
Note: if you actually wanted to know the value of that RouteHeader
then you should
really have checked it on the SipMessage
you received and not on the builder
object.withPoppedRoute
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withNoRoutes()
SipMessage.Builder
RouteHeader
s
that e.g. were automatically copied from another SipRequest
that was
used as a template. A common scenario is that you are building a B2BUA acting
as the border police to your network and you simply cannot trust incoming requests
and as such, you should not honor externally pushed routes, since if you did, an
attacker could by-pass your next hop by forcing the request to go to somewhere else.withNoRoutes
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> onTopMostRecordRouteHeader(java.util.function.Consumer<AddressParametersHeader.Builder<RecordRouteHeader>> f)
SipMessage.Builder
SipMessage.Builder.onRecordRouteHeader(Consumer)
onTopMostRecordRouteHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> onRecordRouteHeader(java.util.function.Consumer<AddressParametersHeader.Builder<RecordRouteHeader>> f)
SipMessage.Builder
SipMessage.Builder.onTopMostRecordRouteHeader(Consumer)
is called instead)onRecordRouteHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withRecordRouteHeader(RecordRouteHeader recordRoute)
SipMessage.Builder
SipMessage.Builder.withRecordRouteHeaders(RecordRouteHeader...)
.
If you want to push a Record Route header to a potentially already existing list
of Record Route headers, then usewithRecordRouteHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withRecordRouteHeaders(RecordRouteHeader... recordRoutes)
SipMessage.Builder
withRecordRouteHeaders
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withRecordRouteHeaders(List<RecordRouteHeader> recordRoutes)
withRecordRouteHeaders
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withTopMostRecordRouteHeader(RecordRouteHeader recordRoute)
SipMessage.Builder
withTopMostRecordRouteHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withViaHeader(ViaHeader via)
SipMessage.Builder
SipMessage.Builder.withViaHeaders(ViaHeader...)
.
If you want to push a Via header to a potentially already existing list
of Via headers, then use SipMessage.Builder.withTopMostViaHeader(ViaHeader)
.withViaHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withViaHeaders(ViaHeader... vias)
SipMessage.Builder
withViaHeaders
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withViaHeaders(List<ViaHeader> vias)
SipMessage.Builder
withViaHeaders
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withTopMostViaHeader(ViaHeader via)
SipMessage.Builder
withTopMostViaHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withTopMostViaHeader()
SipMessage.Builder
ViaHeader
will have to be filled out by the stack at some
later point, which is when the message is about to be sent, so when you create
the message you don't have all the details just yet. However, just to create
a new Via with bogus information only to be re-written later by registering
a function with SipMessage.Builder.onTopMostViaHeader(Consumer)
is rather silly
so therefore you can just indicate that you want a new top-most via header
but you will fill out all details later.
NOTE: if you do NOT register a function to handle this "empty" Via-header
through the method SipMessage.Builder.onTopMostViaHeader(Consumer)
things will
blow up later with you try to build this message.withTopMostViaHeader
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withPoppedVia()
SipMessage.Builder
ViaHeader
through the method
SipMessage.Builder.withTopMostViaHeader(ViaHeader)
followed
by this method, then the Via you just added will be removed again. Order is important!
Note: if you actually wanted to know the value of that ViaHeader
then you should
really have checked it on the SipMessage
you received and not on the builder
object.withPoppedVia
in interface SipMessage.Builder<T extends SipMessage>
protected final java.util.function.Function<SipURI,SipURI> getRequestURIFunction()
public SipMessage.Builder<T> onRequestURI(java.util.function.Function<SipURI,SipURI> f)
onRequestURI
in interface SipMessage.Builder<T extends SipMessage>
public SipMessage.Builder<T> withBody(Buffer body)
withBody
in interface SipMessage.Builder<T extends SipMessage>
protected boolean isBuildingRequest()
SipHeaderBuilderWrapper#enforceDefaults()
protected boolean isBuildingResponse()
SipHeaderBuilderWrapper#enforceDefaults()
protected abstract ToHeader generateDefaultToHeader()
protected abstract CSeqHeader generateDefaultCSeqHeader()
public T build()
build
in interface SipMessage.Builder<T extends SipMessage>
protected abstract SipInitialLine buildInitialLine() throws SipParseException
SipParseException
protected abstract T internalBuild(Buffer message, SipInitialLine initialLine, List<SipHeader> headers, short indexOfTo, short indexOfFrom, short indexOfCSeq, short indexOfCallId, short indexOfMaxForwards, short indexOfVia, short indexOfRoute, short indexOfRecordRoute, short indexOfContact, Buffer body)
public SipMessage.Builder<T> onCommit(java.util.function.Consumer<SipMessage> f)
SipMessage.Builder
SipMessage
has been fully built and created the "end result"
will be conveyed to the registered function. It is utterly important
that the function returns as quickly as possible since the build method
will not be able to return until the call to this function has been completed.onCommit
in interface SipMessage.Builder<T extends SipMessage>
Copyright © 2016. All Rights Reserved.