diff tango/tango/net/http/HttpPost.d @ 132:1700239cab2e trunk

[svn r136] MAJOR UNSTABLE UPDATE!!! Initial commit after moving to Tango instead of Phobos. Lots of bugfixes... This build is not suitable for most things.
author lindquist
date Fri, 11 Jan 2008 17:57:40 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tango/tango/net/http/HttpPost.d	Fri Jan 11 17:57:40 2008 +0100
@@ -0,0 +1,122 @@
+/*******************************************************************************
+
+        copyright:      Copyright (c) 2004 Kris Bell. All rights reserved
+
+        license:        BSD style: $(LICENSE)
+
+        version:        Initial release: January 2006
+        
+        author:         Kris
+
+*******************************************************************************/
+
+module tango.net.http.HttpPost;
+
+public import   tango.net.Uri;
+
+private import  tango.io.GrowBuffer;
+
+private import  tango.net.http.HttpClient,
+                tango.net.http.HttpHeaders;
+
+/*******************************************************************************
+
+        Supports the basic needs of a client sending POST requests to a
+        HTTP server. The following is a usage example:
+
+        ---
+        // open a web-page for posting (see HttpGet for simple reading)
+        auto post = new HttpPost ("http://yourhost/yourpath");
+
+        // send, retrieve and display response
+        Cout (cast(char[]) post.write("posted data", "text/plain"));
+        ---
+
+*******************************************************************************/
+
+class HttpPost : HttpClient
+{      
+        private GrowBuffer buffer;
+
+        /***********************************************************************
+        
+                Create a client for the given URL. The argument should be
+                fully qualified with an "http:" or "https:" scheme, or an
+                explicit port should be provided.
+
+        ***********************************************************************/
+
+        this (char[] url, uint pageChunk = 16 * 1024)
+        {
+                this (new Uri(url), pageChunk);
+        }
+
+        /***********************************************************************
+        
+                Create a client with the provided Uri instance. The Uri should 
+                be fully qualified with an "http:" or "https:" scheme, or an
+                explicit port should be provided. 
+
+        ***********************************************************************/
+
+        this (Uri uri, uint pageChunk = 16 * 1024)
+        {
+                super (HttpClient.Post, uri);
+                buffer = new GrowBuffer (pageChunk, pageChunk);
+        }
+
+        /***********************************************************************
+        
+                Send query params only
+
+        ***********************************************************************/
+
+        void[] write ()
+        {
+                return write (null);
+        }
+
+        /***********************************************************************
+        
+                Send content and no query params. The contentLength header
+                will be set to match the provided content, and contentType
+                set to the given type.
+
+        ***********************************************************************/
+
+        void[] write (void[] content, char[] type)
+        {
+                auto headers = getRequestHeaders();
+
+                headers.add    (HttpHeader.ContentType, type);
+                headers.addInt (HttpHeader.ContentLength, content.length);
+                
+                return write (delegate void (IBuffer b){b.append(content);});
+        }
+
+        /***********************************************************************
+        
+                Send raw data via the provided pump, and no query 
+                params. You have full control over headers and so 
+                on via this method.
+
+        ***********************************************************************/
+
+        void[] write (Pump pump)
+        {
+                try {
+                    buffer.clear;
+                    open (pump, buffer);
+
+                    // check return status for validity
+                    auto status = getStatus();
+                    if (status is HttpResponseCode.OK || 
+                        status is HttpResponseCode.Created || 
+                        status is HttpResponseCode.Accepted)
+                        buffer.fill (getResponseHeaders.getInt (HttpHeader.ContentLength, uint.max));
+                    } finally {close;}
+
+                return buffer.slice;
+        }
+}
+