sip-header
SIP header field parsers for Rust. RFC 3261 name-addr, Call-Info, History-Info (RFC 7044), Geolocation (RFC 6442), and conference-info (RFC 4575).
Sits between URI parsing (sip-uri) and full SIP stacks, handling the header-level grammar: display names, header parameters, and structured header values.
[]
= "0"
SipHeaderAddr — RFC 3261 name-addr
Parses [display-name] <URI> ;param=value with header-level parameters
(tag, expires, etc.):
use SipHeaderAddr;
let addr: SipHeaderAddr = r#""EXAMPLE CO" <sip:+15551234567@198.51.100.1>;tag=abc123"#
.parse.unwrap;
assert_eq!;
assert_eq!;
assert_eq!;
SipCallInfo — RFC 3261 §20.9
Parses Call-Info headers with URI + parameter entries:
use SipCallInfo;
let raw = "<urn:emergency:uid:callid:abc:bcf.example.com>;purpose=emergency-CallId,\
<https://adr.example.com/info>;purpose=EmergencyCallData.ProviderInfo";
let ci = parse.unwrap;
assert_eq!;
assert_eq!;
HistoryInfo — RFC 7044
Parses History-Info routing chains with embedded RFC 3326 Reason headers:
use HistoryInfo;
let raw = "<sip:alice@esrp.example.com>;index=1,\
<sip:sos@psap.example.com>;index=1.1";
let hi = parse.unwrap;
assert_eq!;
assert_eq!;
SipHeaderLookup trait
Typed accessors for any key-value store holding SIP headers:
use HashMap;
use SipHeaderLookup;
let mut headers = new;
headers.insert;
let ci = headers.call_info.unwrap.unwrap;
assert_eq!;
SipHeader enum — full IANA registry
The SipHeader enum covers all registered SIP header field names from
the IANA SIP Parameters
registry. Use it for typed lookups, or fall back to sip_header_str()
for unregistered headers.
Compact header forms (RFC 3261 §7.3.3)
All 20 IANA-registered compact forms are supported:
use SipHeader;
assert_eq!;
assert_eq!;
assert_eq!;
extract_header() matches both forms transparently — searching for
"From" also matches f: lines, and vice versa.
Modules
| Module | Description |
|---|---|
header_addr |
RFC 3261 name-addr with header-level parameters |
header |
SipHeader enum, SipHeaderLookup trait |
message |
Extract headers from raw SIP message text |
call_info |
RFC 3261 §20.9 Call-Info parser |
history_info |
RFC 7044 History-Info with RFC 3326 Reason |
geolocation |
RFC 6442 Geolocation header |
conference_info |
RFC 4575 conference event XML (feature: conference-info) |
Features
| Feature | Dependencies | Description |
|---|---|---|
serde |
serde | Serde derives on all types |
draft |
— | Widely-deployed headers from expired IETF drafts (Diversion, Remote-Party-ID) |
conference-info |
quick-xml, serde | RFC 4575 XML parsing |
Ecosystem
This crate is part of a Rust SIP/NG9-1-1 ecosystem:
- sip-uri — RFC 3261/3966/8141 URI parser
- sip-header — SIP header field parsers (this crate)
- eido — NENA NG9-1-1 emergency data types
- freeswitch-types — FreeSWITCH ESL protocol types (re-exports sip-header)
RFC coverage
- RFC 3261 — SIP name-addr, Call-Info, core header catalog
- RFC 3325 — P-Asserted-Identity, P-Preferred-Identity
- RFC 3326 — Reason header (embedded in History-Info)
- RFC 4575 — Conference event package XML (feature-gated)
- RFC 6442 — Geolocation header
- RFC 7044 — History-Info header
Development
RUSTDOCFLAGS="-D missing_docs -D rustdoc::broken_intra_doc_links"
The pre-commit hook validates the SipHeader enum against the IANA
registry (iana-sip-headers.txt).
License
MIT OR Apache-2.0 — see LICENSE-MIT and LICENSE-APACHE.