util::http::get_channel_settings (private)
util::http::get_channel_settings content_type
Defined in packages/acs-tcl/tcl/http-client-procs.tcl
Helper proc to get encoding based on content_type (From xotcl/tcl/http-client-procs)
- Parameters:
- content_type (required)
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.
Source code: # In the following, I realize an IANA/MIME charset resolution # scheme which is compliant with RFC 3023 which deals with # treating XML media types properly. # # see http://tools.ietf.org/html/rfc3023 # # This makes the use of [ns_encodingfortype] obsolete as this # helper proc does not consider RFC 3023 at all. In the future, # RFC 3023 support should enter a revised [ns_encodingfortype], # for now, we fork. # # The mappings between Tcl encoding names (as shown by [encoding # names]) and IANA/MIME charset names (i.e., names and aliases in # the sense of http://www.iana.org/assignments/character-sets) is # provided by ... # # i. a static, built-in correspondence map: see nsd/encoding.c # ii. an extensible correspondence map (i.e., the ns/charsets # section in config.tcl). # # For mapping charset to encoding names, I use # [ns_encodingforcharset]. # # Note, there are also alternatives for resolving IANA/MIME # charset names to Tcl encoding names, however, they all have # issues (non-extensibility from standard configuration sites, # incompleteness, redundant thread-local storing, scripted # implementation): # 1. tcllib/mime package: ::mime::reversemapencoding() # 2. tdom: tDOM::IANAEncoding2TclEncoding(); see lib/tdom.tcl # # RFC 3023 support (at least in my reading) demands the following # resolution order (see also Section 3.6 in RFC 3023), when # applied along with RFC 2616 (see especially Section 3.7.1 in RFC 2616) # # (A) Check for the "charset" parameter on certain (!) media types: # an explicitly stated, yet optional "charset" parameter is # permitted for all text/* media subtypes (RFC 2616) and selected # the XML media type classes listed by RFC 3023 (beyond the text/* # media type; e.g. "application/xml*", "*/*+xml", etc.). # # (B) If the "charset" is omitted, certain default values apply (!): # # (B.1) RFC 3023 text/* registrations default to us-ascii (!), # and not iso-8859-1 (overruling RFC 2616). # # (B.2) RFC 3023 application/* and non-text "+xml" registrations # are to be left untreated (in our context, no encoding # filtering is to be applied -> "binary") # # (B.3) RFC 2616 text/* registration (if not covered by B.1) # default to iso-8859-1 # # (B.4) RFC 4627 json defaults to utf-8 # # (C) If neither A or B apply (e.g., because an invalid charset # name was given to the charset parameter), we default to # "binary". This corresponds to the behavior of # [ns_encodingfortype]. Also note that the RFCs 3023 and 2616 do # not state any procedure when "invalid" charsets etc. are # identified. I assume, RFC-compliant clients have to ignore them # which means keep the channel in- and output unfiltered (encoding # = "binary"). This requires the client of the *HttpRequest* to # treat the data accordingly. # set enc "" if {[regexp {^text/.*$|^.*/json.*$|^.*/xml.*$|^.*\+xml.*$} $content_type]} { # Case (A): Check for an explicitly provided charset parameter if {[regexp {;\s*charset\s*=([^;]*)} $content_type _ charset]} { set enc [ns_encodingforcharset [string trim $charset]] } # Case (B.1) if {$enc eq "" && [regexp {^text/xml.*$|text/.*\+xml.*$} $content_type]} { set enc [ns_encodingforcharset us-ascii] } # Case (B.3) if {$enc eq "" && [string match "text/*" $content_type]} { set enc [ns_encodingforcharset iso-8859-1] } # Case (B.4) if {$enc eq "" && $content_type eq "application/json"} { set enc [ns_encodingforcharset utf-8] } } # Cases (C) and (B.2) are covered by the [expr] below. set enc [expr {$enc eq "" ? "binary" : $enc}] return $encXQL Not present: Generic, PostgreSQL, Oracle