Provided by: tcllib_1.21+dfsg-1_all bug

NAME

       S3 - Amazon S3 Web Service Interface

SYNOPSIS

       package require Tcl  8.5

       package require S3  ?1.0.3?

       package require sha1  1.0

       package require md5  2.0

       package require base64  2.3

       package require xsxp  1.0

       S3::Configure    ?-reset    boolean?    ?-retries    integer?    ?-accesskeyid   idstring?
       ?-secretaccesskey idstring? ?-service-access-point  FQDN?  ?-use-tls  boolean?  ?-default-
       compare   always|never|exists|missing|newer|date|checksum|different?   ?-default-separator
       string? ?-default-acl  private|public-read|public-read-write|authenticated-read|keep|calc?
       ?-default-bucket bucketname?

       S3::SuggestBucket ?name?

       S3::REST dict

       S3::ListAllMyBuckets    ?-blocking    boolean?    ?-parse-xml   xmlstring?   ?-result-type
       REST|xml|pxml|dict|names|owner?

       S3::PutBucket  ?-bucket   bucketname?   ?-blocking   boolean?   ?-acl   {}|private|public-
       read|public-read-write|authenticated-read?

       S3::DeleteBucket ?-bucket bucketname? ?-blocking boolean?

       S3::GetBucket  ?-bucket bucketname? ?-blocking boolean? ?-parse-xml xmlstring? ?-max-count
       integer?    ?-prefix    prefixstring?    ?-delimiter    delimiterstring?     ?-result-type
       REST|xml|pxml|names|dict?

       S3::Put  ?-bucket  bucketname? -resource resourcename ?-blocking boolean? ?-file filename?
       ?-content   contentstring?   ?-acl    private|public-read|public-read-write|authenticated-
       read|calc|keep?  ?-content-type  contenttypestring? ?-x-amz-meta-* metadatatext? ?-compare
       comparemode?

       S3::Get  ?-bucket  bucketname?  -resource  resourcename  ?-blocking   boolean?   ?-compare
       comparemode?  ?-file  filename?  ?-content  contentvarname? ?-timestamp aws|now? ?-headers
       headervarname?

       S3::Head  ?-bucket  bucketname?  -resource   resourcename   ?-blocking   boolean?   ?-dict
       dictvarname? ?-headers headersvarname? ?-status statusvarname?

       S3::GetAcl  ?-blocking  boolean? ?-bucket bucketname? -resource resourcename ?-result-type
       REST|xml|pxml?

       S3::PutAcl ?-blocking boolean? ?-bucket bucketname? -resource resourcename ?-acl new-acl?

       S3::Delete  ?-bucket  bucketname?  -resource  resourcename  ?-blocking  boolean?  ?-status
       statusvar?

       S3::Push  ?-bucket  bucketname?  -directory directoryname ?-prefix prefixstring? ?-compare
       comparemode?  ?-x-amz-meta-*  metastring?  ?-acl  aclcode?   ?-delete   boolean?   ?-error
       throw|break|continue? ?-progress scriptprefix?

       S3::Pull  ?-bucket  bucketname? -directory directoryname ?-prefix prefixstring? ?-blocking
       boolean?  ?-compare  comparemode?   ?-delete   boolean?   ?-timestamp   aws|now?   ?-error
       throw|break|continue? ?-progress scriptprefix?

       S3::Toss   ?-bucket   bucketname?   -prefix   prefixstring   ?-blocking  boolean?  ?-error
       throw|break|continue? ?-progress scriptprefix?

_________________________________________________________________________________________________

DESCRIPTION

       This package provides access to Amazon's Simple Storage Solution web service.

       As a quick summary, Amazon Simple Storage Solution provides a for-fee web service allowing
       the   storage   of   arbitrary   data   as   "resources"  within  "buckets"  online.   See
       http://www.amazonaws.com/ for details on that system.  Access to the service is  via  HTTP
       (SOAP  or  REST).   Much  of this documentation will not make sense if you're not familiar
       with the terms and functionality of the Amazon S3 service.

       This package provides services for reading  and  writing  the  data  items  via  the  REST
       interface.   It  also  provides  some higher-level operations.  Other packages in the same
       distribution provide for even more functionality.

       Copyright 2006 Darren New. All Rights Reserved.  NO WARRANTIES OF ANY TYPE  ARE  PROVIDED.
       COPYING  OR  USE  INDEMNIFIES  THE  AUTHOR  IN  ALL WAYS.  This software is licensed under
       essentially the same terms as Tcl. See LICENSE.txt for the terms.

ERROR REPORTING

       The error reporting from this package makes use of $errorCode to provide more  details  on
       what  happened  than simply throwing an error.  Any error caught by the S3 package (and we
       try to catch them all) will return with an $errorCode being a list having at  least  three
       elements.  In  all  cases, the first element will be "S3". The second element will take on
       one of six values, with that element defining  the  value  of  the  third  and  subsequent
       elements.  S3::REST does not throw an error, but rather returns a dictionary with the keys
       "error", "errorInfo", and "errorCode" set. This allows for reliable  background  use.  The
       possible second elements are these:

       usage  The  usage  of  the  package  is incorrect. For example, a command has been invoked
              which requires the library to be configured before the library has been configured,
              or  an  invalid  combination  of  options  has been specified. The third element of
              $errorCode supplies the name of the parameter that was wrong.  The  fourth  usually
              provides the arguments that were actually supplied to the throwing proc, unless the
              usage error isn't confined to a single proc.

       local  Something happened on the local system which threw an error. For example, a request
              to  upload or download a file was made and the file permissions denied that sort of
              access. The third element of $errorCode is the original $errorCode.

       socket Something happened with the socket. It closed prematurely, or some other  condition
              of failure-to-communicate-with-Amazon was detected. The third element of $errorCode
              is the original $errorCode, or sometimes the message from fcopy, or ...?

       remote The Amazon web service returned an error code outside the 2xx  range  in  the  HTTP
              header.  In other words, everything went as documented, except this particular case
              was documented not to work.  The third element  is  the  dictionary  returned  from
              ::S3::REST.   Note  that  S3::REST itself never throws this error, but just returns
              the dictionary. Most of the higher-level commands throw for convenience, unless  an
              argument  indicates they should not. If something is documented as "not throwing an
              S3 remote error", it means a status return is set rather than throwing an error  if
              Amazon returns a non-2XX HTTP result code.

       notyet The  user  obeyed  the  documentation,  but the author has not yet gotten around to
              implementing  this  feature.  (Right  now,  only  TLS  support  and   sophisticated
              permissions fall into this category, as well as the S3::Acl command.)

       xml    The  service  has  returned invalid XML, or XML whose schema is unexpected. For the
              high-level commands that accept service XML as input for parsing, this may also  be
              thrown.

COMMANDS

       This package provides several separate levels of complexity.

       •      The  lowest  level  simply  takes  arguments to be sent to the service, sends them,
              retrieves the result, and provides it to the caller.  Note: This layer allows  both
              synchronous  and event-driven processing. It depends on the MD5 and SHA1 and base64
              packages  from  Tcllib  (available  at  http://core.tcl.tk/tcllib/).    Note   that
              S3::Configure  is  required for S3::REST to work due to the authentication portion,
              so we put that in the "lowest level."

       •      The next layer parses the results of calls,  allowing  for  functionality  such  as
              uploading  only  changed  files,  synchronizing directories, and so on.  This layer
              depends on the TclXML package as well as the included xsxp package. These  packages
              are  package required when these more-sophisticated routines are called, so nothing
              breaks if they are not correctly installed.

       •      Also included is a separate program that uses the library.   It  provides  code  to
              parse $argv0 and $argv from the command line, allowing invocation as a tclkit, etc.
              (Not yet implmented.)

       •      Another separate program provides a GUI interface allowing drag-and-drop and  other
              such functionality. (Not yet implemented.)

       •      Also built on this package is the OddJob program. It is a separate program designed
              to allow distribution of computational work units  over  Amazon's  Elastic  Compute
              Cloud web service.

       The  goal  is  to  have at least the bottom-most layers implemented in pure Tcl using only
       that which comes from widely-available sources, such as Tcllib.

LOW LEVEL COMMANDS

       These commands do not require any packages not listed above.  They talk  directly  to  the
       service,  or  they are utility or configuration routines. Note that the "xsxp" package was
       written to support this package, so it should be available wherever you got this package.

       S3::Configure   ?-reset    boolean?    ?-retries    integer?    ?-accesskeyid    idstring?
       ?-secretaccesskey  idstring?  ?-service-access-point  FQDN?  ?-use-tls boolean? ?-default-
       compare   always|never|exists|missing|newer|date|checksum|different?   ?-default-separator
       string?  ?-default-acl private|public-read|public-read-write|authenticated-read|keep|calc?
       ?-default-bucket bucketname?
              There is one command for configuration, and that is S3::Configure.  If called  with
              no  arguments,  it  returns  a  dictionary  of  key/value pairs listing all current
              settings.  If called with one  argument,  it  returns  the  value  of  that  single
              argument.   If  called  with two or more arguments, it must be called with pairs of
              arguments, and it applies  the  changes  in  order.   There  is  only  one  set  of
              configuration information per interpreter.

              The following options are accepted:

              -reset boolean
                     By  default,  false.   If  true, any previous changes and any changes on the
                     same call before the reset option will be returned to default values.

              -retries integer
                     Default value is 3.  If Amazon  returns  a  500  error,  a  retry  after  an
                     exponential  backoff  delay  will  be  tried  this many times before finally
                     throwing the 500 error. This applies to  each  call  to  S3::REST  from  the
                     higher-level  commands,  but not to S3::REST itself.  That is, S3::REST will
                     always return httpstatus 500 if that's  what  it  receives.  Functions  like
                     S3::Put  will retry the PUT call, and will also retry the GET and HEAD calls
                     used to do content comparison.  Changing this to 0 will prevent retries  and
                     their  associated  delays.   In  addition, socket errors (i.e., errors whose
                     errorCode starts with "S3 socket") will be similarly retried after backoffs.

              -accesskeyid idstring

              -secretaccesskey idstring
                     Each defaults to an empty string.  These must be set before  any  calls  are
                     made.  This  is  your  S3  ID.   Once  you  sign  up  for  an account, go to
                     http://www.amazonaws.com/, sign in, go to the "Your  Web  Services  Account"
                     button,  pick  "AWS  Access  Identifiers", and your access key ID and secret
                     access keys will be available. All S3::REST calls are authenticated.   Blame
                     Amazon for the poor choice of names.

              -service-access-point FQDN
                     Defaults  to  "s3.amazonaws.com". This is the fully-qualified domain name of
                     the server to contact for S3::REST calls. You should probably never need  to
                     touch this, unless someone else implements a compatible service, or you wish
                     to test something by pointing the library at your own service.

              -slop-seconds integer
                     When comparing dates between Amazon and the local machine, two dates  within
                     this  many  seconds  of each other are considered the same. Useful for clock
                     drift correction, processing overhead time, and so on.

              -use-tls boolean
                     Defaults to false. This is not  yet  implemented.  If  true,  S3::REST  will
                     negotiate  a TLS connection to Amazon. If false, unencrypted connections are
                     used.

              -bucket-prefix string
                     Defaults to "TclS3".  This string is used by S3::SuggestBucketName  if  that
                     command  is passed an empty string as an argument. It is used to distinguish
                     different applications using the Amazon service.   Your  application  should
                     always  set this to keep from interfering with the buckets of other users of
                     Amazon S3 or with other buckets of the same user.

              -default-compare always|never|exists|missing|newer|date|checksum|different
                     Defaults to "always." If no -compare is specified on  S3::Put,  S3::Get,  or
                     S3::Delete,  this  comparison is used.  See those commands for a description
                     of the meaning.

              -default-separator string
                     Defaults to "/". This is currently unused. It might make sense to  use  this
                     for  S3::Push  and S3::Pull, but allowing resources to have slashes in their
                     names that aren't marking directories  would  be  problematic.  Hence,  this
                     currently does nothing.

              -default-acl private|public-read|public-read-write|authenticated-read|keep|calc
                     Defaults  to  an empty string. If no -acl argument is provided to S3::Put or
                     S3::Push, this string is used (given as the x-amz-acl header if not keep  or
                     calc). If this is also empty, no x-amz-acl header is generated.  This is not
                     used by S3::REST.

              -default-bucket bucketname
                     If no bucket is given to  S3::GetBucket,  S3::PutBucket,  S3::Get,  S3::Put,
                     S3::Head,  S3::Acl, S3::Delete, S3::Push, S3::Pull, or S3::Toss, and if this
                     configuration variable is not an empty string (and  not  simply  "/"),  then
                     this value will be used for the bucket. This is useful if one program does a
                     large amount of resource manipulation within a single bucket.

       S3::SuggestBucket ?name?
              The S3::SuggestBucket command accepts an optional string as a prefix and returns  a
              valid  bucket  containing  the  name argument and the Access Key ID. This makes the
              name unique to the owner and to the application (assuming the application  picks  a
              good  name argument).  If no name is provided, the name from S3::Configure -bucket-
              prefix is used.  If that too is empty (which is  not  the  default),  an  error  is
              thrown.

       S3::REST dict
              The  S3::REST  command  takes as an argument a dictionary and returns a dictionary.
              The return dictionary has the same keys  as  the  input  dictionary,  and  includes
              additional  keys  as  the  result.   The  presence  or absence of keys in the input
              dictionary can control the behavior of the  routine.   It  never  throws  an  error
              directly,  but  includes  keys  "error", "errorInfo", and "errorCode" if necessary.
              Some keys are required, some optional. The routine can run either  in  blocking  or
              non-blocking mode, based on the presense of resultvar in the input dictionary. This
              requires the -accesskeyid and -secretaccesskey to be configured  via  S3::Configure
              before being called.

              The possible input keys are these:

              verb GET|PUT|DELETE|HEAD
                     This required item indicates the verb to be used.

              resource string
                     This  required  item  indicates the resource to be accessed.  A leading / is
                     added if not there already. It will be URL-encoded for you if necessary.  Do
                     not supply a resource name that is already URL-encoded.

              ?rtype torrent|acl?
                     This  indicates  a  torrent  or  acl  resource is being manipulated.  Do not
                     include this in the resource key, or the "?" separator will get URL-encoded.

              ?parameters dict?
                     This optional dictionary provides  parameters  added  to  the  URL  for  the
                     transaction. The keys must be in the correct case (which is confusing in the
                     Amazon documentation) and the values must be valid. This  can  be  an  empty
                     dictionary  or omitted entirely if no parameters are desired. No other error
                     checking on parameters is performed.

              ?headers dict?
                     This optional dictionary provides headers to be added to the  HTTP  request.
                     The  keys  must  be in lower case for the authentication to work. The values
                     must not contain embedded newlines or carriage returns.  This  is  primarily
                     useful  for  adding  x-amz-*  headers. Since authentication is calculated by
                     S3::REST, do not add that header here.  Since content-type gets its own key,
                     also do not add that header here.

              ?inbody contentstring?
                     This  optional item, if provided, gives the content that will be sent. It is
                     sent with a tranfer encoding of binary, and only the low bytes are used,  so
                     use  [encoding  convertto  utf-8]  if  the string is a utf-8 string. This is
                     written all in one blast, so if you are  using  non-blocking  mode  and  the
                     inbody is especially large, you may wind up blocking on the write socket.

              ?infile filename?
                     This  optional  item,  if provided, and if inbody is not provided, names the
                     file from which the body of the HTTP message will be constructed.  The  file
                     is  opened  for  reading and sent progressively by [fcopy], so it should not
                     block in non-blocking mode even if the file  is  very  large.  The  file  is
                     transfered in binary mode, so the bytes on your disk will match the bytes in
                     your resource. Due to HTTP restrictions, it must be possible  to  use  [file
                     size] on this file to determine the size at the start of the transaction.

              ?S3chan channel?
                     This  optional  item,  if  provided,  indicates the already-open socket over
                     which the transaction should be conducted. If not provided, a connection  is
                     made  to  the  service  access  point  specified via S3::Configure, which is
                     normally s3.amazonaws.com. If this is provided, the channel is not closed at
                     the end of the transaction.

              ?outchan channel?
                     This optional item, if provided, indicates the already-open channel to which
                     the body returned from S3 should be written. That is, to  retrieve  a  large
                     resource, open a file, set the translation mode, and pass the channel as the
                     value of the key outchan. Output will be written to the channel in pieces so
                     memory  does not fill up unnecessarily. The channel is not closed at the end
                     of the transaction.

              ?resultvar varname?
                     This optional item, if provided, indicates that S3::REST should run in  non-
                     blocking  mode.  The  varname  should  be  fully  qualified  with respect to
                     namespaces and cannot be local to a proc. If provided,  the  result  of  the
                     S3::REST  call  is  assigned to this variable once everything has completed;
                     use trace or vwait to know when this has  happened.   If  this  key  is  not
                     provided,  the  result  is  simply returned from the call to S3::REST and no
                     calls to the eventloop are invoked from within this call.

              ?throwsocket throw|return?
                     This optional item, if provided, indicates that  S3::REST  should  throw  an
                     error if throwmode is throw and a socket error is encountered.  It indicates
                     that S3::REST should return the error code in the returned dictionary  if  a
                     socket error is encountered and this is set to return. If throwsocket is set
                     to return or if the call is not blocking, then  a  socket  error  (i.e.,  an
                     error  whose  error  code  starts  with  "S3 socket" will be returned in the
                     dictionary as error, errorInfo, and errorCode.  If a foreground call is made
                     (i.e., resultvar is not provided), and this option is not provided or is set
                     to throw, then error will be invoked instead.

       Once the call to S3::REST completes, a new dict is returned, either in the resultvar or as
       the  result  of execution. This dict is a copy of the original dict with the results added
       as new keys. The possible new keys are these:

              error errorstring

              errorInfo errorstring

              errorCode errorstring
                     If an error is caught, these three keys will be set  in  the  result.   Note
                     that  S3::REST does not consider a non-2XX HTTP return code as an error. The
                     errorCode  value  will  be  formatted  according  to  the  ERROR   REPORTING
                     description.  If these are present, other keys described here might not be.

              httpstatus threedigits
                     The three-digit code from the HTTP transaction. 2XX for good, 5XX for server
                     error, etc.

              httpmessage text
                     The textual result after the status code. "OK" or "Forbidden" or etc.

              outbody contentstring
                     If outchan was not  specified,  this  key  will  hold  a  reference  to  the
                     (unencoded)  contents  of the body returned.  If Amazon returned an error (a
                     la the httpstatus not a 2XX value), the error message will be in outbody  or
                     written to outchan as appropriate.

              outheaders dict
                     This  contains  a  dictionary  of  headers returned by Amazon.  The keys are
                     always lower case. It's mainly useful for finding the x-amz-meta-*  headers,
                     if any, although things like last-modified and content-type are also useful.
                     The keys of this dictionary are always lower case.  Both keys and values are
                     trimmed of extraneous whitespace.

HIGH LEVEL COMMANDS

       The  routines  in  this  section all make use of one or more calls to S3::REST to do their
       work, then parse and manage the data in a convenient way.  All these commands throw errors
       as described in ERROR REPORTING unless otherwise noted.

       In  all these commands, all arguments are presented as name/value pairs, in any order. All
       the argument names start with a hyphen.

       There are a few options that are common to many of the commands, and those common  options
       are documented here.

       -blocking boolean
              If provided and specified as false, then any calls to S3:REST will be non-blocking,
              and internally these routines will call [vwait] to get the results. In other words,
              these  routines  will  return  the same value, but they'll have event loops running
              while waiting for Amazon.

       -parse-xml xmlstring
              If provided, the routine skips actually  communicating  with  Amazon,  and  instead
              behaves  as  if the XML string provided was returned as the body of the call. Since
              several of these routines allow  the  return  of  data  in  various  formats,  this
              argument  can be used to parse existing XML to extract the bits of information that
              are needed. It's also helpful for testing.

       -bucket bucketname
              Almost every high-level command needs to know what bucket  the  resources  are  in.
              This  option  specifies  that. (Only the command to list available buckets does not
              require this parameter.)  This does not need to be URL-encoded, even if it contains
              special  or non-ASCII characters. May or may not contain leading or trailing spaces
              - commands normalize the bucket. If this is not supplied, the value is  taken  from
              S3::Configure  -default-bucket  if  that  string  isn't empty. Note that spaces and
              slashes are always trimmed from both ends and the rest must leave a valid bucket.

       -resource resourcename
              This specifies the resource of interest within the bucket.  It may or may not start
              with  a slash - both cases are handled.  This does not need to be URL-encoded, even
              if it contains special or non-ASCII characters.

       -compare always|never|exists|missing|newer|date|checksum|different
              When commands copy resources to files or files to resources, the caller may specify
              that  the  copy  should  be  skipped  if  the  contents are the same. This argument
              specifies the conditions under which the files should  be  copied.  If  it  is  not
              passed,  the  result  of  S3::Configure  -default-compare  is  used,  which in turn
              defaults to "always." The meanings of the various values are these:

              always Always copy the data. This is the default.

              never  Never copy the data. This is essentially a no-op,  except  in  S3::Push  and
                     S3::Pull where the -delete flag might make a difference.

              exists Copy the data only if the destination already exists.

              missing
                     Copy the data only if the destination does not already exist.

              newer  Copy the data if the destination is missing, or if the date on the source is
                     newer than the date on the destination  by  at  least  S3::Configure  -slop-
                     seconds  seconds.  If the source is Amazon, the date is taken from the Last-
                     Modified header. If the source is local, it is taken as  the  mtime  of  the
                     file.  If the source data is specified in a string rather than a file, it is
                     taken as right now, via [clock seconds].

              date   Like newer, except copy if the date is newer or older.

              checksum
                     Calculate the MD5 checksum on the local file or string, ask Amazon  for  the
                     eTag  of the resource, and copy the data if they're different. Copy the data
                     also if the destination is missing. Note that this can be  slow  with  large
                     local files unless the C version of the MD5 support is available.

              different
                     Copy  the data if the destination does not exist.  If the destination exists
                     and an actual file name was specified (rather than a  content  string),  and
                     the  date  on the file differs from the date on the resource, copy the data.
                     If the data is provided as a content string, the "date" is treated as "right
                     now",  so it will likely always differ unless slop-seconds is large.  If the
                     dates are the same, the MD5 checksums are compared, and the data  is  copied
                     if the checksums differ.

       Note  that  "newer"  and "date" don't care about the contents, and "checksum" doesn't care
       about the dates, but "different" checks both.

       S3::ListAllMyBuckets   ?-blocking   boolean?    ?-parse-xml    xmlstring?    ?-result-type
       REST|xml|pxml|dict|names|owner?
              This  routine performs a GET on the Amazon S3 service, which is defined to return a
              list of buckets owned by the account identified by the authorization header. (Blame
              Amazon for the dumb names.)

              -blocking boolean
                     See above for standard definition.

              -parse-xml xmlstring
                     See above for standard definition.

              -result-type REST
                     The   dictionary   returned   by   S3::REST   is   the   return   value   of
                     S3::ListAllMyBuckets. In this case, a non-2XX httpstatus will not  throw  an
                     error. You may not combine this with -parse-xml.

              -result-type xml
                     The  raw  XML  of  the  body  is  returned  as  the result (with no encoding
                     applied).

              -result-type pxml
                     The XML of the body as parsed by xsxp::parse is returned.

              -result-type dict
                     A dictionary of interesting portions of the XML is returned. The  dictionary
                     contains the following keys:

                     Owner/ID
                            The Amazon AWS ID (in hex) of the owner of the bucket.

                     Owner/DisplayName
                            The Amazon AWS ID's Display Name.

                     Bucket/Name
                            A list of names, one for each bucket.

                     Bucket/CreationDate
                            A  list  of  dates,  one  for  each  bucket,  in  the  same  order as
                            Bucket/Name, in ISO format (as returned by Amazon).

              -result-type names
                     A list of bucket names is returned with all other information stripped  out.
                     This is the default result type for this command.

              -result-type owner
                     A list containing two elements is returned. The first element is the owner's
                     ID, and the second is the owner's display name.

       S3::PutBucket  ?-bucket   bucketname?   ?-blocking   boolean?   ?-acl   {}|private|public-
       read|public-read-write|authenticated-read?
              This  command  creates  a  bucket  if  it  does not already exist. Bucket names are
              globally unique, so you may get a "Forbidden" error from Amazon even if you  cannot
              see  the bucket in S3::ListAllMyBuckets. See S3::SuggestBucket for ways to minimize
              this risk. The x-amz-acl header comes from the -acl option, or  from  S3::Configure
              -default-acl if not specified.

       S3::DeleteBucket ?-bucket bucketname? ?-blocking boolean?
              This  command  deletes  a bucket if it is empty and you have such permission.  Note
              that  Amazon's  list  of  buckets  is  a  global  resource,   requiring   far-flung
              synchronization.  If  you delete a bucket, it may be quite a few minutes (or hours)
              before you can recreate it, yielding "Conflict" errors until then.

       S3::GetBucket ?-bucket bucketname? ?-blocking boolean? ?-parse-xml xmlstring?  ?-max-count
       integer?     ?-prefix    prefixstring?    ?-delimiter    delimiterstring?    ?-result-type
       REST|xml|pxml|names|dict?
              This lists the contents of a bucket. That is, it returns  a  directory  listing  of
              resources within a bucket, rather than transfering any user data.

              -bucket bucketname
                     The standard bucket argument.

              -blocking boolean
                     The standard blocking argument.

              -parse-xml xmlstring
                     The standard parse-xml argument.

              -max-count integer
                     If  supplied,  this  is  the  most number of records to be returned.  If not
                     supplied, the code will iterate until all  records  have  been  found.   Not
                     compatible  with -parse-xml. Note that if this is supplied, only one call to
                     S3::REST will be made. Otherwise, enough calls will be made to  exhaust  the
                     listing,  buffering  results  in  memory,  so take care if you may have huge
                     buckets.

              -prefix prefixstring
                     If present, restricts listing to resources with  a  particular  prefix.  One
                     leading / is stripped if present.

              -delimiter delimiterstring
                     If  present,  specifies  a  delimiter for the listing.  The presence of this
                     will summarize multiple  resources  into  one  entry,  as  if  S3  supported
                     directories. See the Amazon documentation for details.

              -result-type REST|xml|pxml|names|dict
                     This indicates the format of the return result of the command.

                     REST   If  -max-count is specified, the dictionary returned from S3::REST is
                            returned.  If  -max-count  is  not  specified,  a  list  of  all  the
                            dictionaries  returned  from  the  one  or  more calls to S3::REST is
                            returned.

                     xml    If -max-count is  specified,  the  body  returned  from  S3::REST  is
                            returned.  If  -max-count  is not specified, a list of all the bodies
                            returned from the one or more calls to S3::REST is returned.

                     pxml   If -max-count is specified, the body returned from S3::REST is passed
                            throught  xsxp::parse  and  then  returned.   If  -max-count  is  not
                            specified, a list of all the bodies returned from  the  one  or  more
                            calls  to  S3::REST  are  each  passed  through  xsxp::parse and then
                            returned.

                     names  Returns a list of all names found in either the  Contents/Key  fields
                            or  the  CommonPrefixes/Prefix  fields. If no -delimiter is specified
                            and no -max-count is specified, this returns a list of all  resources
                            with the specified -prefix.

                     dict   Returns a dictionary. (Returns only one dictionary even if -max-count
                            wasn't specified.) The keys of the dictionary are as follows:

                            Name   The name of the bucket (from the final call to S3::REST).

                            Prefix From the final call to S3::REST.

                            Marker From the final call to S3::REST.

                            MaxKeys
                                   From the final call to S3::REST.

                            IsTruncated
                                   From the final call to S3::REST, so always false if -max-count
                                   is not specified.

                            NextMarker
                                   Always  provided  if  IsTruncated  is  true, and calculated of
                                   Amazon does not provide it. May be  empty  if  IsTruncated  is
                                   false.

                            Key    A  list  of  names  of  resources  in  the bucket matching the
                                   -prefix and -delimiter restrictions.

                            LastModified
                                   A list of times of resources in the bucket, in the same  order
                                   as  Key,  in  the  format returned by Amazon. (I.e., it is not
                                   parsed into a seconds-from-epoch.)

                            ETag   A list of entity tags (a.k.a. MD5 checksums) in the same order
                                   as Key.

                            Size   A  list  of sizes in bytes of the resources, in the same order
                                   as Key.

                            Owner/ID
                                   A list of owners of the resources in the bucket, in  the  same
                                   order as Key.

                            Owner/DisplayName
                                   A  list  of owners of the resources in the bucket, in the same
                                   order as Key. These are the display names.

                            CommonPrefixes/Prefix
                                   A list of  prefixes  common  to  multiple  entities.  This  is
                                   present only if -delimiter was supplied.

       S3::Put  ?-bucket  bucketname? -resource resourcename ?-blocking boolean? ?-file filename?
       ?-content   contentstring?   ?-acl    private|public-read|public-read-write|authenticated-
       read|calc|keep?  ?-content-type  contenttypestring? ?-x-amz-meta-* metadatatext? ?-compare
       comparemode?
              This command sends data to a resource on Amazon's servers for  storage,  using  the
              HTTP  PUT  command.  It returns 0 if the -compare mode prevented the transfer, 1 if
              the transfer worked, or throws an error if the transfer was attempted  but  failed.
              Server  5XX  errors  and  S3  socket  errors  are retried according to S3:Configure
              -retries settings before throwing an error; other errors throw immediately.

              -bucket
                     This specifies the bucket into which the resource will be written.   Leading
                     and/or trailing slashes are removed for you, as are spaces.

              -resource
                     This  is  the  full name of the resource within the bucket. A single leading
                     slash is removed, but not a trailing slash.  Spaces are not trimmed.

              -blocking
                     The standard blocking flag.

              -file  If this is specified, the filename must exist, must be  readable,  and  must
                     not  be  a  special or directory file. [file size] must apply to it and must
                     not change for the lifetime  of  the  call.   The  default  content-type  is
                     calculated based on the name and/or contents of the file. Specifying this is
                     an error if -content is also  specified,  but  at  least  one  of  -file  or
                     -content  must  be  specified.  (The  file is allowed to not exist or not be
                     readable if -compare never is specified.)

              -content
                     If this is specified, the contentstring is sent as the body of the resource.
                     The content-type defaults to "application/octet-string".  Only the low bytes
                     are sent,  so  non-ASCII  should  use  the  appropriate  encoding  (such  as
                     [encoding convertto utf-8]) before passing it to this routine, if necessary.
                     Specifying this is an error if -file is also specified, but at least one  of
                     -file or -content must be specified.

              -acl   This  defaults  to S3::Configure -default-acl if not specified.  It sets the
                     x-amz-acl header on the PUT operation.  If the value provided is  calc,  the
                     x-amz-acl  header  is calculated based on the I/O permissions of the file to
                     be uploaded; it is an error to specify calc  and  -content.   If  the  value
                     provided  is  keep,  the  acl of the resource is read before the PUT (or the
                     default is used if the resource does not exist), then set back  to  what  it
                     was  after  the  PUT (if it existed). An error will occur if the resource is
                     successfully written but the kept ACL cannot be then  applied.  This  should
                     never happen.  Note:  calc is not currently fully implemented.

              -x-amz-meta-*
                     If  any header starts with "-x-amz-meta-", its contents are added to the PUT
                     command to be stored as metadata with the resource. Again,  no  encoding  is
                     performed,  and  the  metadata  should not contain characters like newlines,
                     carriage returns, and so on. It is best to stick with simple ASCII  strings,
                     or to fix the library in several places.

              -content-type
                     This overrides the content-type calculated by -file or sets the content-type
                     for -content.

              -compare
                     This is the standard compare mode argument. S3::Put returns 1  if  the  data
                     was  copied  or  0  if  the  data  was skipped due to the comparison mode so
                     indicating it should be skipped.

       S3::Get  ?-bucket  bucketname?  -resource  resourcename  ?-blocking   boolean?   ?-compare
       comparemode?  ?-file  filename?  ?-content  contentvarname? ?-timestamp aws|now? ?-headers
       headervarname?
              This command retrieves data from a resource on Amazon's S3 servers, using the  HTTP
              GET  command.  It  returns  0 if the -compare mode prevented the transfer, 1 if the
              transfer worked, or throws an error if  the  transfer  was  attempted  but  failed.
              Server  5XX  errors  and S3 socket errors are are retried according to S3:Configure
              settings before throwing an error; other errors throw immediately. Note  that  this
              is  always  authenticated as the user configured in via S3::Configure -accesskeyid.
              Use the Tcllib http for unauthenticated GETs.

              -bucket
                     This specifies the bucket from which the resource  will  be  read.   Leading
                     and/or trailing slashes are removed for you, as are spaces.

              -resource
                     This  is  the  full name of the resource within the bucket. A single leading
                     slash is removed, but not a trailing slash.  Spaces are not trimmed.

              -blocking
                     The standard blocking flag.

              -file  If this is specified, the body of the resource will be read into this  file,
                     incrementally  without  pulling  it  entirely  into memory first. The parent
                     directory must already exist.  If  the  file  already  exists,  it  must  be
                     writable.  If  an  error is thrown part-way through the process and the file
                     already existed, it may be clobbered. If an error is thrown part-way through
                     the  process  and  the  file did not already exist, any partial bits will be
                     deleted. Specifying this is an error if -content is also specified,  but  at
                     least one of -file or -content must be specified.

              -timestamp
                     This  is only valid in conjunction with -file. It may be specified as now or
                     aws. The default is now. If now, the file's modification date is left up  to
                     the  system.  If  aws,  the  file's  mtime is set to match the Last-Modified
                     header on the resource, synchronizing the  two  appropriately  for  -compare
                     date or -compare newer.

              -content
                     If this is specified, the contentvarname is a variable in the caller's scope
                     (not necessarily global)  that  receives  the  value  of  the  body  of  the
                     resource. No encoding is done, so if the resource (for example) represents a
                     UTF-8 byte sequence, use [encoding convertfrom utf-8] to get a  valid  UTF-8
                     string. If this is specified, the -compare is ignored unless it is never, in
                     which case no assignment to contentvarname is performed. Specifying this  is
                     an  error  if -file is also specified, but at least one of -file or -content
                     must be specified.

              -compare
                     This is the standard compare mode argument. S3::Get returns 1  if  the  data
                     was  copied  or  0  if  the  data  was skipped due to the comparison mode so
                     indicating it should be skipped.

              -headers
                     If this is specified, the headers resulting from the fetch are stored in the
                     provided  variable,  as  a dictionary. This will include content-type and x-
                     amz-meta-* headers,  as  well  as  the  usual  HTTP  headers,  the  x-amz-id
                     debugging  headers,  and  so  on.  If no file is fetched (due to -compare or
                     other errors), no assignment to this variable is performed.

       S3::Head  ?-bucket  bucketname?  -resource   resourcename   ?-blocking   boolean?   ?-dict
       dictvarname? ?-headers headersvarname? ?-status statusvarname?
              This  command  requests  HEAD from the resource.  It returns whether a 2XX code was
              returned as a result of the request, never throwing an S3 remote error.   That  is,
              if  this  returns  1,  the  resource  exists  and is accessible. If this returns 0,
              something went wrong, and the -status result can be consulted for details.

              -bucket
                     This specifies the bucket from which the resource  will  be  read.   Leading
                     and/or trailing slashes are removed for you, as are spaces.

              -resource
                     This  is  the  full name of the resource within the bucket. A single leading
                     slash is removed, but not a trailing slash.  Spaces are not trimmed.

              -blocking
                     The standard blocking flag.

              -dict  If specified, the resulting dictionary from the S3::REST call is assigned to
                     the indicated (not necessarily global) variable in the caller's scope.

              -headers
                     If  specified, the dictionary of headers from the result are assigned to the
                     indicated (not necessarily global) variable in the caller's scope.

              -status
                     If specified,  the  indicated  (not  necessarily  global)  variable  in  the
                     caller's  scope  is  assigned  a  2-element  list.  The first element is the
                     3-digit HTTP status code, while the second element is the HTTP message (such
                     as "OK" or "Forbidden").

       S3::GetAcl  ?-blocking  boolean? ?-bucket bucketname? -resource resourcename ?-result-type
       REST|xml|pxml?
              This command gets the ACL of the indicated resource or throws an  error  if  it  is
              unavailable.

              -blocking boolean
                     See above for standard definition.

              -bucket
                     This  specifies  the  bucket  from which the resource will be read.  Leading
                     and/or trailing slashes are removed for you, as are spaces.

              -resource
                     This is the full name of the resource within the bucket.  A  single  leading
                     slash is removed, but not a trailing slash.  Spaces are not trimmed.

              -parse-xml xml
                     The XML from a previous GetACL can be passed in to be parsed into dictionary
                     form.  In this case, -result-type must be pxml or dict.

              -result-type REST
                     The dictionary returned by S3::REST is the return value of  S3::GetAcl.   In
                     this case, a non-2XX httpstatus will not throw an error.

              -result-type xml
                     The  raw  XML  of  the  body  is  returned  as  the result (with no encoding
                     applied).

              -result-type pxml
                     The XML of the body as parsed by xsxp::parse is returned.

              -result-type dict
                     This fetches the ACL, parses it, and returns a dictionary of two elements.

                     The first element has the key "owner" whose value is the canonical ID of the
                     owner of the resource.

                     The  second element has the key "acl" whose value is a dictionary.  Each key
                     in the dictionary is one of Amazon's permissions,  namely  "READ",  "WRITE",
                     "READ_ACP",  "WRITE_ACP",  or  "FULL_CONTROL".   Each value of each key is a
                     list of canonical IDs or group URLs that have that permission.  Elements are
                     not  in  the  list in any particular order, and not all keys are necessarily
                     present.  Display names are not returned, as they are not especially useful;
                     use pxml to obtain them if necessary.

       S3::PutAcl ?-blocking boolean? ?-bucket bucketname? -resource resourcename ?-acl new-acl?
              This sets the ACL on the indicated resource. It returns the XML written to the ACL,
              or throws an error if anything went wrong.

              -blocking boolean
                     See above for standard definition.

              -bucket
                     This specifies the bucket from which the resource  will  be  read.   Leading
                     and/or trailing slashes are removed for you, as are spaces.

              -resource
                     This  is  the  full name of the resource within the bucket. A single leading
                     slash is removed, but not a trailing slash.  Spaces are not trimmed.

              -owner If this is provided, it is assumed to  match  the  owner  of  the  resource.
                     Otherwise,  a  GET  may  need  to be issued against the resource to find the
                     owner. If you already have the owner (such as from a call to S3::GetAcl, you
                     can  pass  the  value of the "owner" key as the value of this option, and it
                     will be used in the construction of the XML.

              -acl   If this option is specified, it provides the ACL the caller wishes to  write
                     to  the  resource.  If  this is not supplied or is empty, the value is taken
                     from S3::Configure -default-acl.  The ACL is written with a PUT to the  ?acl
                     resource.

                     If the value passed to this option starts with "<", it is taken to be a body
                     to be PUT to the ACL resource.

                     If the value matches one of the standard Amazon x-amz-acl headers  (i.e.,  a
                     canned  access  policy),  that header is translated to XML and then applied.
                     The canned access policies are private, public-read, public-read-write,  and
                     authenticated-read (in lower case).

                     Otherwise,  the  value  is assumed to be a dictionary formatted as the "acl"
                     sub-entry within the dict returns  by  S3::GetAcl  -result-type  dict.   The
                     proper  XML  is  generated  and  applied to the resource.  Note that a value
                     containing "//" is assumed to be a group, a value containing "@" is  assumed
                     to  be  an AmazonCustomerByEmail, and otherwise the value is assumed to be a
                     canonical Amazon ID.

                     Note that you cannot change the owner, so calling GetAcl on a resource owned
                     by  one  user and applying it via PutAcl on a resource owned by another user
                     may not do exactly what you expect.

       S3::Delete  ?-bucket  bucketname?  -resource  resourcename  ?-blocking  boolean?  ?-status
       statusvar?
              This  command deletes the specified resource from the specified bucket.  It returns
              1 if the resource was deleted successfully, 0 otherwise.  It returns 0 rather  than
              throwing an S3 remote error.

              -bucket
                     This  specifies the bucket from which the resource will be deleted.  Leading
                     and/or trailing slashes are removed for you, as are spaces.

              -resource
                     This is the full name of the resource within the bucket.  A  single  leading
                     slash is removed, but not a trailing slash.  Spaces are not trimmed.

              -blocking
                     The standard blocking flag.

              -status
                     If  specified,  the  indicated  (not  necessarily  global)  variable  in the
                     caller's scope is set to a  two-element  list.  The  first  element  is  the
                     3-digit  HTTP  status  code. The second element is the HTTP message (such as
                     "OK" or "Forbidden"). Note that Amazon's DELETE result is  204  on  success,
                     that being the code indicating no content in the returned body.

       S3::Push  ?-bucket  bucketname?  -directory directoryname ?-prefix prefixstring? ?-compare
       comparemode?  ?-x-amz-meta-*  metastring?  ?-acl  aclcode?   ?-delete   boolean?   ?-error
       throw|break|continue? ?-progress scriptprefix?
              This synchronises a local directory with a remote bucket by pushing the differences
              using S3::Put. Note that if something has changed in the bucket  but  not  locally,
              those  changes  could  be lost. Thus, this is not a general two-way synchronization
              primitive. (See  S3::Sync  for  that.)  Note  too  that  resource  names  are  case
              sensitive,  so  changing  the  case  of  a  file  on  a Windows machine may lead to
              otherwise-unnecessary transfers.  Note that only regular files are  considered,  so
              devices, pipes, symlinks, and directories are not copied.

              -bucket
                     This names the bucket into which data will be pushed.

              -directory
                     This  names  the  local  directory  from which files will be taken.  It must
                     exist, be readable via [glob] and so on. If only some of the  files  therein
                     are  readable, S3::Push will PUT those files that are readable and return in
                     its results the list of files that could not be opened.

              -prefix
                     This names the prefix that will be added to all resources.  That is,  it  is
                     the  remote  equivalent  of -directory.  If it is not specified, the root of
                     the bucket will be treated as the remote directory. An example may clarify.

                     S3::Push -bucket test -directory /tmp/xyz -prefix hello/world

                     In    this    example,    /tmp/xyz/pdq.html    will     be     stored     as
                     http://s3.amazonaws.com/test/hello/world/pdq.html in Amazon's servers. Also,
                     /tmp/xyz/abc/def/Hello          will          be          stored          as
                     http://s3.amazonaws.com/test/hello/world/abc/def/Hello  in Amazon's servers.
                     Without  the  -prefix  option,  /tmp/xyz/pdq.html   would   be   stored   as
                     http://s3.amazonaws.com/test/pdq.html.

              -blocking
                     This is the standard blocking option.

              -compare
                     If  present,  this  is  passed  to  each  invocation of S3::Put.  Naturally,
                     S3::Configure -default-compare is used if this is not specified.

              -x-amz-meta-*
                     If present, this is passed to each invocation of S3::Put. All  copied  files
                     will have the same metadata.

              -acl   If present, this is passed to each invocation of S3::Put.

              -delete
                     This  defaults  to false. If true, resources in the destination that are not
                     in the source directory are deleted with  S3::Delete.   Since  only  regular
                     files are considered, the existance of a symlink, pipe, device, or directory
                     in the local source will not prevent the deletion of a remote resource  with
                     a corresponding name.

              -error This  controls  the behavior of S3::Push in the event that S3::Put throws an
                     error. Note that errors encountered on the local file system or  in  reading
                     the list of resources in the remote bucket always throw errors.  This option
                     allows control over "partial" errors, when some files were copied  and  some
                     were  not.  S3::Delete is always finished up, with errors simply recorded in
                     the return result.

                     throw  The error is rethrown with the same errorCode.

                     break  Processing stops without throwing an error, the error is recorded  in
                            the  return value, and the command returns with a normal return.  The
                            calls to S3::Delete are not started.

                     continue
                            This is the default. Processing continues without throwing, recording
                            the  error  in  the return result, and resuming with the next file in
                            the local directory to be copied.

              -progress
                     If this is specified and the indicated  script  prefix  is  not  empty,  the
                     indicated  script  prefix  will  be  invoked  several  times in the caller's
                     context with additional arguments at various points in the processing.  This
                     allows  progress  reporting without backgrounding.  The provided prefix will
                     be invoked with additional arguments, with  the  first  additional  argument
                     indicating  what  part  of  the process is being reported on.  The prefix is
                     initially  invoked  with  args  as  the  first  additional  argument  and  a
                     dictionary representing the normalized arguments to the S3::Push call as the
                     second additional argument.  Then the prefix is invoked with  local  as  the
                     first  additional  argument  and  a  list  of  suffixes  of  the files to be
                     considered as the second argument.  Then the prefix is invoked  with  remote
                     as  the  first  additional  argument  and a list of suffixes existing in the
                     remote bucket as the second additional argument.  Then, for each file in the
                     local  list,  the  prefix will be invoked with start as the first additional
                     argument and the common suffix as  the  second  additional  argument.   When
                     S3::Put  returns  for that file, the prefix will be invoked with copy as the
                     first additional argument,  the  common  suffix  as  the  second  additional
                     argument,  and  a  third argument that will be "copied" (if S3::Put sent the
                     resource), "skipped" (if S3::Put decided not to based on -compare),  or  the
                     errorCode  that  S3::Put  threw  due to unexpected errors (in which case the
                     third argument is a list that starts with "S3"). When all  files  have  been
                     transfered,  the prefix may be invoked zero or more times with delete as the
                     first additional argument and the suffix of the resource  being  deleted  as
                     the  second additional argument, with a third argument being either an empty
                     string (if the delete worked) or the errorCode from S3::Delete if it failed.
                     Finally,  the  prefix  will be invoked with finished as the first additional
                     argument and the return value as the second additional argument.

              The return result from this command is a dictionary. They  keys  are  the  suffixes
              (i.e.,  the common portion of the path after the -directory and -prefix), while the
              values are either "copied", "skipped" (if -compare indicated not to copy the file),
              or  the errorCode thrown by S3::Put, as appropriate. If -delete was true, there may
              also be entries for suffixes with the value "deleted" or  "notdeleted",  indicating
              whether  the  attempted  S3::Delete  worked  or  not,  respectively.  There  is one
              additional pair in the return result, whose key is the empty string and whose value
              is  a  nested dictionary.  The keys of this nested dictionary include "filescopied"
              (the number of files successfully copied), "bytescopied" (the number of data  bytes
              in  the  files  copied,  excluding  headers,  metadata, etc), "compareskipped" (the
              number of files not copied due to -compare mode),  "errorskipped"  (the  number  of
              files  not  copied  due  to thrown errors), "filesdeleted" (the number of resources
              deleted due to not having corresponding files locally, or 0 if -delete  is  false),
              and  "filesnotdeleted"  (the  number  of resources whose deletion was attempted but
              failed).

              Note that this is currently implemented somewhat  inefficiently.   It  fetches  the
              bucket  listing  (including  timestamps  and eTags), then calls S3::Put, which uses
              HEAD to find the timestamps and eTags again. Correcting this with no API change  is
              planned for a future upgrade.

       S3::Pull  ?-bucket  bucketname? -directory directoryname ?-prefix prefixstring? ?-blocking
       boolean?  ?-compare  comparemode?   ?-delete   boolean?   ?-timestamp   aws|now?   ?-error
       throw|break|continue? ?-progress scriptprefix?
              This synchronises a remote bucket with a local directory by pulling the differences
              using S3::Get If something has been changed locally but not in  the  bucket,  those
              difference  may  be  lost. This is not a general two-way synchronization mechanism.
              (See S3::Sync for that.)  This creates directories if needed; new  directories  are
              created  with  default permissions. Note that resource names are case sensitive, so
              changing the case of a file on a Windows machine may lead to  otherwise-unnecessary
              transfers. Also, try not to store data in resources that end with a slash, or which
              are prefixes of resources that otherwise would start with a slash; i.e., don't  use
              this if you store data in resources whose names have to be directories locally.

              Note  that  this  is  currently implemented somewhat inefficiently.  It fetches the
              bucket listing (including timestamps and eTags), then  calls  S3::Get,  which  uses
              HEAD  to find the timestamps and eTags again. Correcting this with no API change is
              planned for a future upgrade.

              -bucket
                     This names the bucket from which data will be pulled.

              -directory
                     This names the local directory into which files  will  be  written  It  must
                     exist,  be  readable  via  [glob], writable for file creation, and so on. If
                     only some of the files therein are writable, S3::Pull will GET  those  files
                     that are writable and return in its results the list of files that could not
                     be opened.

              -prefix
                     The prefix of resources that will be considered for retrieval.  See S3::Push
                     for  more  details,  examples,  etc.  (Of course, S3::Pull reads rather than
                     writes, but the prefix is treated similarly.)

              -blocking
                     This is the standard blocking option.

              -compare
                     This is passed to  each  invocation  of  S3::Get  if  provided.   Naturally,
                     S3::Configure -default-compare is used if this is not provided.

              -timestamp
                     This is passed to each invocation of S3::Get if provided.

              -delete
                     If  this  is specified and true, files that exist in the -directory that are
                     not in the -prefix will be deleted after all resources have been copied.  In
                     addition,  empty  directories  (other than the top-level -directory) will be
                     deleted, as Amazon S3 has no concept of an empty directory.

              -error See S3::Push for a description of this option.

              -progress
                     See S3::Push for a description of this option.  It differs slightly in  that
                     local directories may be included with a trailing slash to indicate they are
                     directories.

              The return value from this command is a dictionary. It is  identical  in  form  and
              meaning  to  the  description  of the return result of S3::Push. It differs only in
              that directories may be included, with a trailing slash in their name, if they  are
              empty and get deleted.

       S3::Toss   ?-bucket   bucketname?   -prefix   prefixstring   ?-blocking  boolean?  ?-error
       throw|break|continue? ?-progress scriptprefix?
              This deletes some or all resources within  a  bucket.  It  would  be  considered  a
              "recursive delete" had Amazon implemented actual directories.

              -bucket
                     The bucket from which resources will be deleted.

              -blocking
                     The standard blocking option.

              -prefix
                     The  prefix  for resources to be deleted. Any resource that starts with this
                     string will be deleted. This is  required.   To  delete  everything  in  the
                     bucket, pass an empty string for the prefix.

              -error If  this is "throw", S3::Toss rethrows any errors it encounters.  If this is
                     "break", S3::Toss returns with  a  normal  return  after  the  first  error,
                     recording  that  error in the return result. If this is "continue", which is
                     the default, S3::Toss continues on  and  lists  all  errors  in  the  return
                     result.

              -progress
                     If  this  is  specified  and  not an empty string, the script prefix will be
                     invoked several times in the context of the caller with additional arguments
                     appended.   Initially, it will be invoked with the first additional argument
                     being args and the second being the processed list of arguments to S3::Toss.
                     Then it is invoked with remote as the first additional argument and the list
                     of suffixes in the bucket to be deleted as the second  additional  argument.
                     Then  it  is invoked with the first additional argument being delete and the
                     second additional argument being the suffix deleted and the third additional
                     argument  being  "deleted"  or  "notdeleted" depending on whether S3::Delete
                     threw an error.   Finally,  the  script  prefix  is  invoked  with  a  first
                     additional  argument  of  "finished" and a second additional argument of the
                     return value.

              The return value is a dictionary. The keys are the suffixes of files that  S3::Toss
              attempted  to  delete,  and  whose  values  are  either  the  string  "deleted"  or
              "notdeleted". There is also one additional pair, whose key is the empty string  and
              whose value is an embedded dictionary. The keys of this embedded dictionary include
              "filesdeleted" and "filesnotdeleted", each of which has integer values.

LIMITATIONS

       •      The pure-Tcl MD5 checking is slow. If you are  processing  files  in  the  megabyte
              range, consider ensuring binary support is available.

       •      The  commands  S3::Pull  and  S3::Push  fetch  a  directory  listing which includes
              timestamps and MD5 hashes, then invoke S3::Get and S3::Put. If a  complex  -compare
              mode  is  specified, S3::Get and S3::Put will invoke a HEAD operation for each file
              to fetch timestamps and MD5 hashes of each resource again. It is  expected  that  a
              future release of this package will solve this without any API changes.

       •      The  commands  S3::Pull  and S3::Push fetch a directory listing without using -max-
              count. The entire directory is pulled into memory at once. For very large  buckets,
              this  could  be  a  performance problem. The author, at this time, does not plan to
              change this behavior. Welcome to Open Source.

       •      S3::Sync is neither designed nor implemented yet.  The intention would be  to  keep
              changes  synchronised,  so  changes  could be made to both the bucket and the local
              directory and be merged by S3::Sync.

       •      Nor is -compare calc fully implemented.  This  is  primarily  due  to  Windows  not
              providing  a  convenient  method  for  distinguishing  between local files that are
              "public-read" or "public-read-write". Assistance figuring out TWAPI for this  would
              be  appreciated.  The U**X semantics are difficult to map directly as well. See the
              source for details.  Note that there are not tests for calc, since  it  isn't  done
              yet.

       •      The  HTTP  processing is implemented within the library, rather than using a "real"
              HTTP package. Hence, multi-line headers are not (yet)  handled  correctly.  Do  not
              include carriage returns or linefeeds in x-amz-meta-* headers, content-type values,
              and so on.  The author does not at this time expect to improve this.

       •      Internally, S3::Push and S3::Pull and S3::Toss are all very similar and  should  be
              refactored.

       •      The  idea  of  using  -compare  never  -delete  true to delete files that have been
              deleted from one place but not the other yet not copying changed files is untested.

USAGE SUGGESTIONS

       To fetch a "directory" out of a bucket, make changes, and store it back:

              file mkdir ./tempfiles
              S3::Pull -bucket sample -prefix of/interest -directory ./tempfiles \
                -timestamp aws
              do_my_process ./tempfiles other arguments
              S3::Push -bucket sample -prefix of/interest -directory ./tempfiles \
                -compare newer -delete true

       To delete files locally that were deleted off of S3 but not otherwise update files:

              S3::Pull -bucket sample -prefix of/interest -directory ./myfiles \
                -compare never -delete true

FUTURE DEVELOPMENTS

       The author intends to work on several additional projects  related  to  this  package,  in
       addition to finishing the unfinished features.

       First,  a  command-line  program  allowing  browsing of buckets and transfer of files from
       shell scripts and command prompts is useful.

       Second, a GUI-based program allowing visual manipulation of bucket and resource trees  not
       unlike Windows Explorer would be useful.

       Third,  a  command-line (and perhaps a GUI-based) program called "OddJob" that will use S3
       to synchronize computation amongst multiple servers running OddJob. An S3 bucket  will  be
       set  up with a number of scripts to run, and the OddJob program can be invoked on multiple
       machines to run scripts on all the machines, each moving on to the next unstarted task  as
       it finishes each.  This is still being designed, and it is intended primarily to be run on
       Amazon's Elastic Compute Cloud.

TLS SECURITY CONSIDERATIONS

       This package uses the TLS package to handle the security for https urls and  other  socket
       connections.

       Policy  decisions like the set of protocols to support and what ciphers to use are not the
       responsibility of TLS, nor of  this  package  itself  however.   Such  decisions  are  the
       responsibility of whichever application is using the package, and are likely influenced by
       the set of servers the application will talk to as well.

       For      example,      in      light      of      the      recent      POODLE       attack
       [http://googleonlinesecurity.blogspot.co.uk/2014/10/this-poodle-bites-exploiting-
       ssl-30.html] discovered by  Google  many  servers  will  disable  support  for  the  SSLv3
       protocol.   To handle this change the applications using TLS must be patched, and not this
       package, nor TLS itself.  Such a patch may be  as  simple  as  generally  activating  tls1
       support, as shown in the example below.

                  package require tls
                  tls::init -tls1 1 ;# forcibly activate support for the TLS1 protocol

                  ... your own application code ...

BUGS, IDEAS, FEEDBACK

       This  document,  and  the  package  it  describes, will undoubtedly contain bugs and other
       problems.   Please  report  such  in  the  category  amazon-s3  of  the  Tcllib   Trackers
       [http://core.tcl.tk/tcllib/reportlist].  Please also report any ideas for enhancements you
       may have for either package and/or documentation.

       When proposing code changes, please provide unified diffs, i.e the output of diff -u.

       Note further that attachments are strongly preferred over inlined patches. Attachments can
       be  made  by going to the Edit form of the ticket immediately after its creation, and then
       using the left-most button in the secondary navigation bar.

KEYWORDS

       amazon, cloud, s3

CATEGORY

       Networking

COPYRIGHT

       2006,2008 Darren New. All Rights Reserved. See LICENSE.TXT for terms.