smalltalk
/
osmo-st-sip
Archived
1
0
Fork 0
This repository has been archived on 2022-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
osmo-st-sip/grammar/SIPGrammar.st

184 lines
5.4 KiB
Smalltalk

"
(C) 2011 by Holger Hans Peter Freyther
All Rights Reserved
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"
PackageLoader fileInPackage: 'PetitParser'.
PP.PPCompositeParser subclass: SIPGrammar [
| Response StatusLine message_header
CRLF SP HTAB HCOLON SWS LWS WSP
message_body SIPVersion StatusCode ReasonPhrase
extension_header header_name header_value |
"http://sofia-sip.org/repos/sofia-sip/libsofia-sip-ua/sip/GRAMMAR"
<category: 'SIP-Core'>
<comment: 'I try to parse RFC3261'>
start [
<category: 'start'>
^ Response
]
CRLF [
<category: 'misc'>
^ Character cr asParser, Character nl asParser
]
SP [
<category: 'misc'>
^ $ asParser
]
Response [
<category: 'response'>
^ StatusLine, message_header star, CRLF, message_body optional
]
StatusLine [
<category: 'response'>
^ SIPVersion, SP, StatusCode, SP, ReasonPhrase, CRLF
]
SIPVersion [
<category: 'generic'>
^ 'SIP/' asParser, #digit asParser, $. asParser, #digit asParser
]
StatusCode [
<category: 'response'>
"Combined into one..."
^ '100' asParser / "Trying"
'180' asParser / "Ringing"
'181' asParser / "Call Is Being Forwarded"
'182' asParser / "Queued"
'183' asParser / "Session Progress"
'200' asParser / "OK"
'300' asParser / "Multiple Choices"
'301' asParser / "Moved Permanently"
'302' asParser / "Moved Temporarily"
'380' asParser / "Alternative Service"
'400' asParser / "Bad Request"
'401' asParser / "Unauthorized"
'402' asParser / "Payment Required"
'403' asParser / "Forbidden"
'404' asParser / "Not Found"
'405' asParser / "Method Not Allowed"
'406' asParser / "Not Acceptable"
'407' asParser / "Proxy Authentication Required"
'408' asParser / "Request Timeout"
'410' asParser / "Gone"
'413' asParser / "Request Entity Too Large"
'414' asParser / "Request-URI Too Large"
'415' asParser / "Unsupported Media Type"
'416' asParser / "Unsupported URI Scheme"
'420' asParser / "Bad Extension"
'421' asParser / "Extension Required"
'423' asParser / "Interval Too Brief"
'480' asParser / "Temporarily not available"
'481' asParser / "Call Leg/Transaction Does Not Exist"
'482' asParser / "Loop Detected"
'483' asParser / "Too Many Hops"
'484' asParser / "Address Incomplete"
'485' asParser / "Ambiguous"
'486' asParser / "Busy Here"
'487' asParser / "Request Terminated"
'488' asParser / "Not Acceptable Here"
'491' asParser / "Request Pending"
'493' asParser / "Undecipherable"
'500' asParser / "Internal Server Error"
'501' asParser / "Not Implemented"
'502' asParser / "Bad Gateway"
'503' asParser / "Service Unavailable"
'504' asParser / "Server Time-out"
'505' asParser / "SIP Version not supported"
'513' asParser / "Message Too Large"
'600' asParser / "Busy Everywhere"
'603' asParser /"Decline"
'604' asParser /"Does not exist anywhere"
'606' asParser "Not Acceptable"
]
ReasonPhrase [
<category: 'response'>
^ (#digit asParser / Character space asParser / HTAB / #letter asParser) star flatten
]
message_header [
"Simplified..."
<category: 'generic'>
^ (extension_header), CRLF
]
message_body [
^ #any asParser plus flatten
]
extension_header [
<category: 'generic'>
^ header_name, HCOLON, header_value
]
header_name [
<category: 'generic'>
"hmm 1*() should be optional but it must be star here"
^ (#letter asParser / #digit asParser /
$- asParser / $. asParser /
$! asParser / $% asParser /
$* asParser / $_ asParser /
$+ asParser / $` asParser /
$' asParser / $~ asParser) star flatten
]
header_value [
<category: 'generic'>
"TODO: TEXT-UTF8char / UTF8-CONT"
^ (#letter asParser / #digit asParser / #punctuation asParser / #blank asParser / LWS) star flatten
]
HTAB [
<category: 'generic'>
^ Character tab asParser
]
HCOLON [
<category: 'generic'>
^ (SP / HTAB) star, $: asParser, SWS
]
WSP [
<category: 'misc'>
^ #blank asParser
]
LWS [
<category: 'generic'>
(WSP star, CRLF) optional, WSP plus
]
SWS [
<category: 'generic'>
^ LWS optional
]
]