def render_POST(self, request: Request) -> Any: """ POST request for /thin_wallet/send_tokens/ We expect 'tx_hex' as request args 'tx_hex': serialized tx in hexadecimal We return success (bool) :rtype: string (json) """ request.setHeader(b'content-type', b'application/json; charset=utf-8') set_cors(request, 'POST') # Validating if we still have unused threads to solve the pow if len(self.manager.pow_thread_pool.working ) == settings.MAX_POW_THREADS: return self.return_POST( False, 'The server is currently fully loaded to send tokens. Wait a moment and try again, please.' ) post_data = json.loads(request.content.read().decode('utf-8')) tx_hex = post_data['tx_hex'] try: tx = tx_or_block_from_bytes(bytes.fromhex(tx_hex)) except struct.error: return self.return_POST( False, 'Error parsing hexdump to create the transaction') assert isinstance(tx, Transaction) # Set tx storage tx.storage = self.manager.tx_storage # If this tx is a double spending, don't even try to propagate in the network is_double_spending = tx.is_double_spending() if is_double_spending: data = { 'success': False, 'message': 'Invalid transaction. At least one of your inputs has already been spent.' } return json.dumps(data, indent=4).encode('utf-8') request.should_stop_mining_thread = False if settings.SEND_TOKENS_STRATUM and self.manager.stratum_factory: self._render_POST_stratum(tx, request) else: self._render_POST(tx, request) request.notifyFinish().addErrback(self._responseFailed, request) from twisted.web.server import NOT_DONE_YET return NOT_DONE_YET
def _redirectOrJSON(result, request: http.Request, url: urlpath.URLPath, data): try: if request.getHeader('x-requested-with') == 'XMLHttpRequest': request.write(json.dumps(data).encode('utf-8')) if not request.notifyFinish().called: request.finish() return except: pass request.redirect(str(url).encode('ascii')) request.finish()