freeswitch/libs/sofia-sip/libsofia-sip-ua/sip/GRAMMAR
2006-12-21 06:30:28 +00:00

537 lines
23 KiB
Plaintext

/* SIP grammar from RFC3261
*
* alphanum = ALPHA / DIGIT
*
* reserved = ";" / "/" / "?" / ":" / "@" / "&" / "=" / "+"
* / "$" / ","
* unreserved = alphanum / mark
* mark = "-" / "_" / "." / "!" / "~" / "*" / "'"
* / "(" / ")"
* escaped = "%" HEXDIG HEXDIG
*
* LWS = [*WSP CRLF] 1*WSP ; linear whitespace
* SWS = [LWS] ; sep whitespace
*
* HCOLON = *( SP / HTAB ) ":" SWS
*
* TEXT-UTF8-TRIM = 1*TEXT-UTF8char *(*LWS TEXT-UTF8char)
* TEXT-UTF8char = %x21-7E / UTF8-NONASCII
* UTF8-NONASCII = %xC0-DF 1UTF8-CONT
* / %xE0-EF 2UTF8-CONT
* / %xF0-F7 3UTF8-CONT
* / %xF8-Fb 4UTF8-CONT
* / %xFC-FD 5UTF8-CONT
* UTF8-CONT = %x80-BF
*
* LHEX = DIGIT / %x61-66 ;lowercase a-f
*
* token = 1*(alphanum / "-" / "." / "!" / "%" / "*"
* / "_" / "+" / "`" / "'" / "~" )
* separators = "(" / ")" / "<" / ">" / "@" /
* "," / ";" / ":" / "\" / DQUOTE /
* "/" / "[" / "]" / "?" / "=" /
* "{" / "}" / SP / HTAB
* word = 1*(alphanum / "-" / "." / "!" / "%" / "*" /
* "_" / "+" / "`" / "'" / "~" /
* "(" / ")" / "<" / ">" /
* ":" / "\" / DQUOTE /
* "/" / "[" / "]" / "?" /
* "{" / "}" )
*
* STAR = SWS "*" SWS ; asterisk
* SLASH = SWS "/" SWS ; slash
* EQUAL = SWS "=" SWS ; equal
* LPAREN = SWS "(" SWS ; left parenthesis
* RPAREN = SWS ")" SWS ; right parenthesis
* RAQUOT = ">" SWS ; right angle quote
* LAQUOT = SWS "<"; left angle quote
* COMMA = SWS "," SWS ; comma
* SEMI = SWS ";" SWS ; semicolon
* COLON = SWS ":" SWS ; colon
* LDQUOT = SWS DQUOTE; open double quotation mark
* RDQUOT = DQUOTE SWS ; close double quotation mark
*
* comment = LPAREN *(ctext / quoted-pair / comment) RPAREN
* ctext = %x21-27 / %x2A-5B / %x5D-7E / UTF8-NONASCII
* / LWS
*
* quoted-string = SWS DQUOTE *(qdtext / quoted-pair ) DQUOTE
* qdtext = LWS / %x21 / %x23-5B / %x5D-7E
* / UTF8-NONASCII
*
* quoted-pair = "\" (%x00-09 / %x0B-0C
* / %x0E-7F)
*
* SIP-URI = "sip:" [ userinfo ] hostport
* uri-parameters [ headers ]
* SIPS-URI = "sips:" [ userinfo ] hostport
* uri-parameters [ headers ]
* userinfo = ( user / telephone-subscriber ) [ ":" password ] "@"
* user = 1*( unreserved / escaped / user-unreserved )
* user-unreserved = "&" / "=" / "+" / "$" / "," / ";" / "?" / "/"
* password = *( unreserved / escaped /
* "&" / "=" / "+" / "$" / "," )
* hostport = host [ ":" port ]
* host = hostname / IPv4address / IPv6reference
* hostname = *( domainlabel "." ) toplabel [ "." ]
* domainlabel = alphanum
* / alphanum *( alphanum / "-" ) alphanum
* toplabel = ALPHA / ALPHA *( alphanum / "-" ) alphanum
* IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
* IPv6reference = "[" IPv6address "]"
* IPv6address = hexpart [ ":" IPv4address ]
* hexpart = hexseq / hexseq "::" [ hexseq ] / "::" [ hexseq ]
* hexseq = hex4 *( ":" hex4)
* hex4 = 1*4HEXDIG
* port = 1*DIGIT
*
* uri-parameters = *( ";" uri-parameter)
* uri-parameter = transport-param / user-param / method-param
* / ttl-param / maddr-param / lr-param / other-param
* transport-param = "transport="
* ( "udp" / "tcp" / "sctp" / "tls"
* / other-transport)
* other-transport = token
* user-param = "user=" ( "phone" / "ip" / other-user)
* other-user = token
* method-param = "method=" Method
* ttl-param = "ttl=" ttl
* maddr-param = "maddr=" host
* lr-param = "lr"
* other-param = pname [ "=" pvalue ]
* pname = 1*paramchar
* pvalue = 1*paramchar
* paramchar = param-unreserved / unreserved / escaped
* param-unreserved = "[" / "]" / "/" / ":" / "&" / "+" / "$"
*
* headers = "?" header *( "&" header )
* header = hname "=" hvalue
* hname = 1*( hnv-unreserved / unreserved / escaped )
* hvalue = *( hnv-unreserved / unreserved / escaped )
* hnv-unreserved = "[" / "]" / "/" / "?" / ":" / "+" / "$"
*
* SIP-message = Request / Response
* Request = Request-Line
* *( message-header )
* CRLF
* [ message-body ]
* Request-Line = Method SP Request-URI SP SIP-Version CRLF
* Request-URI = SIP-URI / SIPS-URI / absoluteURI
* absoluteURI = scheme ":" ( hier-part / opaque-part )
* hier-part = ( net-path / abs-path ) [ "?" query ]
* net-path = "//" authority [ abs-path ]
* abs-path = "/" path-segments
* opaque-part = uric-no-slash *uric
* uric = reserved / unreserved / escaped
* uric-no-slash = unreserved / escaped / ";" / "?" / ":" / "@"
* / "&" / "=" / "+" / "$" / ","
* path-segments = segment *( "/" segment )
* segment = *pchar *( ";" param )
* param = *pchar
* pchar = unreserved / escaped /
* ":" / "@" / "&" / "=" / "+" / "$" / ","
* scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
* authority = srvr / reg-name
* srvr = [ [ userinfo "@" ] hostport ]
* reg-name = 1*( unreserved / escaped / "$" / ","
* / ";" / ":" / "@" / "&" / "=" / "+" )
* query = *uric
* SIP-Version = "SIP" "/" 1*DIGIT "." 1*DIGIT
*
* message-header = (Accept
* / Accept-Encoding
* / Accept-Language
* / Alert-Info
* / Allow
* / Authentication-Info
* / Authorization
* / Call-ID
* / Call-Info
* / Contact
* / Content-Disposition
* / Content-Encoding
* / Content-Language
* / Content-Length
* / Content-Type
* / CSeq
* / Date
* / Error-Info
* / Expires
* / From
* / In-Reply-To
* / Max-Forwards
* / MIME-Version
* / Min-Expires
* / Organization
* / Priority
* / Proxy-Authenticate
* / Proxy-Authorization
* / Proxy-Require
* / Record-Route
* / Reply-To
* / Require
* / Retry-After
* / Route
* / Server
* / Subject
* / Supported
* / Timestamp
* / To
* / Unsupported
* / User-Agent
* / Via
* / Warning
* / WWW-Authenticate
* / extension-header) CRLF
*
* INVITEm = %x49.4E.56.49.54.45 ; INVITE in caps
* ACKm = %x41.43.4B ; ACK in caps
* OPTIONSm = %x4F.50.54.49.4F.4E.53 ; OPTIONS in caps
* BYEm = %x42.59.45 ; BYE in caps
* CANCELm = %x43.41.4E.43.45.4C ; CANCEL in caps
* REGISTERm = %x52.45.47.49.53.54.45.52 ; REGISTER in caps
* Method = INVITEm / ACKm / OPTIONSm / BYEm
* / CANCELm / REGISTERm
* / extension-method
* extension-method = token
* Response = Status-Line
* *( message-header )
* CRLF
* [ message-body ]
*
* Status-Line = SIP-Version SP Status-Code SP Reason-Phrase CRLF
* Status-Code = Informational
* / Redirection
* / Success
* / Client-Error
* / Server-Error
* / Global-Failure
* / extension-code
* extension-code = 3DIGIT
* Reason-Phrase = *(reserved / unreserved / escaped
* / UTF8-NONASCII / UTF8-CONT / SP / HTAB)
*
* Informational = "100" ; Trying
* / "180" ; Ringing
* / "181" ; Call Is Being Forwarded
* / "182" ; Queued
* / "183" ; Session Progress
*
* Success = "200" ; OK
*
* Redirection = "300" ; Multiple Choices
* / "301" ; Moved Permanently
* / "302" ; Moved Temporarily
* / "305" ; Use Proxy
* / "380" ; Alternative Service
*
* Client-Error = "400" ; Bad Request
* / "401" ; Unauthorized
* / "402" ; Payment Required
* / "403" ; Forbidden
* / "404" ; Not Found
* / "405" ; Method Not Allowed
* / "406" ; Not Acceptable
* / "407" ; Proxy Authentication Required
* / "408" ; Request Timeout
* / "410" ; Gone
* / "413" ; Request Entity Too Large
* / "414" ; Request-URI Too Large
* / "415" ; Unsupported Media Type
* / "416" ; Unsupported URI Scheme
* / "420" ; Bad Extension
* / "421" ; Extension Required
* / "423" ; Interval Too Brief
* / "480" ; Temporarily not available
* / "481" ; Call Leg/Transaction Does Not Exist
* / "482" ; Loop Detected
* / "483" ; Too Many Hops
* / "484" ; Address Incomplete
* / "485" ; Ambiguous
* / "486" ; Busy Here
* / "487" ; Request Terminated
* / "488" ; Not Acceptable Here
* / "491" ; Request Pending
* / "493" ; Undecipherable
*
* Server-Error = "500" ; Internal Server Error
* / "501" ; Not Implemented
* / "502" ; Bad Gateway
* / "503" ; Service Unavailable
* / "504" ; Server Time-out
* / "505" ; SIP Version not supported
* / "513" ; Message Too Large
*
* Global-Failure = "600" ; Busy Everywhere
* / "603" ; Decline
* / "604" ; Does not exist anywhere
* / "606" ; Not Acceptable
*
* Accept = "Accept" HCOLON
* [ accept-range *(COMMA accept-range) ]
* accept-range = media-range *(SEMI accept-param)
* ; Why not SLASH ? //PPe
* media-range = ( "*" "/" "*"
* / ( m-type SLASH "*" )
* / ( m-type SLASH m-subtype )
* ) *( SEMI m-parameter )
* accept-param = ("q" EQUAL qvalue) / generic-param
* qvalue = ( "0" [ "." 0*3DIGIT ] )
* / ( "1" [ "." 0*3("0") ] )
* generic-param = token [ EQUAL gen-value ]
* gen-value = token / host / quoted-string
*
* Accept-Encoding = "Accept-Encoding" HCOLON
* [ encoding *(COMMA encoding) ]
* encoding = codings *(SEMI accept-param)
* codings = content-coding / "*"
* content-coding = token
*
* Accept-Language = "Accept-Language" HCOLON
* [ language *(COMMA language) ]
* language = language-range *(SEMI accept-param)
* language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) / "*" )
*
* Alert-Info = "Alert-Info" HCOLON alert-param *(COMMA alert-param)
* alert-param = LAQUOT absoluteURI RAQUOT *( SEMI generic-param )
*
* Allow = "Allow" HCOLON [Method *(COMMA Method)]
*
* Authorization = "Authorization" HCOLON credentials
* credentials = ("Digest" LWS digest-response)
* / other-response
* digest-response = dig-resp *(COMMA dig-resp)
* dig-resp = username / realm / nonce / digest-uri
* / dresponse / algorithm / cnonce
* / opaque / message-qop
* / nonce-count / auth-param
* username = "username" EQUAL username-value
* username-value = quoted-string
* digest-uri = "uri" EQUAL LDQUOT digest-uri-value RDQUOT
* digest-uri-value = rquest-uri ; Equal to request-uri as specified
* by HTTP/1.1
* message-qop = "qop" EQUAL qop-value
* cnonce = "cnonce" EQUAL cnonce-value
* cnonce-value = nonce-value
* nonce-count = "nc" EQUAL nc-value
* nc-value = 8LHEX
* dresponse = "response" EQUAL request-digest
* request-digest = LDQUOT 32LHEX RDQUOT
* auth-param = auth-param-name EQUAL
* ( token / quoted-string )
* auth-param-name = token
* other-response = auth-scheme LWS auth-param
* *(COMMA auth-param)
* auth-scheme = token
*
* Authentication-Info = "Authentication-Info" HCOLON ainfo
* *(COMMA ainfo)
* ainfo = nextnonce / message-qop
* / response-auth / cnonce
* / nonce-count
* nextnonce = "nextnonce" EQUAL nonce-value
* response-auth = "rspauth" EQUAL response-digest
* response-digest = LDQUOT *LHEX RDQUOT
*
* Call-ID = ( "Call-ID" / "i" ) HCOLON callid
* callid = word [ "@" word ]
*
* Call-Info = "Call-Info" HCOLON info *(COMMA info)
* info = LAQUOT absoluteURI RAQUOT *( SEMI info-param)
* info-param = ( "purpose" EQUAL ( "icon" / "info"
* / "card" / token ) ) / generic-param
*
* Contact = ("Contact" / "m" ) HCOLON
* ( STAR / (contact-param *(COMMA contact-param)))
* contact-param = (name-addr / addr-spec) *(SEMI contact-params)
* name-addr = [ display-name ] LAQUOT addr-spec RAQUOT
* addr-spec = SIP-URI / SIPS-URI / absoluteURI
* display-name = *(token LWS)/ quoted-string
*
* contact-params = c-p-q / c-p-expires
* / contact-extension
* c-p-q = "q" EQUAL qvalue
* c-p-expires = "expires" EQUAL delta-seconds
* contact-extension = generic-param
* delta-seconds = 1*DIGIT
*
* Content-Disposition = "Content-Disposition" HCOLON
* disp-type *( SEMI disp-param )
* disp-type = "render" / "session" / "icon" / "alert"
* / disp-extension-token
* disp-param = handling-param / generic-param
* handling-param = "handling" EQUAL
* ( "optional" / "required"
* / other-handling )
* other-handling = token
* disp-extension-token = token
*
* Content-Encoding = ( "Content-Encoding" / "e" ) HCOLON
* content-coding *(COMMA content-coding)
*
* Content-Language = "Content-Language" HCOLON
* language-tag *(COMMA language-tag)
* language-tag = primary-tag *( "-" subtag )
* primary-tag = 1*8ALPHA
* subtag = 1*8ALPHA
*
* Content-Length = ( "Content-Length" / "l" ) HCOLON 1*DIGIT
* Content-Type = ( "Content-Type" / "c" ) HCOLON media-type
* media-type = m-type SLASH m-subtype *(SEMI m-parameter)
* m-type = discrete-type / composite-type
* discrete-type = "text" / "image" / "audio" / "video"
* / "application" / extension-token
* composite-type = "message" / "multipart" / extension-token
* extension-token = ietf-token / x-token
* ietf-token = token
* x-token = "x-" token
* m-subtype = extension-token / iana-token
* iana-token = token
* m-parameter = m-attribute EQUAL m-value
* m-attribute = token
* m-value = token / quoted-string
*
* CSeq = "CSeq" HCOLON 1*DIGIT LWS Method
*
* Date = "Date" HCOLON SIP-date
* SIP-date = rfc1123-date
* rfc1123-date = wkday "," SP date1 SP time SP "GMT"
* date1 = 2DIGIT SP month SP 4DIGIT
* ; day month year (e.g., 02 Jun 1982)
* time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
* ; 00:00:00 - 23:59:59
* wkday = "Mon" / "Tue" / "Wed"
* / "Thu" / "Fri" / "Sat" / "Sun"
* month = "Jan" / "Feb" / "Mar" / "Apr"
* / "May" / "Jun" / "Jul" / "Aug"
* / "Sep" / "Oct" / "Nov" / "Dec"
*
* Error-Info = "Error-Info" HCOLON error-uri *(COMMA error-uri)
* error-uri = LAQUOT absoluteURI RAQUOT *( SEMI generic-param )
*
* Expires = "Expires" HCOLON delta-seconds
* From = ( "From" / "f" ) HCOLON from-spec
* from-spec = ( name-addr / addr-spec )
* *( SEMI from-param )
* from-param = tag-param / generic-param
* tag-param = "tag" EQUAL token
*
* In-Reply-To = "In-Reply-To" HCOLON callid *(COMMA callid)
*
* Max-Forwards = "Max-Forwards" HCOLON 1*DIGIT
*
* MIME-Version = "MIME-Version" HCOLON 1*DIGIT "." 1*DIGIT
*
* Min-Expires = "Min-Expires" HCOLON delta-seconds
*
* Organization = "Organization" HCOLON [TEXT-UTF8-TRIM]
*
* Priority = "Priority" HCOLON priority-value
* priority-value = "emergency" / "urgent" / "normal"
* / "non-urgent" / other-priority
* other-priority = token
*
* Proxy-Authenticate = "Proxy-Authenticate" HCOLON challenge
* challenge = ("Digest" LWS digest-cln *(COMMA digest-cln))
* / other-challenge
* other-challenge = auth-scheme LWS auth-param
* *(COMMA auth-param)
* digest-cln = realm / domain / nonce
* / opaque / stale / algorithm
* / qop-options / auth-param
* realm = "realm" EQUAL realm-value
* realm-value = quoted-string
* domain = "domain" EQUAL LDQUOT URI
* *( 1*SP URI ) RDQUOT
* URI = absoluteURI / abs-path
* nonce = "nonce" EQUAL nonce-value
* nonce-value = quoted-string
* opaque = "opaque" EQUAL quoted-string
* stale = "stale" EQUAL ( "true" / "false" )
* algorithm = "algorithm" EQUAL ( "MD5" / "MD5-sess"
* / token )
* qop-options = "qop" EQUAL LDQUOT qop-value
* *("," qop-value) RDQUOT
* qop-value = "auth" / "auth-int" / token
*
* Proxy-Authorization = "Proxy-Authorization" HCOLON credentials
*
* Proxy-Require = "Proxy-Require" HCOLON option-tag
* *(COMMA option-tag)
* option-tag = token
*
* Record-Route = "Record-Route" HCOLON rec-route *(COMMA rec-route)
* rec-route = name-addr *( SEMI rr-param )
* rr-param = generic-param
*
* Reply-To = "Reply-To" HCOLON rplyto-spec
* rplyto-spec = ( name-addr / addr-spec )
* *( SEMI rplyto-param )
* rplyto-param = generic-param
* Require = "Require" HCOLON option-tag *(COMMA option-tag)
*
* Retry-After = "Retry-After" HCOLON delta-seconds
* [ comment ] *( SEMI retry-param )
*
* retry-param = ("duration" EQUAL delta-seconds)
* / generic-param
*
* Route = "Route" HCOLON route-param *(COMMA route-param)
* route-param = name-addr *( SEMI rr-param )
*
* Server = "Server" HCOLON server-val *(LWS server-val)
* server-val = product / comment
* product = token [SLASH product-version]
* product-version = token
*
* Subject = ( "Subject" / "s" ) HCOLON [TEXT-UTF8-TRIM]
*
* Supported = ( "Supported" / "k" ) HCOLON
* [option-tag *(COMMA option-tag)]
*
* Timestamp = "Timestamp" HCOLON 1*(DIGIT)
* [ "." *(DIGIT) ] [ LWS delay ]
* delay = *(DIGIT) [ "." *(DIGIT) ]
*
* To = ( "To" / "t" ) HCOLON ( name-addr
* / addr-spec ) *( SEMI to-param )
* to-param = tag-param / generic-param
*
* Unsupported = "Unsupported" HCOLON option-tag *(COMMA option-tag)
* User-Agent = "User-Agent" HCOLON server-val *(LWS server-val)
*
* Via = ( "Via" / "v" ) HCOLON via-parm *(COMMA via-parm)
* via-parm = sent-protocol LWS sent-by *( SEMI via-params )
* via-params = via-ttl / via-maddr
* / via-received / via-branch
* / via-extension
* via-ttl = "ttl" EQUAL ttl
* via-maddr = "maddr" EQUAL host
* via-received = "received" EQUAL (IPv4address / IPv6address)
* via-branch = "branch" EQUAL token
* via-extension = generic-param
* sent-protocol = protocol-name SLASH protocol-version
* SLASH transport
* protocol-name = "SIP" / token
* protocol-version = token
* transport = "UDP" / "TCP" / "TLS" / "SCTP"
* / other-transport
* sent-by = host [ COLON port ]
* ttl = 1*3DIGIT ; 0 to 255
*
* Warning = "Warning" HCOLON warning-value *(COMMA warning-value)
* warning-value = warn-code SP warn-agent SP warn-text
* warn-code = 3DIGIT
* warn-agent = hostport / pseudonym
* ; the name or pseudonym of the server adding
* ; the Warning header, for use in debugging
* warn-text = quoted-string
* pseudonym = token
*
* WWW-Authenticate = "WWW-Authenticate" HCOLON challenge
*
* extension-header = header-name HCOLON header-value
* header-name = token
* header-value = *(TEXT-UTF8char / UTF8-CONT / LWS)
* message-body = *OCTET
*/