/* * http://sofia-sip.org/repos/sofia-sip/libsofia-sip-ua/sip/GRAMMAR * * 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 */