def publish(namespace, name, version, description_file, tar_file, readme_file, readme_file_ext): ''' Publish a tarblob to the registry, if the request fails, an exception is raised, which either triggers re-authentication, or is turned into a return value by the decorators. (If successful, the decorated function returns None) ''' url = '%s/%s/%s/versions/%s' % ( Registry_Base_URL, namespace, name, version ) if readme_file_ext == '.md': readme_section_name = 'readme.md' elif readme_file_ext == '': readme_section_name = 'readme' else: raise ValueError('unsupported readme type: "%s"' % readne_file_ext) # description file is in place as text (so read it), tar file is a file body = OrderedDict([('metadata',description_file.read()), ('tarball',tar_file), (readme_section_name, readme_file)]) headers = { } body, headers = multipart_form_encode(body, headers, uuid.uuid4().hex) auth = _registryAuthFilter() resource = Resource(url, pool=connection_pool.getPool(), filters=[auth]) response = resource.put( headers = headers, payload = body ) return None
def _set_body(self, body): ctype = self.headers.ipop('content-type', None) clen = self.headers.ipop('content-length', None) if isinstance(body, dict): if ctype is not None and \ ctype.startswith("multipart/form-data"): type_, opts = cgi.parse_header(ctype) boundary = opts.get('boundary', uuid.uuid4().hex) self._body, self.headers = multipart_form_encode(body, self.headers, boundary) # at this point content-type is "multipart/form-data" # we need to set the content type according to the # correct boundary like # "multipart/form-data; boundary=%s" % boundary ctype = self.headers.ipop('content-type', None) else: ctype = "application/x-www-form-urlencoded; charset=utf-8" self._body = form_encode(body) elif hasattr(body, "boundary") and hasattr(body, "get_size"): ctype = "multipart/form-data; boundary=%s" % body.boundary clen = body.get_size() self._body = body else: self._body = body if not ctype: ctype = 'application/octet-stream' if hasattr(self.body, 'name'): ctype = mimetypes.guess_type(body.name)[0] if not clen: if hasattr(self._body, 'fileno'): try: self._body.flush() except IOError: pass try: fno = self._body.fileno() clen = str(os.fstat(fno)[6]) except IOError: if not self.is_chunked(): clen = len(self._body.read()) elif hasattr(self._body, 'getvalue') and not \ self.is_chunked(): clen = len(self._body.getvalue()) elif isinstance(self._body, types.StringTypes): self._body = to_bytestring(self._body) clen = len(self._body) if clen is not None: self.headers['Content-Length'] = clen # TODO: maybe it's more relevant # to check if Content-Type is already set in self.headers # before overiding it if ctype is not None: self.headers['Content-Type'] = ctype
def set_body(self, body, headers, chunked=False): """ set HTTP body and manage form if needed """ content_type = headers.get('CONTENT-TYPE') content_length = headers.get('CONTENT-LENGTH') if not body: if content_type is not None: self.headers.append(('Content-Type', content_type)) if self.method in ('POST', 'PUT'): self.headers.append(("Content-Length", "0")) return # set content lengh if needed if isinstance(body, dict): if content_type is not None and \ content_type.startswith("multipart/form-data"): type_, opts = cgi.parse_header(content_type) boundary = opts.get('boundary', uuid.uuid4().hex) body, self.headers = multipart_form_encode(body, self.headers, boundary) else: content_type = "application/x-www-form-urlencoded; charset=utf-8" body = form_encode(body) elif hasattr(body, "boundary"): content_type = "multipart/form-data; boundary=%s" % body.boundary content_length = body.get_size() if not content_type: content_type = 'application/octet-stream' if hasattr(body, 'name'): content_type = mimetypes.guess_type(body.name)[0] if not content_length: if hasattr(body, 'fileno'): try: body.flush() except IOError: pass content_length = str(os.fstat(body.fileno())[6]) elif hasattr(body, 'getvalue'): try: content_length = str(len(body.getvalue())) except AttributeError: pass elif isinstance(body, types.StringTypes): body = util.to_bytestring(body) content_length = len(body) if content_length: self.headers.append(("Content-Length", content_length)) if content_type is not None: self.headers.append(('Content-Type', content_type)) elif not chunked: raise RequestError("Can't determine content length and " + "Transfer-Encoding header is not chunked") self.body = body
def set_body(self, body, headers, chunked=False): """ set HTTP body and manage form if needed """ content_type = headers.get('CONTENT-TYPE') content_length = headers.get('CONTENT-LENGTH') if not body: if content_type is not None: self.bheaders.append(('Content-Type', content_type)) if self.method in ('POST', 'PUT'): self.bheaders.append(("Content-Length", "0")) return # set content lengh if needed if isinstance(body, dict): if content_type is not None and \ content_type.startswith("multipart/form-data"): type_, opts = cgi.parse_header(content_type) boundary = opts.get('boundary', uuid.uuid4().hex) body, self.bheaders = multipart_form_encode(body, self.headers, boundary) else: content_type = "application/x-www-form-urlencoded; charset=utf-8" body = form_encode(body) elif hasattr(body, "boundary"): content_type = "multipart/form-data; boundary=%s" % body.boundary content_length = body.get_size() if not content_type: content_type = 'application/octet-stream' if hasattr(body, 'name'): content_type = mimetypes.guess_type(body.name)[0] if not content_length: if hasattr(body, 'fileno'): try: body.flush() except IOError: pass content_length = str(os.fstat(body.fileno())[6]) elif hasattr(body, 'getvalue'): try: content_length = str(len(body.getvalue())) except AttributeError: pass elif isinstance(body, types.StringTypes): body = util.to_bytestring(body) content_length = len(body) if content_length: self.bheaders.append(("Content-Length", content_length)) if content_type is not None: self.bheaders.append(('Content-Type', content_type)) elif not chunked: raise RequestError("Can't determine content length and " + "Transfer-Encoding header is not chunked") self.body = body
def request(self, method, path=None, payload=None, headers=None, **params): """ HTTP request This method may be the only one you want to override when subclassing `restkit.rest.Resource`. :param payload: string or File object passed to the body of the request :param path: string additionnal path to the uri :param headers: dict, optionnal headers that will be added to HTTP request. :param params: Optionnal parameterss added to the request """ headers = headers or {} headers.update(self._headers.copy()) self._body_parts = [] if payload is not None: if isinstance(payload, dict): ctype = headers.get('Content-Type') if ctype is not None and \ ctype.startswith("multipart/form-data"): type_, opts = cgi.parse_header(ctype) boundary = opts.get('boundary', uuid.uuid4().hex) payload, headers = multipart_form_encode(payload, headers, boundary) else: ctype = "application/x-www-form-urlencoded; charset=utf-8" headers['Content-Type'] = ctype payload = form_encode(payload) headers['Content-Length'] = len(payload) elif isinstance(payload, MultipartForm): ctype = "multipart/form-data; boundary=%s" % payload.boundary headers['Content-Type'] = ctype headers['Content-Length'] = str(payload.get_size()) if 'Content-Type' not in headers: ctype = 'application/octet-stream' if hasattr(payload, 'name'): ctype = mimetypes.guess_type(payload.name)[0] headers['Content-Type'] = ctype uri = self._make_uri(self.uri, path, **params) try: resp = self.do_request(uri, method=method, payload=payload, headers=headers) except ParserError: raise except Exception, e: raise RequestError(e)
def test_004(): u = "http://%s:%s/multipart2" % (HOST, PORT) fn = os.path.join(os.path.dirname(__file__), "1M") f = open(fn, 'rb') l = int(os.fstat(f.fileno())[6]) b = {'a': 'aa', 'b': ['bb', 'éàù@'], 'f': f} h = {'content-type': "multipart/form-data"} body, headers = multipart_form_encode(b, h, uuid.uuid4().hex) r = request(u, method='POST', body=body, headers=headers) t.eq(r.status_int, 200) t.eq(int(r.body_string()), l)
def test_004(): u = "http://%s:%s/multipart2" % (HOST, PORT) fn = os.path.join(os.path.dirname(__file__), "1M") f = open(fn, 'rb') l = int(os.fstat(f.fileno())[6]) b = {'a': 'aa', 'b': ['bb', six.b('éàù@')], 'f': f} h = {'content-type': "multipart/form-data"} body, headers = multipart_form_encode(b, h, uuid.uuid4().hex) r = request(u, method='POST', body=body, headers=headers) t.eq(r.status_int, 200) t.eq(int(r.body_string()), l)
def test_007(): import StringIO u = "http://%s:%s/multipart4" % (HOST, PORT) content = 'éàù@' f = StringIO.StringIO('éàù@') f.name = 'test.txt' b = {'a': 'aa', 'b': 'éàù@', 'f': f} h = {'content-type': "multipart/form-data"} body, headers = multipart_form_encode(b, h, uuid.uuid4().hex) r = request(u, method='POST', body=body, headers=headers) t.eq(r.status_int, 200) t.eq(r.body_string(), content)
def test_006(): u = "http://%s:%s/multipart4" % (HOST, PORT) fn = os.path.join(os.path.dirname(__file__), "1M") f = open(fn, 'rb') content = f.read() f.seek(0) b = {'a': 'aa', 'b': 'éàù@', 'f': f} h = {'content-type': "multipart/form-data"} body, headers = multipart_form_encode(b, h, uuid.uuid4().hex) r = request(u, method='POST', body=body, headers=headers) t.eq(r.status_int, 200) t.eq(r.body_string(), content)
def test_007(): from six import BytesIO as StringIO u = "http://%s:%s/multipart4" % (HOST, PORT) content = six.b('éàù@') f = StringIO(six.b('éàù@')) f.name = 'test.txt' b = {'a': 'aa', 'b': six.b('éàù@'), 'f': f} h = {'content-type': "multipart/form-data"} body, headers = multipart_form_encode(b, h, uuid.uuid4().hex) r = request(u, method='POST', body=body, headers=headers) t.eq(r.status_int, 200) t.eq(r.body_string(), content)
def test_006(): u = "http://%s:%s/multipart4" % (HOST, PORT) fn = os.path.join(os.path.dirname(__file__), "1M") f = open(fn, 'rb') content = f.read() f.seek(0) b = {'a': 'aa', 'b': six.b('éàù@'), 'f': f} h = {'content-type': "multipart/form-data"} body, headers = multipart_form_encode(b, h, uuid.uuid4().hex) r = request(u, method='POST', body=body, headers=headers) t.eq(r.status_int, 200) t.eq(r.body_string(), content)
def _set_body(self, body): ctype = self.headers.ipop('content-type', None) clen = self.headers.ipop('content-length', None) if isinstance(body, dict): if ctype is not None and \ ctype.startswith("multipart/form-data"): type_, opts = cgi.parse_header(ctype) boundary = opts.get('boundary', uuid.uuid4().hex) self._body, self.headers = multipart_form_encode(body, self.headers, boundary) else: ctype = "application/x-www-form-urlencoded; charset=utf-8" self._body = form_encode(body) elif hasattr(body, "boundary"): ctype = "multipart/form-data; boundary=%s" % self.body.boundary clen = body.get_size() self._body = body else: self._body = body if not ctype: ctype = 'application/octet-stream' if hasattr(self.body, 'name'): ctype = mimetypes.guess_type(body.name)[0] if not clen: if hasattr(self._body, 'fileno'): try: self._body.flush() except IOError: pass try: fno = self._body.fileno() clen = str(os.fstat(fno)[6]) except IOError: if not self.is_chunked(): clen = len(self._body.read()) elif hasattr(self._body, 'getvalue') and not \ self.is_chunked(): clen = len(self._body.getvalue()) elif isinstance(self._body, types.StringTypes): self._body = to_bytestring(self._body) clen = len(self._body) if clen is not None: self.headers['Content-Length'] = clen if ctype is not None: self.headers['Content-Type'] = ctype
def _set_body(self, body): ctype = self.headers.ipop('content-type', None) clen = self.headers.ipop('content-length', None) if isinstance(body, dict): if ctype is not None and \ ctype.startswith("multipart/form-data"): type_, opts = cgi.parse_header(ctype) boundary = opts.get('boundary', uuid.uuid4().hex) self._body, self.headers = multipart_form_encode( body, self.headers, boundary) else: ctype = "application/x-www-form-urlencoded; charset=utf-8" self._body = form_encode(body) elif hasattr(body, "boundary"): ctype = "multipart/form-data; boundary=%s" % self.body.boundary clen = body.get_size() self._body = body else: self._body = body if not ctype: ctype = 'application/octet-stream' if hasattr(self.body, 'name'): ctype = mimetypes.guess_type(body.name)[0] if not clen: if hasattr(self._body, 'fileno'): try: self._body.flush() except IOError: pass try: fno = self._body.fileno() clen = str(os.fstat(fno)[6]) except IOError: if not self.is_chunked(): clen = len(self._body.read()) elif hasattr(self._body, 'getvalue') and not \ self.is_chunked(): clen = len(self._body.getvalue()) elif isinstance(self._body, types.StringTypes): self._body = to_bytestring(self._body) clen = len(self._body) if clen is not None: self.headers['Content-Length'] = clen if ctype is not None: self.headers['Content-Type'] = ctype
def prepare_payload(data, prefix): data = soundcloud_flat_dict(data, prefix) return multipart_form_encode(data, {}, BOUNDARY)
def prepare_payload(data, prefix): data = soundcloud_flat_dict(data, prefix) return multipart_form_encode(data, {}, BOUNDARY, quote=lambda x: x)