def deserialize_fields(text): """ Deserializes fields, according to RU-CENTER API rules :return: """ fields = {} for record in text.split('\n'): record = record.strip() if record == '': continue logger.debug("Unpack record '%s'" % record) key_value = record.split(':', 1) if len(key_value) != 2: raise ValueError(_("Wrong field record '%s'" % record)) (key, value) = key_value key = key.strip() if key not in fields: fields[key] = value.strip() else: fields[key] += ('\n' + value.strip()) return fields
def send(self, url): """ Send request to url and get Response """ assert url request_body = '' # serialize headers header = ProtocolHeader(self.headers) request_body += header.serialize() request_body += "\n" # serialize sections for section in self.sections: request_body += section.serialize() request_body += "\n" # send request headers = { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Charset": "utf-8" } data = urlencode({ 'SimpleRequest': request_body.encode('KOI8-R', errors='ignore') }) logger.debug("Sending request to: %s", url) logger.debug(request_body) http_response = requests.post(url, data, headers=headers) http_response.encoding = http_response.apparent_encoding if http_response.status_code >= 500 or http_response.status_code == 405: raise Exception(_("HTTP error %s. Service unavailable." % http_response.status_code)) response = RucenterResponse.from_http(http_response) if response.state >= 400: error_section = response.get_section('error') raise Exception(_("API ERROR %s: %s" % (response.state, '; '.join(error_section.errors)))) return response
def serialize_fields(fields): """ Serializes fields, according to RU-CENTER API rules :param fields: :return: """ logger.debug("Serialize fields:") logger.debug(fields) serialized = '' for key in fields: if not fields[key]: continue for line in unicode(fields[key]).split('\n'): line = line.strip() if line == '': continue serialized += "%s:%s\n" % (key, line) logger.debug("Serialized: %s", serialized) return serialized