Common Lisp Package: HH-AWS

README:

FUNCTION

Public

DB-CREATE-DOMAIN (DOMAIN-NAME)

Create a domain with the specified name

DB-DELETE-ATTRIBUTES (DOMAIN-NAME ITEM-NAME ATTRIBUTES)

Delete attributes from the specified item, and if all attributes are gone, delete the item itself

DB-DELETE-DOMAIN (DOMAIN-NAME)

Delete the specified domain

DB-DOMAIN-METADATA (DOMAIN-NAME)

Return metadata about the specified domain

DB-GET-ATTRIBUTES (DOMAIN-NAME ITEM-NAME)

Return the attributes for the specified item in the domain

DB-LIST-DOMAINS

List all domains

DB-PUT-ATTRIBUTES (DOMAIN-NAME ITEM-NAME ATTRIBUTES)

Set the attributes on the specified item in the domain

DB-QUERY (DOMAIN-NAME QUERY-EXPRESSION)

Return a list of item names matching the query expression

DB-QUERY-WITH-ATTRIBUTES (DOMAIN-NAME QUERY-EXPRESSION ATTRIBUTES)

Return the indicated attributes of items matching the query expression

DB-SELECT (SELECT-EXPRESSION)

Return the results of the provided select statement

EC2-AUTHORIZE-SECURITY-GROUP-INGRESS (GROUPNAME PROTOCOL FROM-PORT TO-PORT CIDR-IP)

EC2-DESCRIBE-AVAILABILITY-ZONES

List all availability zones

EC2-DESCRIBE-INSTANCES (REGION-NAME)

List all regions

EC2-DESCRIBE-REGIONS

List all regions

EC2-DESCRIBE-SECURITY-GROUPS (REGION-NAME)

List all security groups

EC2-REVOKE-SECURITY-GROUP-INGRESS (GROUPNAME PROTOCOL FROM-PORT TO-PORT CIDR-IP)

S3-CREATE-BUCKET (BUCKET-NAME)

Create a new bucket

S3-DELETE-BUCKET (BUCKET-NAME)

Delete a bucket

S3-DELETE-BUCKET-OBJECT (BUCKET-NAME OBJECT-NAME)

Return the contents of the indicated bucket

S3-GET-BUCKET-OBJECT (BUCKET-NAME OBJECT-NAME)

Return the contents of the indicated bucket

S3-LIST-BUCKET-OBJECTS (PREFIX BUCKET-NAME)

List objects in a bucket

S3-LIST-BUCKETS

Return list of all buckets in S3

S3-PUT-BUCKET-OBJECT (BUCKET-NAME OBJECT-NAME CONTENT)

Either create a new bucket object for the content, or update an existing one.

SQS-CREATE-QUEUE (QUEUE-NAME)

Create a new queue

SQS-DELETE-MESSAGE (QUEUE-NAME RECEIPT-HANDLE)

Delete a message from a queue

SQS-DELETE-QUEUE (QUEUE-NAME)

Delete queue

SQS-GET-QUEUE-ATTRIBUTES (QUEUE-NAME)

Get queue attributes

SQS-LIST-QUEUES (QUEUE-NAME)

List queues

SQS-RECEIVE-MESSAGE (QUEUE-NAME)

Receive a message from the queue

SQS-SEND-MESSAGE (QUEUE-NAME MESSAGE-BODY)

Send a message to the specified queue

SQS-SET-QUEUE-ATTRIBUTES (QUEUE-NAME VISIBILITY-TIMEOUT)

Set queue attributes

Private

AWS-TIMESTAMP (&OPTIONAL (TIME (GET-UNIVERSAL-TIME)))

Return a HTTP-style date string. Borrowed from Zach Bean's ZS3: http://www.xach.com/lisp/zs3/ (BSD-license)

BYTES-TO-STRING (SOME-BYTES)

Borrowed from Arnesi (http://common-lisp.net/project/bese/arnesi.html)

DETOKENIZE (ELEMENTS TOKEN &OPTIONAL (PREFIX ))

Combine elements into a string, separating each element by token

HOME-DIR

Return the user's home directory

MAP-NAME-VALUE-PAIRS (NAME-VALUE-PAIRS SOME-LAMBDA)

Apply some lambda (takes 2 arguments) to each name / value pair in name-value-pairs

SORT-HASHTABLE (SOME-HASH PREDICATE)

Use predicate to compare pairs of keys & values; predicate should return true iff pair 1 is less than pair 2 (each pair is a cons of (key.value) ).

STRING-ENDS-WITH (TARGET-STRING SEARCH-STRING)

Return T if target-string ends with search-string, nil otherwise

STRING-STARTS-WITH (TARGET-STRING SEARCH-STRING)

Return T if target-string starts with search-string, nil otherwise

STRING-TO-BYTES (A-STRING &KEY (PAD-TO 1))

Borrowed from Arnesi (http://common-lisp.net/project/bese/arnesi.html)

USE-SYMBOL (BASE-NAME &KEY (PACKAGE NIL) (PREFIX ) (POSTFIX ))

Build a symbol from component parts

Undocumented

AWS-DATE (&OPTIONAL (TIME (GET-UNIVERSAL-TIME)))

BUCKET-CONTENTS-PARSER (INPUT-STREAM &REST MORE-ARGS)

BUILDER-PARSER (INPUT-STREAM &REST MORE-ARGS)

CURRENT-ELEMENT

CURRENT-ELEMENT-TO-FIND

CURRENT-HANDLER

DEFAULT-PARSER (INPUT-STREAM &REST MORE-ARGS)

EC2-INSTANCES-PARSER (INPUT-STREAM &REST MORE-ARGS)

ENSURE-STRING-ENDS-WITH (TARGET-STRING STRING-ENDING)

FIND-PATH-PARSER (INPUT-STREAM &REST MORE-ARGS)

FIND-RESPONSES (BODY ELEMENTS-TO-FIND)

HASH-ENTRIES (SOME-HASH)

ITEMS-PARSER (INPUT-STREAM &REST MORE-ARGS)

LIST-BUCKETS-PARSER (INPUT-STREAM &REST MORE-ARGS)

MAKE-RESPONSE (A-SERVICE BODY STATUS-CODE HEADERS URI STREAM MUST-CLOSE REASON-PHRASE)

MOVE-TO-NEXT-ELEMENT-TO-FIND

ON-FINISH-ELEMENT (NAME ATTRIBUTES PARENT-SEED SEED)

ON-START-ELEMENT (NAME ATTRIBUTES SEED)

ON-TEXT (TEXT-STRING SEED)

PATH-P (SOME-PATH)

POP-HANDLER

PUSH-HANDLER (HANDLER)

SECURITY-GROUPS-PARSER (INPUT-STREAM &REST MORE-ARGS)

URL-DECODE (A-STRING)

MACRO

Private

DEF-HTTP-RETURN-CODE (NAME VALUE REASON-PHRASE)

Shortcut to define constants for return codes. NAME is a Lisp symbol, VALUE is the numerical value of the return code, and REASON-PHRASE is the phrase (a string) to be shown in the server's status line.

PUTEND (SOME-OBJECT SOME-PLACE)

Append some-object to the end of the list in some-place. Modifies some-place.

RESPONSE-VALUES (SOME-RESPONSE)

Expand a response into a multiple return values

Undocumented

COUT (&REST ARGS)

DEFREQUEST (NAME &KEY (DOCUMENTATION ) (BASES NIL) (SLOTS NIL) SERVICE ACTION ((METHOD METHOD-OF-METHOD) NIL) (PARAMETERS NIL) (ARGS NIL) (RESULT-FORMAT NIL) ((RESULT RESULT-METHOD) NIL) (ERROR-FORMAT NIL) ((ERROR ERROR-METHOD) NIL) ((CALL CALL-SERVICE-METHOD) NIL) ((SEND SEND-REQUEST-METHOD) NIL))

DEFSERVICE (NAME &KEY (DOCUMENTATION ) (BASES NIL) (SLOTS NIL) ENDPOINT VERSION ((REQUEST (REQUEST-CLASS &KEY ((SLOTS REQUEST-SLOTS) NIL) ((DOCUMENTATION REQUEST-DOCUMENTATION) ) ((INIT INIT-METHOD) NIL) ((QUERY QUERY-METHOD) NIL) ((ENDPOINT ENDPOINT-METHOD) NIL) ((URI URI-METHOD) NIL) ((STRING STRING-METHOD) NIL) ((DIGEST DIGEST-ALGORITHM) NIL) ((SIGNED-PARAMETERS SIGNED-PARAMETERS-METHOD) NIL) ((ADDITIONAL-HEADERS ADDITIONAL-HEADERS-METHOD) NIL) ((SEND SEND-METHOD) NIL) ((RESULT RESULT-METHOD) NIL))) NIL))

DEFXMLPARSER (NAME SPECIFIER &KEY ((INITARGS INIT-ARGS) NIL) ((ENTER ENTER-METHOD) NIL) ((TEXT TEXT-METHOD) NIL) ((EXIT EXIT-METHOD) NIL) ((FINISH FINISH-METHOD NIL) NIL))

FORMAT-STRING (FORMAT-CONTROL-STRING &REST ARGS)

RAISE-AWS-CONDITION (CODE MESSAGE RESPONSE)

GENERIC-FUNCTION

Public

ACCESS-KEY-ID (SOME-CREDENTIALS)

Return the access key associated with the credentials, to be sent with requests

SECRET-KEY (SOME-CREDENTIALS)

Return the secret key used to sign requests

Private

ADD-ATTRIBUTE-NAME-PARAMETERS (SOME-REQUEST ATTRIBUTES)

Add the indicated parameters as attribute name / value pairs to the request

ADD-ATTRIBUTE-PARAMETERS (SOME-REQUEST ATTRIBUTES)

Add the indicated parameters as attribute name / value pairs to the request

ADD-HEADER (SOME-REQUEST HEADER-NAME HEADER-VALUE)

Add a header (usually an amz header) to the request

ADD-PARAMETER (SOME-REQUEST PARAMETER-NAME PARAMETER-VALUE)

Add a parameter to the request

ADDITIONAL-HEADERS-OF (SOME-REQUEST)

Additional headers for the request; for s3, this includes the authorization header

CALL-SERVICE (REQUEST &OPTIONAL PARAMETERS ARGUMENTS)

CALL-SUCCEEDED (SOME-RESPONSE)

Return true if the response indicates success, false otherwise

CANONICALIZED-AMZ-HEADERS-OF (SOME-REQUEST)

Return a canonical string representation of amz headers

DEFAULT-ACTION (SOME-REQUEST)

Return the default action associated with this request

ENDPOINT-OF (A-SERVICE)

Hostname of AWS service endpoint (e.g., s3.amazon.com)

ERROR-FORMAT (SOME-REQUEST)

EXTRACT-ERRORS (SOME-SERVICE SOME-REQUEST SOME-RESPONSE)

EXTRACT-RESULT (SOME-SERVICE SOME-REQUEST SOME-RESPONSE)

HTTP-URI (SOME-REQUEST)

The HTTP URI of a request, including scheme, host, and path

MAKE-REQUEST (A-SERVICE A-REQUEST-TYPE)

Create a new request for the service

MD5-DIGEST (SOME-CONTENT)

Create an MD5 digest of the provided content

REQUEST-SIGNATURE (SOME-REQUEST)

Compute the signature of the request and return it's base64 representation (note: using HMAC256)

REQUEST-STRING-TO-SIGN (SOME-REQUEST)

String representation of request prepared for signing

RESULT-FORMAT (SOME-REQUEST)

Return the format that should be used to extract the result from the response's body

SEND-HTTP-REQUEST (SOME-REQUEST)

Send the HTTP request

SEND-REQUEST (SOME-SERVICE SOME-REQUEST &OPTIONAL PARAMETERS)

Send a request to its endpoint, and return any supplied response.

SIGNATURE-DIGEST-ALGORITHM (SOME-REQUEST)

Return the cryptographic diegest algorithm to use when signing the request

SIGNED-PARAMETERS-OF (SOME-REQUEST)

Return the signed form of parameters for the request (means the addition of the signature parameter); at the moment, only SimpleDB requires this method.

SORTED-HEADERS (SOME-REQUEST)

Sort the headers of the request according to byte-ordering of names, and return the sorted list

SORTED-PARAMETERS (SOME-REQUEST)

Sort the parameters of the request according to byte-ordering of names, and return the sorted list

VERSION-OF (A-SERVICE)

Return the expected version of the service

Undocumented

CANONICAL-QUERY-STRING (SOME-REQUEST)

CANONICALIZED-RESOURCE-OF (SOME-REQUEST)

CAPTURE-TEXT (HANDLER TEXT-STRING)

CONTENT-LENGTH-OF (SOME-REQUEST)

CONTENT-MD5-OF (SOME-REQUEST)

CONTENT-TYPE-OF (SOME-REQUEST)

DATE-HEADER-OF (SOME-REQUEST)

ENTER-ELEMENT (HANDLER NAME ATTRIBUTES)

ERROR-CODE (CONDITION)

SETFERROR-CODE (NEW-VALUE CONDITION)

ERROR-MESSAGE (CONDITION)

SETFERROR-MESSAGE (NEW-VALUE CONDITION)

ERROR-RESPONSE (CONDITION)

SETFERROR-RESPONSE (NEW-VALUE CONDITION)

EXIT-ELEMENT (HANDLER NAME ATTRIBUTES)

FINISH-PARSE (HANDLER)

HAS-AMZ-HEADERS-P (SOME-REQUEST)

HTTP-HOST-HEADER (SOME-REQUEST)

HTTP-REQUEST-URI (SOME-REQUEST)

HTTP-VERB (SOME-REQUEST)

METHOD-OF (SOME-REQUEST)

SLOT-ACCESSOR

Private

HEADERS-OF (OBJECT)

HTTP headers associated with the request

SETFHEADERS-OF (NEW-VALUE OBJECT)

HTTP headers associated with the request

PARAMETERS-OF (OBJECT)

Parameters accompanying the message as name-value pairs

SETFPARAMETERS-OF (NEW-VALUE OBJECT)

Parameters accompanying the message as name-value pairs

RESPONSE-BODY (OBJECT)

Body of the response (if any)

SETFRESPONSE-BODY (NEW-VALUE OBJECT)

Body of the response (if any)

RESPONSE-STATUS-CODE (OBJECT)

Status code returned by the server

SETFRESPONSE-STATUS-CODE (NEW-VALUE OBJECT)

Status code returned by the server

SERVICE-OF (OBJECT)

Service source or destination of the message

SETFSERVICE-OF (NEW-VALUE OBJECT)

Service source or destination of the message

URI-OF (OBJECT)

URI that is the source or destinationof the message

SETFURI-OF (NEW-VALUE OBJECT)

URI that is the source or destinationof the message

Undocumented

ATTRIBUTES-OF (OBJECT)

SETFATTRIBUTES-OF (NEW-VALUE OBJECT)

BUCKET-FOR (OBJECT)

SETFBUCKET-FOR (NEW-VALUE OBJECT)

BUCKET-OBJECT-FOR (OBJECT)

SETFBUCKET-OBJECT-FOR (NEW-VALUE OBJECT)

CURRENT-ATTRIBUTE-OF (OBJECT)

SETFCURRENT-ATTRIBUTE-OF (NEW-VALUE OBJECT)

CURRENT-OF (OBJECT)

SETFCURRENT-OF (NEW-VALUE OBJECT)

CURRENT-PERMISSION-OF (OBJECT)

SETFCURRENT-PERMISSION-OF (NEW-VALUE OBJECT)

OBJECT-CONTENT-FOR (OBJECT)

SETFOBJECT-CONTENT-FOR (NEW-VALUE OBJECT)

PATH-TO-MATCH (OBJECT)

SETFPATH-TO-MATCH (NEW-VALUE OBJECT)

QUEUE-FOR (OBJECT)

SETFQUEUE-FOR (NEW-VALUE OBJECT)

REGION-FOR (OBJECT)

SETFREGION-FOR (NEW-VALUE OBJECT)

RESPONSE-HEADERS (OBJECT)

SETFRESPONSE-HEADERS (NEW-VALUE OBJECT)

RESPONSE-MUST-CLOSE (OBJECT)

SETFRESPONSE-MUST-CLOSE (NEW-VALUE OBJECT)

RESPONSE-REASON-PHRASE (OBJECT)

SETFRESPONSE-REASON-PHRASE (NEW-VALUE OBJECT)

RESPONSE-STREAM (OBJECT)

SETFRESPONSE-STREAM (NEW-VALUE OBJECT)

RESULTS-OF (OBJECT)

SETFRESULTS-OF (NEW-VALUE OBJECT)

VARIABLE

Public

*CREDENTIALS*

Credentials for authenticating against Amazon Web Services

Private

*CURRENT-ELEMENTS*

A list of current elements; the top one on the list is the current element, and the prior one can be restored by setting this to the cdr of itself

*CURRENT-ELEMENTS-TO-FIND*

The first element is the current element to find; the rest of the list is the elements remaining to be found

*CURRENT-HANDLERS*

The list of active handlers for XML parsing, with the current as the head of the list

*ELEMENTS-FOUND*

The text values for elements currently found

*ELEMENTS-TO-FIND*

A list of strings, each naming an element whose text we're interested in

*FINDS*

If the list of elements-to-find cycles more than once, then each iteration is added to this list. The final result will be the value of this variable.

*HTTP-REASON-PHRASE-MAP*

Used to map numerical return codes to reason phrases.

CLASS

Private

CREDENTIALS

Encapsulates credentials used for authenticating requests to AWS

DB-REQUEST

Base for requests targeting SimpleDB

EC2

EC2-REQUEST

EXPLICIT-CREDENTIALS

Credentials explicitly initialized to specific values

REQUEST

Encapsulates a single request sent to a service instance of AWS

RESPONSE

Encapsulates a response from a service instance of AWS

S3

S3-REQUEST

Base for requests targeting S3

SERVICE

Encapsulates a specific functional AWS (e.g., S3, SimpleDB, etc.)

SIMPLE-QUEUE-SERVICE

SIMPLEDB

SQS-REQUEST

USER-PRIVATE-CREDENTIALS

Credentials are stored in a pair of files in ~/.aws; 1 file for the access key id, and one for the secret key.

Undocumented

BUCKET-CONTENTS-BUILDER

BUILDER

DB-CREATE-DOMAIN-REQUEST

DB-DELETE-ATTRIBUTES-REQUEST

DB-DELETE-DOMAIN-REQUEST

DB-DOMAIN-METADATA-REQUEST

DB-GET-ATTRIBUTES-REQUEST

DB-LIST-DOMAINS-REQUEST

DB-PUT-ATTRIBUTES-REQUEST

DB-QUERY-REQUEST

DB-QUERY-WITH-ATTRIBUTES-REQUEST

DB-SELECT-REQUEST

EC2-AUTHORIZE-SECURITY-GROUP-INGRESS-REQUEST

EC2-DESCRIBE-AVAILABILITY-ZONES-REQUEST

EC2-DESCRIBE-INSTANCES-REQUEST

EC2-DESCRIBE-REGIONS-REQUEST

EC2-DESCRIBE-SECURITY-GROUPS-REQUEST

EC2-REVOKE-SECURITY-GROUP-INGRESS-REQUEST

EMPTY-CREDENTIALS

FIND-PATH-BUILDER

ITEMS-BUILDER

LIST-BUCKETS-BUILDER

MESSAGE

S3-CREATE-BUCKET-REQUEST

S3-DELETE-BUCKET-OBJECT-REQUEST

S3-DELETE-BUCKET-REQUEST

S3-GET-BUCKET-OBJECT-REQUEST

S3-LIST-BUCKET-OBJECTS-REQUEST

S3-LIST-BUCKETS-REQUEST

S3-PUT-BUCKET-OBJECT-REQUEST

SECURITY-GROUP-BUILDER

SQS-CREATE-QUEUE-REQUEST

SQS-DELETE-MESSAGE-REQUEST

SQS-DELETE-QUEUE-REQUEST

SQS-GET-QUEUE-ATTRIBUTES-REQUEST

SQS-LIST-QUEUES-REQUEST

SQS-RECEIVE-MESSAGE-REQUEST

SQS-SEND-MESSAGE-REQUEST

SQS-SET-QUEUE-ATTRIBUTES-REQUEST

CONDITION

Public

Undocumented

AWS-ERROR

BAD-DIGEST-ERROR

BUCKET-NOT-EMPTY-ERROR

INVALID-CLIENT-TOKEN-ID-ERROR

INVALID-QUERY-EXPRESSION-ERROR

NO-SUCH-BUCKET-ERROR

NO-SUCH-DOMAIN-ERROR

NO-SUCH-KEY-ERROR

SERVICE-UNAVAILABLE-ERROR

SIGNATURE-DOES-NOT-MATCH-ERROR

CONSTANT

Private

+HTTP-ACCEPTED+

HTTP return code (202) for 'Accepted'.

+HTTP-AUTHORIZATION-REQUIRED+

HTTP return code (401) for 'Authorization Required'.

+HTTP-BAD-GATEWAY+

HTTP return code (502) for 'Bad Gateway'.

+HTTP-BAD-REQUEST+

HTTP return code (400) for 'Bad Request'.

+HTTP-CONFLICT+

HTTP return code (409) for 'Conflict'.

+HTTP-CONTINUE+

HTTP return code (100) for 'Continue'.

+HTTP-CREATED+

HTTP return code (201) for 'Created'.

+HTTP-EXPECTATION-FAILED+

HTTP return code (417) for 'Expectation Failed'.

+HTTP-FAILED-DEPENDENCY+

HTTP return code (424) for 'Failed Dependency'.

+HTTP-FORBIDDEN+

HTTP return code (403) for 'Forbidden'.

+HTTP-GATEWAY-TIME-OUT+

HTTP return code (504) for 'Gateway Time-out'.

+HTTP-GONE+

HTTP return code (410) for 'Gone'.

+HTTP-INTERNAL-SERVER-ERROR+

HTTP return code (500) for 'Internal Server Error'.

+HTTP-LENGTH-REQUIRED+

HTTP return code (411) for 'Length Required'.

+HTTP-METHOD-NOT-ALLOWED+

HTTP return code (405) for 'Method Not Allowed'.

+HTTP-MOVED-PERMANENTLY+

HTTP return code (301) for 'Moved Permanently'.

+HTTP-MOVED-TEMPORARILY+

HTTP return code (302) for 'Moved Temporarily'.

+HTTP-MULTI-STATUS+

HTTP return code (207) for 'Multi-Status'.

+HTTP-MULTIPLE-CHOICES+

HTTP return code (300) for 'Multiple Choices'.

+HTTP-NO-CONTENT+

HTTP return code (204) for 'No Content'.

+HTTP-NON-AUTHORITATIVE-INFORMATION+

HTTP return code (203) for 'Non-Authoritative Information'.

+HTTP-NOT-ACCEPTABLE+

HTTP return code (406) for 'Not Acceptable'.

+HTTP-NOT-FOUND+

HTTP return code (404) for 'Not Found'.

+HTTP-NOT-IMPLEMENTED+

HTTP return code (501) for 'Not Implemented'.

+HTTP-NOT-MODIFIED+

HTTP return code (304) for 'Not Modified'.

+HTTP-OK+

HTTP return code (200) for 'OK'.

+HTTP-PARTIAL-CONTENT+

HTTP return code (206) for 'Partial Content'.

+HTTP-PAYMENT-REQUIRED+

HTTP return code (402) for 'Payment Required'.

+HTTP-PRECONDITION-FAILED+

HTTP return code (412) for 'Precondition Failed'.

+HTTP-PROXY-AUTHENTICATION-REQUIRED+

HTTP return code (407) for 'Proxy Authentication Required'.

+HTTP-REQUEST-ENTITY-TOO-LARGE+

HTTP return code (413) for 'Request Entity Too Large'.

+HTTP-REQUEST-TIME-OUT+

HTTP return code (408) for 'Request Time-out'.

+HTTP-REQUEST-URI-TOO-LARGE+

HTTP return code (414) for 'Request-URI Too Large'.

+HTTP-REQUESTED-RANGE-NOT-SATISFIABLE+

HTTP return code (416) for 'Requested range not satisfiable'.

+HTTP-RESET-CONTENT+

HTTP return code (205) for 'Reset Content'.

+HTTP-SEE-OTHER+

HTTP return code (303) for 'See Other'.

+HTTP-SERVICE-UNAVAILABLE+

HTTP return code (503) for 'Service Unavailable'.

+HTTP-SWITCHING-PROTOCOLS+

HTTP return code (101) for 'Switching Protocols'.

+HTTP-TEMPORARY-REDIRECT+

HTTP return code (307) for 'Temporary Redirect'.

+HTTP-UNSUPPORTED-MEDIA-TYPE+

HTTP return code (415) for 'Unsupported Media Type'.

+HTTP-USE-PROXY+

HTTP return code (305) for 'Use Proxy'.

+HTTP-VERSION-NOT-SUPPORTED+

HTTP return code (505) for 'Version not supported'.