class BaseHandler(object):
- def _request(self, route_uri, method, body="", headers=None):
+ def _request(self, route_uri, method, body="", headers=None,
+ multipart=False):
try:
- if "multipart" in route_uri:
+ if multipart:
return self._multipart_req(route_uri, method, body, headers)
retcode, content, status_code, resp = \
req_by_msb(route_uri, method, body, headers)
response = HttpResponse(content, status=status_code)
return response
- def send(self, vimid, full_path, body, method, headers=None):
+ def send(self, vimid, full_path, body, method, headers=None,
+ multipart=False):
try:
url = getMultivimDriver(vimid, full_path=full_path)
logging.exception("unkown exception: %s" % e)
return HttpResponse(str(e),
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
-
- return self._request(url, method, body=body, headers=headers)
+ return self._request(url, method, body=body, headers=headers,
+ multipart=multipart)
from multivimbroker.forwarder.views import Registry
from multivimbroker.forwarder.views import UnRegistry
from multivimbroker.forwarder.views import VIMTypes
-from multivimbroker.forwarder.views import MultiPartView
# API v1
from multivimbroker.forwarder.views import APIv1CheckCapacity
from multivimbroker.forwarder.views import APIv1Registry
from multivimbroker.forwarder.views import APIv1UnRegistry
from multivimbroker.forwarder.views import APIv1VIMTypes
-from multivimbroker.forwarder.views import APIv1MultiPartView
from multivimbroker.forwarder.views import APIv1InfraWorkload
urlpatterns = [
UnRegistry.as_view()),
url(r'^api/multicloud/v0/(?P<vimid>[0-9a-zA-Z_-]+)/extensions$',
Extension.as_view()),
- url(r'^api/multicloud/v0/(?P<vimid>[0-9a-zA-Z_-]+)/multipart',
- MultiPartView.as_view()),
url(r'^api/multicloud/v0/(?P<vimid>[0-9a-zA-Z_-]+)',
Forward.as_view()),
r'/(?P<cloud_region_id>[0-9a-zA-Z_-]+)/extensions$',
APIv1Extension.as_view()),
url(r'^api/multicloud/v1/(?P<cloud_owner>[0-9a-zA-Z_-]+)'
- r'/(?P<cloud_region_id>[0-9a-zA-Z_-]+)/multipart',
- APIv1MultiPartView.as_view()),
+ r'/(?P<cloud_region_id>[0-9a-zA-Z_-]+)/infra_workload',
+ APIv1InfraWorkload.as_view()),
url(r'^api/multicloud/v1/(?P<cloud_owner>[0-9a-zA-Z_-]+)'
r'/(?P<cloud_region_id>[0-9a-zA-Z_-]+)',
APIv1Forward.as_view()),
- url(r'^api/multicloud/v1/(?P<cloud_owner>[0-9a-zA-Z_-]+)'
- r'/(?P<cloud_region_id>[0-9a-zA-Z_-]+)/infra_workload',
- APIv1InfraWorkload.as_view()),
]
urlpatterns = format_suffix_patterns(urlpatterns)
import json
import re
import tempfile
+from django.core.files.uploadedfile import InMemoryUploadedFile
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
from multivimbroker.forwarder.base import BaseHandler
from multivimbroker.pub.utils.syscomm import originHeaders
from multivimbroker.pub.utils import syscomm
-from rest_framework.parsers import MultiPartParser
from multivimbroker.pub.msapi import extsys
headers=originHeaders(request))
-# Multipart view
-class MultiPartView(BaseServer):
-
- parser_classes = (MultiPartParser, )
-
- def post(self, request, vimid):
- try:
- register_openers()
- fileDict = dict(request.FILES.iterlists())
- params = {}
- for key in fileDict.keys():
- fileObj = fileDict[key][0]
- f = tempfile.NamedTemporaryFile(prefix="django_",
- suffix=fileObj._name,
- delete=False)
- f.write(fileObj.file.read())
- f.seek(fileObj.file.tell(), 0)
- fileObj.file.close()
- params[key] = open(f.name, 'rb')
- datagen, headers = multipart_encode(params)
- regex = re.compile('^HTTP_')
- for key, value in request.META.iteritems():
- if key.startswith("HTTP_"):
- headers[regex.sub('', key).replace('_', '-')] = value
- resp = self.send(vimid, request.path, datagen, "POST",
- headers=headers)
- finally:
- for key in params:
- fileRef = params[key]
- if fileRef.closed is False:
- fileRef.close()
- os.remove(fileRef.name)
- return resp
-
-
# API v1
# proxy handler
class APIv1Identity(Identity):
return super(APIv1Forward, self).put(request, vimid)
-# Multipart view
-class APIv1MultiPartView(MultiPartView):
-
- def post(self, request, cloud_owner, cloud_region_id):
-
- vimid = extsys.encode_vim_id(cloud_owner, cloud_region_id)
- return super(APIv1MultiPartView, self).post(request, vimid)
-
-
class APIv1InfraWorkload(BaseServer):
def post(self, request, cloud_owner, cloud_region_id):
vimid = extsys.encode_vim_id(cloud_owner, cloud_region_id)
+ if len(request.FILES) != 0:
+ return self.__process_multipart(request, vimid)
return self.send(vimid, request.get_full_path(), request.body, "POST",
headers=originHeaders(request))
vimid = extsys.encode_vim_id(cloud_owner, cloud_region_id)
return self.send(vimid, request.get_full_path(), request.body,
"DELETE", headers=originHeaders(request))
+
+ def __process_multipart(self, request, vimid):
+ try:
+ register_openers()
+ dataDict = dict(request.data.iterlists())
+ params = {}
+ for key in dataDict.keys():
+ dataObj = dataDict[key][0]
+ if isinstance(dataObj, InMemoryUploadedFile):
+ f = tempfile.NamedTemporaryFile(prefix="django_",
+ suffix=dataObj._name,
+ delete=False)
+ f.write(dataObj.file.read())
+ f.seek(dataObj.file.tell(), 0)
+ dataObj.file.close()
+ params[key] = open(f.name, 'rb')
+ else:
+ params[key] = dataObj
+ datagen, headers = multipart_encode(params)
+ regex = re.compile('^HTTP_')
+ for key, value in request.META.iteritems():
+ if key.startswith("HTTP_"):
+ headers[regex.sub('', key).replace('_', '-')] = value
+ resp = self.send(vimid, request.path, datagen, "POST",
+ headers=headers, multipart=True)
+ finally:
+ for key in params:
+ refobj = params[key]
+ if type(refobj) is not unicode:
+ if refobj.closed is False:
+ print refobj.close()
+ os.remove(refobj.name)
+ return resp