Common Lisp Package: CL-AZURE

README:

cl-azure

Access Microsoft Windows Azure cloud services from Common Lisp.

Introduction

Windows Azure is Microsoft's cloud hosting platform. This project is an incomplete, proof-of-concept implementation of a Common Lisp library for accessing the various features including:

Blobs, tables and queues; Access Control Service (ACS); Service Bus brokered messsaging; Media Services.

Instructions

Use Quicklisp to load cl-azure

> (ql:quickload "cl-azure") 

You then need to specify your account details. One way to do this is to create a LISP file, say myaccount.lisp like this.

 (in-package #:cl-azure)  
 
 (setf *storage-account* (list :account-name "YOUR_ACCOUNT_NAME"  
			:account-key "YOUR_ACCOUNT_KEY"  
			:table-storage-url  
			"http://YOUR_ACCOUNT_NAME.table.core.windows.net"  
			:blob-storage-url  
			"http://YOUR_ACCOUNT_NAME.blob.core.windows.net"  
			:queue-storage-url  
			"http://YOUR_ACCOUNT_NAME.queue.core.windows.net")) 

From there you're ready to explore

 WA> (list-containers)  
 ("$root" "azurerunme" "azurerunme-files" "certs" "drives" "dump" "old"  
  "oldpackages" "packages" "printer" "public" "test" "wad-control-container")  
 
 WA> (list-blobs "packages")  
 ("AzureRunMe.cspkg" "AzureRunMe.cspkg.sun" "AzureRunMe.cspkg.xxxx"  
 "AzureRunMe.cspkg.yyy" "PsTools.zip" "RobBlackwell.cscfg" "adplus.zip"  
 "apache-tomcat-6.0.28-windows-x64.zip" "apache-tomcat-7.0.12-windows-x64.zip"  
 "clisp-2.49.zip" "dictionarybk" "examples.zip" "jboss-as-web-7.0.0.Final.zip"  
 "jdk1.6.0_21.zip" "jdk1.6.0_24.zip" "robblackwell.bat" "runme.zip"  
 "telnetd.zip")  
 
 WA> (list-queues)  
 ("foo" "wibble" "worker-queue") 

Management API

If you want to use the Windows Azure Management API, then you'll need a pfx certificate.

You'll need to convert it to PEM format like this:

   % openssl pkcs12 -in your.pfx -out your.pfx.pem 

Then you can set it up like this:

 (setf *subscription-id* "YOUR_SUBSCRIPTION_ID")  
 
 (setf *management-certificate* (list  
			:certificate "/Users/foo/YOUR.pfx.pem"  
			:key "/users/foo/YOUR.pfx.pem"  
			:pass-phrase "YOUR_PASSWORD")) 

Then you can use it like this:

 WA> (list-hosted-services)  
 ("azurerunme" "catalina" "claptrap")	 

Service Bus

Experimental support for Service Bus Brokered Messaging. N.B. It seems like the relay features are still proprietary and therefore .NET / WCF only.

 WA > (setf *servicebus-credentials* (make-servicebus-credentials "namespace" "owner" "key"))  
 ...  
 WA > (setf (getf *servicebus-credentials* :token) (get-token))  
 ....  
 WA> (servicebus-send-message "test" "hello world")  
 T  
 WA> (servicebus-read-and-delete-queue-message "test" )  
 "hello world" 

Media Services

Experimental support for Media Services.

CL-USER> (ql:quickload "cl-azure")  
...  
CL-USER> (setf cl-azure::*media-account*  
  		 (cl-azure:make-media-account "MY ACCOUNT"  
			   "MY_KEY))  
...  
    CL-USER> (cl-azure:get-media-processors)  
...  
    CL-USER> (cl-azure:get-media-assets)  
...  
    CL-USER> (cl-azure:get-media-jobs)  
...  

Why?

This code was the result of some Christmas holiday hacking (2010/2011) inspired by the Land of Lisp book, the recent availability of Quicklisp and Zach Beane's open source code for Amazon Web Services.

I hope it demonstrates that Windows Azure is an open, cross platform cloud storage system that isn't tied to Windows or .NET.

It certainly shows that Common Lisp is still suitable for modern application development.

It's helped me to understand the Windows Azure API mechanisms, but more than that, it turns out to be a useful debugging and experimentation tool.

I always get a buzz out of standing up in front of a bunch of C# developers and demo'ing it ;-)

Any comments, feedback, constructive criticism or code contributions welcome!

Rob Blackwell

January 2012

FUNCTION

Public

ACCOUNT-FROM-ENVIRONMENT

Reads the Azure account details from the underlying OS variables AZURE_ACCOUNT_NAME and AZURE_ACCOUNT_KEY

APPROXIMATE-MESSAGES-COUNT (QUEUE-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*))

Returns the approximate number of messages on the given queue.

CLEAR-MESSAGES (QUEUE-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'NO-CONTENT-HANDLER))

Deletes all messages from the specified queue.

CREATE-CONTAINER (CONTAINER-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'CREATED-HANDLER))

Creates a new container.

CREATE-QUEUE (QUEUE-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'CREATED-HANDLER))

Creates a new queue with the given name.

CREATE-TABLE (TABLE-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'CREATED-HANDLER))

Creates a table.

DELETE-BLOB (CONTAINER-NAME BLOB-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'ACCEPTED-HANDLER))

Deletes a blob.

DELETE-CONTAINER (CONTAINER-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'ACCEPTED-HANDLER))

Deletes a container.

DELETE-MESSAGE (QUEUE-NAME MESSAGE-ID POP-RECEIPT &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'NO-CONTENT-HANDLER))

Deletes the specified message.

DELETE-QUEUE (QUEUE-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'NO-CONTENT-HANDLER))

Deletes a queue

DELETE-TABLE (TABLE-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'NO-CONTENT-HANDLER))

Deletes the specified table and any data it contains.

ENSURE-TABLE (TABLE-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'ENSURE-CREATED-HANDLER))

Ensures that a table exists, if necessary creates it.

GET-BLOB (CONTAINER-NAME BLOB-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'GET-BODY-HANDLER))

Gets a Blob from the specificed container.

GET-BLOB-FILE (CONTAINER-NAME BLOB-NAME FILE-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (IF-EXISTS ERROR))

Gets a Blob and saves it to a file.

GET-BLOB-STRING (CONTAINER-NAME BLOB-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*))

Gets a Blob and returns it as a UTF8 string.

GET-MEDIA-TOKEN (&KEY (ACCOUNT *MEDIA-ACCOUNT*) (HANDLER #'JSON-HANDLER))

Requests a token from the OAuth v2 endpoint of ACS.

GET-MESSAGES (QUEUE-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'MESSAGES-HANDLER))

Retrieves one or more messages from the front of the queue.

GET-QUEUE-METADATA (QUEUE-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'GET-HEADERS-HANDLER))

Retrieves user-defined metadata and queue properties on the specified queue.

INSERT-ENTITY (TABLE-NAME ENTITY &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'CREATED-HANDLER))

Inserts a new entity into a table.

LIST-BLOBS (CONTAINER &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'LIST-NAME-ELEMENTS-HANDLER))

Enumerates the blobs in a storage container.

LIST-CERTIFICATES (SERVICE-NAME &KEY (SUBSCRIPTION-ID *SUBSCRIPTION-ID*) (MANAGEMENT-CERTIFICATE *MANAGEMENT-CERTIFICATE*) (HANDLER #'LIST-THUMBPRINT-ELEMENTS-HANDLER))

Lists all certificates associated with the specified hosted service.

LIST-CONTAINERS (&KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'LIST-NAME-ELEMENTS-HANDLER))

Enumerates the containers in a storage account.

LIST-HOSTED-SERVICES (&KEY (SUBSCRIPTION-ID *SUBSCRIPTION-ID*) (MANAGEMENT-CERTIFICATE *MANAGEMENT-CERTIFICATE*) (HANDLER #'LIST-SERVICE-NAME-ELEMENTS-HANDLER))

Lists the hosted services available for a subscription.

LIST-QUEUES (&KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'LIST-NAME-ELEMENTS-HANDLER))

Enumerates the queues in a storage account.

LIST-STORAGE-ACCOUNTS (&KEY (SUBSCRIPTION-ID *SUBSCRIPTION-ID*) (MANAGEMENT-CERTIFICATE *MANAGEMENT-CERTIFICATE*) (HANDLER #'LIST-SERVICE-NAME-ELEMENTS-HANDLER))

Lists the storage accounts available for a subscription.

MAKE-MEDIA-ACCOUNT (NAME KEY)

PEEK-MESSAGES (QUEUE-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'MESSAGES-HANDLER))

Retrieves one or more messages from the front of the queue, but does not alter the visibility of the message.

PUT-BLOB (CONTAINER-NAME BLOB-NAME CONTENT &KEY (ACCOUNT *STORAGE-ACCOUNT*) (BLOB-TYPE BlockBlob) (HANDLER #'CREATED-HANDLER))

Creates a new block blob or page blob.

PUT-MESSAGE (QUEUE-NAME MESSAGE &KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'CREATED-HANDLER))

Adds a new message to the back of the message queue.

QUERY-ENTITIES (TABLE-NAME &KEY (ACCOUNT *STORAGE-ACCOUNT*) (PARTITION-KEY NIL) (ROW-KEY NIL) (FILTER NIL) (SELECT NIL) (HANDLER #'ROWS-HANDLER))

Queries data in a table.

QUERY-TABLES (&KEY (ACCOUNT *STORAGE-ACCOUNT*) (HANDLER #'LIST-TABLENAME-ELEMENTS-HANDLER))

Enumerates the tables in a storage account.

Undocumented

GET-MEDIA-ASSETS (&KEY (MEDIA-ACCOUNT *MEDIA-ACCOUNT*) (HANDLER #'JSON-HANDLER))

GET-MEDIA-JOBS (&KEY (MEDIA-ACCOUNT *MEDIA-ACCOUNT*) (HANDLER #'JSON-HANDLER))

GET-MEDIA-PROCESSORS (&KEY (MEDIA-ACCOUNT *MEDIA-ACCOUNT*) (HANDLER #'JSON-HANDLER))

Private

ACCEPTED-HANDLER (RESPONSE)

Returns true if the HTTP response is accepted, otheriwse raises an error.

ADD-HEADER (REQUEST HEADER)

AUTHORIZATION-HEADER (ACCOUNT-NAME SIGNATURE)

Returns an HTTP authorization header for Windows Azure Shared Key Lite format authorisation.

BLOB-STORAGE-REQUEST (METHOD RESOURCE &KEY (ACCOUNT *STORAGE-ACCOUNT*) (CONTENT NIL) (HEADERS NIL) (HANDLER #'IDENTITY))

Makes an HTTP request to the Blob storage API.

CANONICALIZED-HEADERS (REQUEST)

See http://msdn.microsoft.com/en-us/library/dd179428.aspx, Constructing the Canonicalized Headers String.

CANONICALIZED-RESOURCE-1 (REQUEST)

See http://msdn.microsoft.com/en-us/library/dd179428.aspx, 2009-09-19 Shared Key Format.

CANONICALIZED-RESOURCE-2 (REQUEST)

See http://msdn.microsoft.com/en-us/library/dd179428.aspx, 2009-09-19 Shared Key Lite and Table Service Format.

CREATED-HANDLER (RESPONSE)

Returns true if the HTTP response is ok, otheriwse raises an error.

DISSECT-QUERY (QUERY-STRING)

Accepts a query string as in PURI:URI-QUERY and returns a corresponding alist of name/value pairs.

ENSURE-CREATED-HANDLER (RESPONSE)

returns true if the HTTP response is created, otheriwse raises an error.

ENTITY-CONTENT (ENTITY)

EXTRACT-NAMED-ELEMENTS (DOC NAME)

Extracts a list of all values from elements named name within an XML document doc.

EXTRACT-ROWS (DOC ROWNAME)

Returns a list of plists being rows identified by rowname.

EXTRACT-TOKEN (RESPONSE)

Extracts an ACS supplied SimpleWebToken from an ACS response and formats it as a WRAPv0.9.7.2 token for use with the Service Bus REST API.

FIND-NEXT-CHILD (SOURCE &OPTIONAL (FLAG NIL))

Finds the next child in the klacks source, or returns nil if no more children.

GET-BODY-HANDLER (RESPONSE)

Returns the response body if the HHTP status is ok, otherwise raises an error.

GET-HEADER (HEADERS NAME)

GET-HEADERS-HANDLER (RESPONSE)

Returns the respone headers if the HTTP status is ok, otherwise raises an error.

GET-TOKEN (&KEY (SERVICEBUS-CREDENTIALS *SERVICEBUS-CREDENTIALS*) (HANDLER #'EXTRACT-TOKEN))

Calls the Access Control Service to authenticate the given Service Bus credentials.

HMAC-STRING (KEY STRING)

Computes a Hash-based Message Authentication Code (HMAC) from string using the SHA256 algorithm.

ISO8601-DATE-TIME-STRING (&OPTIONAL (TIME (GET-UNIVERSAL-TIME)))

Returns an ISO8601 compliant date, e.g. 2011-02-20T14:51:22Z.

JSON-HANDLER (RESPONSE)

Handles and decodes an HTTP response in JSON format.

LIST-NAME-ELEMENTS-HANDLER (RESPONSE)

Returns a list of the elements named Name if the HTTP status is ok, otherwise raises an error.

LIST-SERVICE-NAME-ELEMENTS-HANDLER (RESPONSE)

Returns a list of the elements named ServiceName if the HTTP status is ok, otherwise raises an error.

LIST-TABLENAME-ELEMENTS-HANDLER (RESPONSE)

Extracts a list of tables from an ADO.NET entity set Atom feed response body.

LIST-THUMBPRINT-ELEMENTS-HANDLER (RESPONSE)

Returns a list of the elements named ServiceName if the HTTP status is ok, otherwise raises an error.

MAKE-EDM-OBJECT (OBJECT &OPTIONAL (EDM-DESCRIPTION NIL))

MANAGEMENT-REQUEST (METHOD RESOURCE &KEY (CONTENT NIL) (MANAGEMENT-CERTIFICATE *MANAGEMENT-CERTIFICATE*) (HANDLER #'IDENTITY))

Makes an HTTP request to the Windows Azure Service Management API

MD5 (STRING)

Computes an MD5 hash of the given string.

MEDIA-REQUEST (METHOD RESOURCE &KEY (MEDIA-ACCOUNT *MEDIA-ACCOUNT*) (CONTENT NIL) (HANDLER #'JSON-HANDLER))

Makes an HTTP request to the Media Services REST API.

MERGE-PLIST (P1 P2)

Merges two property lists

MESSAGES-HANDLER (RESPONSE)

MY-UTF8-BYTES-TO-STRING (BYTES)

Convert a byte array to a UTF-8 string, skipping the byte order mark if necessary

NO-CONTENT-HANDLER (RESPONSE)

Returns true if the HTTP response is no-content, otheriwse raises an error.

PLAINTEXT-TOKEN-REQUEST (ACS-URL WRAP-SCOPE WRAP-NAME WRAP-PASSWORD &KEY (HANDLER #'IDENTITY))

Requests a token from the Access Control Service.

PORTABLE-GETENV (NAME &OPTIONAL DEFAULT)

Returns the named operating system environment variable

PROPERTIES-XML (ENTITY)

QUEUE-STORAGE-REQUEST (METHOD RESOURCE &KEY (ACCOUNT *STORAGE-ACCOUNT*) (CONTENT NIL) (HEADERS NIL) (HANDLER #'IDENTITY))

Makes an HTTP request to the Queue storage API.

RFC1123-DATE-TIME-STRING (&OPTIONAL (TIME (GET-UNIVERSAL-TIME)))

Returns an RFC1123 compliant date, e.g. Sun, 11 Oct 2009 21:49:13 GMT.

ROWS-HANDLER (RESPONSE)

Extracts a list of table rows from an HTTP Response.

SERVICEBUS-GET-ENTITY (TOPIC-PATH &KEY (SERVICEBUS-CREDENTIALS *SERVICEBUS-CREDENTIALS*) (HANDLER #'IDENTITY))

SERVICEBUS-HANDLER (RESPONSE)

SERVICEBUS-LIST-QUEUES (&KEY (SERVICEBUS-CREDENTIALS *SERVICEBUS-CREDENTIALS*) (HANDLER #'IDENTITY))

Enumerates the Service Bus queues.

SERVICEBUS-LIST-TOPICS (&KEY (SERVICEBUS-CREDENTIALS *SERVICEBUS-CREDENTIALS*) (HANDLER #'IDENTITY))

Enumerates the Service bus topics.

SERVICEBUS-PEEK-LOCK-QUEUE-MESSAGE (QUEUE-PATH &KEY (TIMEOUT 30) (SERVICEBUS-CREDENTIALS *SERVICEBUS-CREDENTIALS*) (HANDLER #'IDENTITY))

Atomically retrieves and locks a message from a queue for processing.

SERVICEBUS-READ-AND-DELETE-QUEUE-MESSAGE (QUEUE-PATH &KEY (TIMEOUT 30) (SERVICEBUS-CREDENTIALS *SERVICEBUS-CREDENTIALS*) (HANDLER #'SERVICEBUS-HANDLER))

Atomically retrieves and locks a message from a queue for processing.

SERVICEBUS-SEND-MESSAGE (TOPIC-PATH MESSAGE &KEY (SERVICEBUS-CREDENTIALS *SERVICEBUS-CREDENTIALS*) (HANDLER #'CREATED-HANDLER))

Sends a new messages to a topic or queue.

SHARED-KEY-AUTHORIZATION-HEADER (ACCOUNT-NAME SIGNATURE)

Returns an HTTP authorization header for Windows Azure Shared Key format authorisation.

SIGN-BLOB-STORAGE-REQUEST (REQUEST)

Signs a blob storage request by computing a shared key signature and adding a corresponding Authorization header.

SIGN-QUEUE-STORAGE-REQUEST (REQUEST)

Signs a queue storage request by computing a shared key signature and adding a corresponding Authorization header.

SIGN-TABLE-STORAGE-REQUEST (REQUEST)

Signs a table storage request by computing a shared key signature and adding a corresponding Authorization header.

STRING-TO-SIGN-1 (REQUEST)

See http://msdn.microsoft.com/en-us/library/dd179428.aspx, Blob and Queue Services (Shared Key Authentication).

STRING-TO-SIGN-2 (REQUEST)

See http://msdn.microsoft.com/en-us/library/dd179428.aspx,Table Service (Shared Key Authentication).

STRING-TO-SIGN-3 (REQUEST)

See http://msdn.microsoft.com/en-us/library/dd179428.aspx, Blob and Queue Service (Shared Key Lite Authentication).

STRING-TO-SIGN-4 (REQUEST)

See http://msdn.microsoft.com/en-us/library/dd179428.aspx,Table Service (Shared Key Lite Authentication).

TABLE-STORAGE-REQUEST (METHOD RESOURCE &KEY (ACCOUNT *STORAGE-ACCOUNT*) (CONTENT NIL) (HEADERS NIL) (HANDLER #'IDENTITY))

Makes an HTTP request to the Table storage API.

UTF8 (STRING)

Converts a string to UTF8.

WEB-REQUEST (REQUEST)

Uses Drakma to make the specificed http request.

WINDOWS-AZURE-ERROR (RESPONSE)

Raises an error using the Message from the response body.

Undocumented

MAKE-EDM-BINARY (VALUE)

MAKE-EDM-BOOLEAN (VALUE)

MAKE-EDM-DATETIME (VALUE)

MAKE-EDM-DOUBLE (VALUE)

MAKE-EDM-GUID (VALUE)

MAKE-EDM-INT32 (VALUE)

MAKE-EDM-INT64 (VALUE)

MAKE-EDM-STRING (VALUE)

MAKE-SERVICEBUS-CREDENTIALS (SERVICE-NAMESPACE ISSUER-NAME ISSUER-SECRET)

PROPERTY-XML (NAME VALUE &OPTIONAL (TYPE NIL))

PUT-MESSAGE-CONTENT (MESSAGE)

STRINGIFY (X)

TYPE-XML (TYPE)

URL-DECODE (STRING)

MACRO

Private

DEFCONSTANT (NAME VALUE &OPTIONAL DOC)

Make sure VALUE is evaluated only once (to appease SBCL).

GENERIC-FUNCTION

Private

REQUEST-BODY (REQUEST)

Returns the body from an HTTP request.

REQUEST-HEADERS (REQUEST)

Returns the headers from an HTTP request.

REQUEST-METHOD (REQUEST)

Returns the request method from an HTTP request.

REQUEST-URI (REQUEST)

Returns the uri from an HTTP request.

RESPONSE-BODY (RESPONSE)

Returns the body from an HTTP response.

RESPONSE-HEADERS (RESPONSE)

Returns the headers from an HTTP response.

RESPONSE-STATUS (RESPONSE)

Returns the status code from an HTTP response.

Undocumented

ACCOUNT-KEY (ACCOUNT)

ACCOUNT-NAME (ACCOUNT)

ACS-URL (SERVICEBUS-CREDENTIALS)

BLOB-STORAGE-URL (ACCOUNT)

CLIENT-CERTIFICATE-CERTIFICATE (CLIENT-CERTIFICATE)

CLIENT-CERTIFICATE-KEY (CLIENT-CERTIFICATE)

CLIENT-CERTIFICATE-PASS-PHRASE (CLIENT-CERTIFICATE)

ISSUER-NAME (SERVICEBUS-CREDENTIALS)

ISSUER-SECRET (SERVICEBUS-CREDENTIALS)

MEDIA-ACCESS-TOKEN (ACCOUNT)

MEDIA-ACCOUNT-KEY (ACCOUNT)

MEDIA-ACCOUNT-NAME (ACCOUNT)

MEDIA-API-URL (ACCOUNT)

MEDIA-OAUTH-URL (ACCOUNT)

MESSAGE-ID (MESSAGE)

POP-RECEIPT (MESSAGE)

QUEUE-STORAGE-URL (ACCOUNT)

REALM (SERVICEBUS-CREDENTIALS)

REQUEST-ACCOUNT (REQUEST)

REQUEST-CLIENT-CERTIFICATE (REQUEST)

SERVICE-NAMESPACE (SERVICEBUS-CREDENTIALS)

SERVICEBUS-URL (SERVICEBUS-CREDENTIALS)

TABLE-STORAGE-URL (ACCOUNT)

TO-EDM-STRING (OBJECT)

TOKEN (SERVICEBUS-CREDENTIALS)

SLOT-ACCESSOR

Private

Undocumented

EDM-TYPE-DESCRIPTION (OBJECT)

VALUE (OBJECT)

VARIABLE

Public

Undocumented

*STORAGE-ACCOUNT*

Private

Undocumented

*CREATE-TABLE-TEMPLATE*

*GET-MEDIA-TOKEN-TEMPLATE*

*INSERT-ENTITY-TEMPLATE*

*MANAGEMENT-CERTIFICATE*

*MEDIA-ACCOUNT*

*PLAINTEXT-TOKEN-REQUEST-BODY-TEMPLATE*

*PUT-MESSAGE-TEMPLATE*

*SAMPLE-ACCOUNT*

*SERVICEBUS-CREDENTIALS*

*SERVICEBUS-SEND-MESSAGE-BODY-TEMPLATE*

*SUBSCRIPTION-ID*

CLASS

Private

EDM-BINARY

EDM-BOOLEAN

EDM-DATETIME

EDM-DOUBLE

EDM-GUID

EDM-INT32

A 32-bit integer

EDM-INT64

A 64-bit integer

EDM-OBJECT

An Entity Data Model type

EDM-STRING

CONSTANT

Private

+EDM-BINARY+

An array of bytes up to 64 KB in size

+EDM-BOOLEAN+

A Boolean value

+EDM-DATETIME+

A 64 bit value in UTC

+EDM-DOUBLE+

A 64 bit floating point value

+EDM-GUID+

A 128-bit globally unique identifier

+EDM-INT32+

A 32-bit integer

+EDM-INT64+

A 64-bit integer

+EDM-STRING+

A UTF-16-encoded of upto 64 KB in size

+HTTP-ACCEPTED+

Accepted

+HTTP-AUTHORIZATION-REQUIRED+

Unauthorized

+HTTP-BAD-GATEWAY+

Bad Gateway

+HTTP-BAD-REQUEST+

Bad Request

+HTTP-CONFLICT+

Conflict

+HTTP-CONTINUE+

Continue

+HTTP-CREATED+

Created

+HTTP-EXPECTATION-FAILED+

Expectation Failed

+HTTP-FAILED-DEPENDENCY+

Failed Dependency

+HTTP-FORBIDDEN+

Forbidden

+HTTP-GATEWAY-TIME-OUT+

Gateway Timeout

+HTTP-GONE+

Gone

+HTTP-INTERNAL-SERVER-ERROR+

Internal Server Error

+HTTP-LENGTH-REQUIRED+

Length Required

+HTTP-METHOD-NOT-ALLOWED+

Method Not Allowed

+HTTP-MOVED-PERMANENTLY+

Moved Permanently

+HTTP-MOVED-TEMPORARILY+

Found

+HTTP-MULTI-STATUS+

Multi-Status

+HTTP-MULTIPLE-CHOICES+

Multiple Choices

+HTTP-NO-CONTENT+

No Content

+HTTP-NON-AUTHORITATIVE-INFORMATION+

Non-Authoritative Information

+HTTP-NOT-ACCEPTABLE+

Not Acceptable

+HTTP-NOT-FOUND+

Not Found

+HTTP-NOT-IMPLEMENTED+

Not Implemented

+HTTP-NOT-MODIFIED+

Not Modified

+HTTP-OK+

OK

+HTTP-PARTIAL-CONTENT+

Partial Content

+HTTP-PAYMENT-REQUIRED+

Payment Required

+HTTP-PRECONDITION-FAILED+

Precondition Failed

+HTTP-PROXY-AUTHENTICATION-REQUIRED+

Proxy Authentication Required

+HTTP-REQUEST-ENTITY-TOO-LARGE+

Request Entity Too Large

+HTTP-REQUEST-TIME-OUT+

Request Timeout

+HTTP-REQUEST-URI-TOO-LARGE+

Request-URI Too Large

+HTTP-REQUESTED-RANGE-NOT-SATISFIABLE+

Requested Range Not Satisfiable

+HTTP-RESET-CONTENT+

Reset Content

+HTTP-SEE-OTHER+

See Other

+HTTP-SERVICE-UNAVAILABLE+

Service Unavailable

+HTTP-SWITCHING-PROTOCOLS+

Switching Protocols

+HTTP-TEMPORARY-REDIRECT+

Temporary Redirect

+HTTP-UNSUPPORTED-MEDIA-TYPE+

Unsupported Media Type

+HTTP-USE-PROXY+

Use Proxy

+HTTP-VERSION-NOT-SUPPORTED+

HTTP Version Not Supported

+UTF8-BOM+

Byte Order Mark for UTF-8

Undocumented

+DAY-NAMES+

+DEVSTORE-ACCOUNT+

+DEVSTORE-BLOB-URL+

+DEVSTORE-KEY+

+DEVSTORE-QUEUE-URL+

+DEVSTORE-TABLE-URL+

+LINEFEED+

+MEDIA-API-URL+

+MEDIA-OAUTH-URL+

+MONTH-NAMES+

+SERVICE-MANAGEMENT-VERSION+