attachment_help.py
Go to the documentation of this file.
00001 #! /usr/bin/env python
00002 #
00003 # Software License Agreement (BSD License)
00004 #
00005 # Copyright (c) 2010, Willow Garage, Inc.
00006 # All rights reserved.
00007 #
00008 # Redistribution and use in source and binary forms, with or without
00009 # modification, are permitted provided that the following conditions
00010 # are met:
00011 #
00012 #  * Redistributions of source code must retain the above copyright
00013 #    notice, this list of conditions and the following disclaimer.
00014 #  * Redistributions in binary form must reproduce the above
00015 #    copyright notice, this list of conditions and the following
00016 #    disclaimer in the documentation and/or other materials provided
00017 #    with the distribution.
00018 #  * Neither the name of the Willow Garage nor the names of its
00019 #    contributors may be used to endorse or promote products derived
00020 #    from this software without specific prior written permission.
00021 #
00022 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00023 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00024 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00025 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00026 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00027 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00028 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00029 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00030 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00031 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00032 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00033 # POSSIBILITY OF SUCH DAMAGE.
00034 
00035 ##\author Scott Hassan, Kevin Watts
00036 
00037 """
00038 Utilities for loading attachment into WG Inventory System. Used in 
00039 wg_invent_client package only. No external code API
00040 """
00041 
00042 import urllib2
00043 import mimetypes
00044 import mimetools
00045 
00046 ## -------------------------------------------------------------
00047 
00048 def _encode_multipart_formdata(fields, files, BOUNDARY = '-----'+mimetools.choose_boundary()+'-----'):
00049     """ 
00050     Encodes fields and files for uploading.
00051     fields is a sequence of (name, value) elements for regular form fields - or a dictionary.
00052     files is a sequence of (name, filename, value) elements for data to be uploaded as files.
00053     Return (content_type, body) ready for urllib2.Request instance
00054     You can optionally pass in a boundary string to use or we'll let mimetools provide one.
00055     """    
00056 
00057     CRLF = '\r\n'
00058 
00059     L = []
00060 
00061     if isinstance(fields, dict):
00062         fields = fields.items()
00063 
00064     for (key, value) in fields:
00065         L.append('--' + BOUNDARY)
00066         L.append('Content-Disposition: form-data; name="%s"' % key)
00067         L.append('')
00068         L.append(value)
00069 
00070     for (key, filename, value) in files:
00071         #encoded = value.encode('base64')
00072         encoded = value
00073         filetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
00074         L.append('--' + BOUNDARY)
00075         L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename))
00076         L.append('Content-Length: %s' % len(encoded))
00077         L.append('Content-Type: %s' % filetype)
00078         L.append('Content-Transfer-Encoding: binary')
00079         L.append('')
00080         L.append(encoded)
00081 
00082     L.append('--' + BOUNDARY + '--')
00083     L.append('')
00084     body = CRLF.join([str(l) for l in L])
00085 
00086     content_type = 'multipart/form-data; boundary=%s' % BOUNDARY        # XXX what if no files are encoded
00087 
00088     return content_type, body
00089 
00090 def build_request(theurl, fields, files, txheaders=None):
00091   content_type, body = _encode_multipart_formdata(fields, files)
00092   if not txheaders: txheaders = {}
00093   txheaders['Content-type'] = content_type
00094   txheaders['Content-length'] = str(len(body))
00095   return urllib2.Request(theurl, body, txheaders)


wg_invent_client
Author(s): Scott Hassan, Kevin Watts
autogenerated on Sat Dec 28 2013 17:55:42