.\" Copyright (c) 2003-2012 .\" Distributed Systems Software. All rights reserved. .\" See the file LICENSE for redistribution information. .\" $Id: copyright-nr 2564 2012-03-02 00:17:08Z brachman $ '\" t .\" Title: dacshttp .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.79.1 .\" Date: 02/19/2019 .\" Manual: DACS Commands Manual .\" Source: DACS 1.4.40 .\" Language: English .\" .TH "DACSHTTP" "1" "02/19/2019" "DACS 1.4.40" "DACS Commands Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" dacshttp \- perform an HTTP/HTTPS request .SH "SYNOPSIS" .HP \w'\fBdacshttp\fR\ 'u \fBdacshttp\fR [\fB\-get\fR | \fB\-post\fR | \fB\-delete\fR | \fB\-head\fR | \fB\-options\fR | \fB\-soptions\fR | \fB\-put\fR] [\fB\-ll\fR\ \fIlog_level\fR] .br [\fB\-prompt\fR] [\fB\-v\fR] [\fB\-\-version\fR] [[\fB\-ct\fR\ \fIstring\fR] | [\fB\-\-content\-type\fR\ \fIstring\fR]] .br [{\fB\-header\fR\ \fIname\fR\ \fIvalue\fR}...] [\fB\-headers\fR\ \fIfilename\fR] [\fB\-body\fR\ \fIfilename\fR] [\fB\-ih\fR] .br [\fB\-user\-agent\fR\ \fIstring\fR] [{\fB\-p\fR\ \fIname\fR\ \fIvalue\fR}...] [\fB\-proto\fR\ \fIversion\-num\fR] .br [\fB\-proxy\fR\ \fIproxyhost\fR:\fIproxyport\fR] [\fB\-proxymatch\fR\ \fIhostname\fR[:\fIport\fR]\ \fIproxyhost\fR:\fIproxyport\fR] .br [\fB\-f\fR\ \fIname\fR\ \fIfilename\fR] [{\fB\-cookies\fR\ \fIfilename\fR}...] [\fB\-ah\fR] .br [\fB\-ssl\fR\ \fIcommand\-line\fR] [\fB\-ssl\-flags\fR\ \fIflags\fR] .br [\fB\-u\fR\ \fIuserinfo\fR] [\fB\-U\fR\ \fIproxy\-userinfo\fR] \fIuri\fR .SH "DESCRIPTION" .PP This program is part of the \fBDACS\fR suite\&. It is a stand\-alone program that neither accepts the usual \fBDACS\fR command line options (\m[blue]\fBdacsoptions\fR\m[]\&\s-2\u[1]\d\s+2) nor accesses any \fBDACS\fR configuration files\&. .PP This general\-purpose utility sends an HTTP/HTTPS request for \fIuri\fR to a web server and prints the reply to its standard output\&. .PP \fBdacshttp\fR will automatically follow redirects according to \m[blue]\fBRFC 2616\fR\m[]\&\s-2\u[2]\d\s+2 and up to a compile\-time maximum, unless the \fB\-prompt\fR flag is given\&. A non\-standard extension is that a redirect to a non\-absolute URI is interpreted in a manner compatible with most browsers\&. .PP In versions 1\&.4\&.27b and earlier, this command was called \fBhttp\fR\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP \fBDACS\fR can issue its own HTTP requests, such as from \fBdacs_authenticate\fR to an external authentication module\&. This HTTP functionality is provided by the same support code that the \fBdacshttp\fR command uses, and therefore much of the following information applies to these internally generated requests also (e\&.g\&., \m[blue]\fBHTTP_PROG\fR\m[]\&\s-2\u[3]\d\s+2, \m[blue]\fBSSL_PROG\fR\m[]\&\s-2\u[4]\d\s+2, \m[blue]\fBSSL_PROG_ARGS\fR\m[]\&\s-2\u[5]\d\s+2, \m[blue]\fBSSL_PROG_CA_CRT\fR\m[]\&\s-2\u[6]\d\s+2, \m[blue]\fBSSL_PROG_CLIENT_CRT\fR\m[]\&\s-2\u[7]\d\s+2, \m[blue]\fBVFS\fR\m[]\&\s-2\u[8]\d\s+2)\&. .sp .5v .RE .SH "OPTIONS" .PP The HTTP GET method is used by default, but some flags implicitly select a different method (e\&.g\&., \fB\-f\fR and \fB\-p\fR)\&. One of the following flags can be used to explicitly specify the HTTP method, provided it is compatible with the other options: .PP \fB\-get\fR .RS 4 Use the GET method (the default)\&. .RE .PP \fB\-post\fR .RS 4 Use the POST method\&. .RE .PP \fB\-head\fR .RS 4 Use the HEAD method\&. .RE .PP \fB\-put\fR .RS 4 Use the PUT method\&. .RE .PP \fB\-delete\fR .RS 4 Use the DELETE method\&. .RE .PP \fB\-options\fR .RS 4 Use the OPTIONS method\&. .RE .PP \fB\-soptions\fR .RS 4 Use the OPTIONS method but ignore anything that follows the authority component of \fIuri\fR and instead use the special case "*" request URI that means that the request applies to the server itself rather than to a particular resource\&. .RE .PP These command line flags are also recognized: .PP \fB\-ah\fR .RS 4 If cookies (credentials) are to be sent (see \fB\-cookies\fR), use an Authorization header rather than a Cookie header\&. .RE .PP \fB\-body\fR \fIfilename\fR .RS 4 Read the message body from \fIfilename\fR\&. It is assumed that the body has already been appropriately formatted for the request\*(Aqs content type\&. .RE .PP \fB\-cookies\fR \fIfilename\fR .RS 4 Obtain cookies from \fIfilename\fR, one per line, to send with the request using the Cookie header\&. Multiple cookies are separated using a semi\-colon, which follows the \m[blue]\fBNetscape spec\fR\m[]\&\s-2\u[9]\d\s+2\&. Alternatively, multiple cookies can be combined on a single line, separated by either a semi\-colon or a comma (following \m[blue]\fBRFC 2109\fR\m[]\&\s-2\u[10]\d\s+2, \m[blue]\fBRFC 2965\fR\m[]\&\s-2\u[11]\d\s+2 or \m[blue]\fBRFC 6265\fR\m[]\&\s-2\u[12]\d\s+2)\&. This argument may be repeated\&. .RE .PP \fB\-ct\fR \fIstring\fR .br \fB\-\-content\-type\fR \fIstring\fR .RS 4 Set the Content\-Type request\-header to \fIstring\fR\&. If the request has an entity\-body, the default Content\-Type is application/x\-www\-form\-urlencoded; if the request does not have an entity\-body, by default the Content\-Type request\-header is not set\&. .RE .PP \fB\-f\fR \fIname\fR \fIfilename\fR .RS 4 Passes and encodes the contents of \fIfilename\fR as the value for name\&. By default, the POST method will be used, although PUT and OPTIONS can be selected\&. If \fIfilename\fR is "\fB\-\fR", the standard input is read; this form can only be used once on the command line\&. This argument may be repeated\&. .RE .PP \fB\-header\fR \fIname\fR \fIvalue\fR .RS 4 This flag, which may be repeated, causes the HTTP header \fIname\fR: \fIvalue\fR to be sent with the request\&. Neither \fIname\fR nor \fIvalue\fR are checked in any way\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br This will not override headers required or implied by other command line flags, and can result in multiple instances of the same header\&. For example, the following flags are not equivalent: .sp .if n \{\ .RS 4 .\} .nf \fB\-header\fR User\-Agent foo \fB\-user\-agent\fR foo .fi .if n \{\ .RE .\} .sp The former case will send the User\-Agent header twice\&. .sp .5v .RE .RE .PP \fB\-headers\fR \fIfilename\fR .RS 4 Read additional message headers from \fIfilename\fR, one per line, and send them with the request (refer to the \fB\-header\fR flag)\&. This flag may be repeated\&. .RE .PP \fB\-ih\fR .RS 4 Include the HTTP response headers in the output\&. They are terminated by a blank line\&. The status line is labelled "Status\-Line"\&. .RE .PP \fB\-ll\fR \fIlog_level\fR .RS 4 Set the debugging output level to \fIlog_level\fR (see \m[blue]\fBdacs(1)\fR\m[]\&\s-2\u[13]\d\s+2)\&. The default level is warn, and the \fB\-v\fR flag bumps the level to debug or trace\&. .RE .PP \fB\-p\fR \fIname\fR \fIvalue\fR .RS 4 Passes and encodes name=value as part of the entity\-body\&. By default, the POST method will be used, although PUT and OPTIONS can be selected\&. This argument may be repeated\&. .RE .PP \fB\-prompt\fR .RS 4 Prompt the user for permission to proceed after certain events, such as receiving a redirect; the response is affirmative only if it is "yes" or "y"\&. If this option is not specified, the affirmative action will automatically be taken\&. .RE .PP \fB\-proto\fR \fIversion\-num\fR .RS 4 Function in compliance with \fIversion\-num\fR of the HTTP protocol (e\&.g\&., 1\&.0)\&. .RE .PP \fB\-proxy\fR \fIproxyhost\fR:\fIproxyport\fR .RS 4 Forward all HTTP requests (except for those that match a \fB\-proxymatch\fR flag) to the proxy server at \fIproxyport\fR (a numeric port number or recognized service name) on \fIproxyhost\fR (a domain name or IP address)\&. Proxying is not fully supported by \fBdacshttp\fR, but it will connect to the specified proxy server instead of the server implied by \fIuri\fR\&. .RE .PP \fB\-proxymatch\fR \fIhostname\fR[:\fIport\fR] \fIproxyhost\fR:\fIproxyport\fR .RS 4 If \fIhostname\fR matches the host specified in \fIuri\fR, proxy the HTTP request through \fIproxyhost\fR (a domain name or IP address) at \fIproxyport\fR (a numeric port number or recognized service name)\&. If \fIport\fR is not given, it is assumed to be 80 (for the http scheme) or 443 (for the https scheme)\&. Matching is done by resolving \fIhostname\fR to an IP address (if necessary) and comparing it to the effective IP address that is specified by \fIuri\fR\&. This flag is given priority over the \fB\-proxy\fR flag, so it can be used to override a default proxy server\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br This option is not implemented\&. The SSL/TLS flags apply to \fIall\fR connections; this is probably a bug\&. .sp .5v .RE .RE .PP \fB\-ssl\fR \fIcommand\-line\fR .RS 4 This flag indicates that HTTPS (i\&.e, HTTP over an SSL/TLS connection) is to be used, regardless of the scheme specified by \fIuri\fR\&. Because \fBdacshttp\fR does not directly include SSL/TLS functionality, it uses pipes to communicate with an external program that provides the SSL/TLS connection\&. The \m[blue]\fBsslclient(1)\fR\m[]\&\s-2\u[14]\d\s+2 command is strongly recommended for this purpose (version 3\&.26 of \fBstunnel(1)\fR and \fBstunnel3\fR, which comes with some releases of \fBstunnel\-4\&.x\fR, might also work)\&. .sp The \fIcommand\-line\fR is a complete shell command line that will be used to run the program as a filter\&. For example, this argument might look like either of: .sp .if n \{\ .RS 4 .\} .nf \-ssl "/usr/local/dacs/bin/sslclient example\&.com:443" \-ssl "/usr/local/bin/stunnel \-c \-r example\&.com:443" .fi .if n \{\ .RE .\} .sp If the \fB\-ssl\fR argument is absent but the \fIuri\fR argument uses the https scheme, \fBdacshttp\fR will still try to use SSL/TLS\&. It will attempt to use \m[blue]\fBsslclient(1)\fR\m[]\&\s-2\u[14]\d\s+2 and assume it is in its default location\&. If the \fB\-ssl\fR argument is present but specifies only one string, that string is assumed to be the path to \m[blue]\fBsslclient(1)\fR\m[]\&\s-2\u[14]\d\s+2\&. The first example below will run \m[blue]\fBsslclient(1)\fR\m[]\&\s-2\u[14]\d\s+2 from /tmp/sslclient to connect to port 443 at example\&.com; the second example has the same effect but will run \m[blue]\fBsslclient(1)\fR\m[]\&\s-2\u[14]\d\s+2 from its default location: .sp .if n \{\ .RS 4 .\} .nf % dacshttp \-ssl "/tmp/sslclient" https://example\&.com % dacshttp https://example\&.com .fi .if n \{\ .RE .\} .sp .RE .PP \fB\-ssl\-flags\fR \fIflags\fR .RS 4 If SSL/TLS operation is enabled but the \fB\-ssl\fR flag is absent or did not simply specify a pathname, append \fIflags\fR to the list of arguments to be passed to the external SSL/TLS provider; when the \fB\-ssl\fR flag specifies more than one argument, this flag is ignored\&. The \fIflags\fR string is a space\-separated list of arguments\&. This flag may be repeated\&. .sp For example, in this example \fBdacshttp\fR will invoke \fBsslclient\fR with the two arguments \fI\-sm\fR and \fIbobo\&.example\&.com\fR: .sp .if n \{\ .RS 4 .\} .nf % dacshttp \-ssl\-flags "\-sm bobo\&.example\&.com" https://example\&.com .fi .if n \{\ .RE .\} .sp If a wildcard server certificate is used, it may be necessary to explicitly match all hosts within a specific domain: .sp .if n \{\ .RS 4 .\} .nf % dacshttp \-ssl\-flags "\-sm \&.*\e\&.example\e\&.com" https://example\&.com .fi .if n \{\ .RE .\} .sp .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBImportant\fR .ps -1 .br When called by \fBdacshttp\fR, error messages produced by \fBsslclient\fR may be lost\&. If you encounter problems with SSL/TLS operation, work with \m[blue]\fBsslclient(1)\fR\m[]\&\s-2\u[14]\d\s+2 to ensure that an SSL/TLS connection can be established, or to determine and resolve the problem\&. If you discover that \fBsslclient\fR requires command line flags for proper operation, you will need to make sure that \fBdacshttp\fR passes those flags to it\&. .sp .5v .RE .RE .PP \fB\-user\-agent\fR \fIstring\fR .RS 4 Set the User\-Agent request\-header to \fIstring\fR\&. If not provided, this string will have the prefix "DACS\-http/", followed by a \fBDACS\fR release identifier (example: "DACS\-http/1\&.4\&.1")\&. .RE .PP \fB\-u\fR \fIuserinfo\fR .br \fB\-\-user\fR \fIuserinfo\fR .RS 4 Send an Authorization header conforming to the HTTP Basic Authentication scheme (\m[blue]\fBRFC 2617\fR\m[]\&\s-2\u[15]\d\s+2)\&. The \fIuserinfo\fR consists of a username followed by a colon followed by the user\*(Aqs password\&. Since the password will be visible, use this flag with caution\&. .RE .PP \fB\-U\fR \fIproxy\-userinfo\fR .br \fB\-\-proxyuser\fR \fIproxy\-userinfo\fR .RS 4 Send a Proxy\-Authorization header conforming to the HTTP Basic Authentication scheme (\m[blue]\fBRFC 2617\fR\m[]\&\s-2\u[15]\d\s+2)\&. The \fIproxy\-userinfo\fR consists of a username, a colon, and then a password for the proxy server\&. Since the password will be visible, use this flag with caution\&. .RE .PP \fB\-v\fR .RS 4 Increase the level of debugging output\&. This will cause response headers to be displayed, for example\&. The flag may be repeated\&. .RE .PP \fB\-\-version\fR .RS 4 Print version information to stderr, then exit immediately\&. .RE .PP The \fIuri\fR argument is the URL to invoke\&. It may include a query string suffix (even if HTTP POST is selected)\&. Though not recommended because it is not secure, the \fIuri\fR may include a userinfo component (\m[blue]\fBRFC 2617\fR\m[]\&\s-2\u[15]\d\s+2)\&. .PP It is an error to attempt to send more than one Authorization header\&. .PP Whether selected implicitly or explicitly, the command line must specify exactly one of the HTTP methods\&. .PP Request headers specified using the \fB\-header\fR or \fB\-headers\fR flags are sent in the order in which the flags appear on the command line\&. If they are read from a file, there ordering is maintained\&. .SH "EXAMPLES" .PP The following will retrieve \m[blue]\fBRFC 2616\fR\m[]\&\s-2\u[2]\d\s+2 and save it in rfc2616\&.txt: .sp .if n \{\ .RS 4 .\} .nf % dacshttp "http://www\&.rfc\-editor\&.org/rfc/rfc2616\&.txt" > rfc2616\&.txt .fi .if n \{\ .RE .\} .PP This will do a GET on the given URL, passing the query string \fIfoo=baz\fR, and writing the result to stdout: .sp .if n \{\ .RS 4 .\} .nf % dacshttp "https://example\&.com/cgi\-bin/dacs/dacs_prenv?foo=baz" .fi .if n \{\ .RE .\} .PP This will do a POST on the given URL, passing two arguments: .sp .if n \{\ .RS 4 .\} .nf % dacshttp \-p foo baz \-p bar zork https://example\&.com/cgi\-bin/dacs/dacs_prenv .fi .if n \{\ .RE .\} .PP This will make an HTTP GET method request over SSL/TLS to the given URL: .sp .if n \{\ .RS 4 .\} .nf % dacshttp \-ssl "/usr/local/dacs/bin/sslclient example\&.com:443" \e https://example\&.com/cgi\-bin/dacs/dacs_prenv .fi .if n \{\ .RE .\} .PP These two commands are equivalent\&. They submit a request associated with username julia and password herpasswd, which causes an Authorization header conforming to the HTTP Basic Authentication scheme (\m[blue]\fBRFC 2617\fR\m[]\&\s-2\u[15]\d\s+2) to be sent: .sp .if n \{\ .RS 4 .\} .nf % dacshttp http://julia:herpasswd@example\&.com % dacshttp \-u julia:herpasswd http://example\&.com .fi .if n \{\ .RE .\} .SH "DIAGNOSTICS" .PP The program exits 0 if everything was fine, 1 if an error occurred\&. .SH "BUGS" .PP It can sometimes be a useful tool, but this program\*(Aqs primary purpose is for developing and testing \fBDACS\fR core functionality\&. There are many readily\-available and better HTTP clients\&. .PP Use of an SSL/TLS provider other than \m[blue]\fBsslclient(1)\fR\m[]\&\s-2\u[14]\d\s+2 is officially deprecated\&. \fBdacshttp\fR should not require an external program to provide SSL/TLS functionality\&. Recent development makes it doubtful that any other program will function properly with \fBdacshttp\fR\&. .PP \fBdacshttp\fR is only a partial implementation of \m[blue]\fBRFC 2616\fR\m[]\&\s-2\u[2]\d\s+2\&. It only talks HTTP (no other URI schemes are supported)\&. Received cookies are discarded\&. Authentication via \m[blue]\fBRFC 2617\fR\m[]\&\s-2\u[15]\d\s+2 is only partially implemented: a single username and password to authenticate the user submitting the request and/or a single username and password to gain access to a proxy server can be specified to be sent with the request\&. No client\-side caching of any kind is performed\&. .SH "SEE ALSO" .PP \m[blue]\fBsslclient(1)\fR\m[]\&\s-2\u[14]\d\s+2, \m[blue]\fBlynx(1)\fR\m[]\&\s-2\u[16]\d\s+2, \m[blue]\fBcurl(1)\fR\m[]\&\s-2\u[17]\d\s+2, \m[blue]\fBWget(1)\fR\m[]\&\s-2\u[18]\d\s+2, \m[blue]\fBRFC 1738\fR\m[]\&\s-2\u[19]\d\s+2, \m[blue]\fBRFC 2396\fR\m[]\&\s-2\u[20]\d\s+2, \m[blue]\fBRFC 2616\fR\m[]\&\s-2\u[2]\d\s+2, \m[blue]\fBRFC 3986\fR\m[]\&\s-2\u[21]\d\s+2 .SH "AUTHOR" .PP Distributed Systems Software (\m[blue]\fBwww\&.dss\&.ca\fR\m[]\&\s-2\u[22]\d\s+2) .SH "COPYING" .PP Copyright \(co 2003\-2014 Distributed Systems Software\&. See the \m[blue]\fBLICENSE\fR\m[]\&\s-2\u[23]\d\s+2 file that accompanies the distribution for licensing information\&. .SH "NOTES" .IP " 1." 4 dacsoptions .RS 4 \%http://dacs.dss.ca/man/dacs.1.html#dacsoptions .RE .IP " 2." 4 RFC 2616 .RS 4 \%http://www.rfc-editor.org/rfc/rfc2616.txt .RE .IP " 3." 4 HTTP_PROG .RS 4 \%http://dacs.dss.ca/man/dacs.conf.5.html#HTTP_PROG .RE .IP " 4." 4 SSL_PROG .RS 4 \%http://dacs.dss.ca/man/dacs.conf.5.html#SSL_PROG .RE .IP " 5." 4 SSL_PROG_ARGS .RS 4 \%http://dacs.dss.ca/man/dacs.conf.5.html#SSL_PROG_ARGS .RE .IP " 6." 4 SSL_PROG_CA_CRT .RS 4 \%http://dacs.dss.ca/man/dacs.conf.5.html#SSL_PROG_CA_CRT .RE .IP " 7." 4 SSL_PROG_CLIENT_CRT .RS 4 \%http://dacs.dss.ca/man/dacs.conf.5.html#SSL_PROG_CLIENT_CRT .RE .IP " 8." 4 VFS .RS 4 \%http://dacs.dss.ca/man/dacs.conf.5.html#VFS .RE .IP " 9." 4 Netscape spec .RS 4 \%http://web.archive.org/web/20070805052634/http://wp.netscape.com/newsref/std/cookie_spec.html .RE .IP "10." 4 RFC 2109 .RS 4 \%http://www.rfc-editor.org/rfc/rfc2109.txt .RE .IP "11." 4 RFC 2965 .RS 4 \%http://www.rfc-editor.org/rfc/rfc2965.txt .RE .IP "12." 4 RFC 6265 .RS 4 \%http://www.rfc-editor.org/rfc/rfc6265.txt .RE .IP "13." 4 dacs(1) .RS 4 \%http://dacs.dss.ca/man/dacs.1.html .RE .IP "14." 4 sslclient(1) .RS 4 \%http://dacs.dss.ca/man/sslclient.1.html .RE .IP "15." 4 RFC 2617 .RS 4 \%http://www.rfc-editor.org/rfc/rfc2617.txt .RE .IP "16." 4 lynx(1) .RS 4 \%http://lynx.isc.org .RE .IP "17." 4 curl(1) .RS 4 \%http://directory.fsf.org/All_Packages_in_Directory/cURL.html .RE .IP "18." 4 Wget(1) .RS 4 \%http://www.gnu.org/software/wget/wget.html .RE .IP "19." 4 RFC 1738 .RS 4 \%http://www.rfc-editor.org/rfc/rfc1738.txt .RE .IP "20." 4 RFC 2396 .RS 4 \%http://www.rfc-editor.org/rfc/rfc2396.txt .RE .IP "21." 4 RFC 3986 .RS 4 \%http://www.rfc-editor.org/rfc/rfc3986.txt .RE .IP "22." 4 www.dss.ca .RS 4 \%http://www.dss.ca .RE .IP "23." 4 LICENSE .RS 4 \%http://dacs.dss.ca/man/../misc/LICENSE .RE