()
| 74 | |
| 75 | @app.route("/decode", methods=["POST", "OPTIONS"]) |
| 76 | def decode(): |
| 77 | if request.method == "OPTIONS": |
| 78 | return ("", 204) |
| 79 | |
| 80 | try: |
| 81 | stack_trace = "" |
| 82 | addresses = [] |
| 83 | elf_url = "" |
| 84 | |
| 85 | if request.is_json: |
| 86 | payload = request.get_json() or {} |
| 87 | stack_trace = payload.get("stack_trace", "") |
| 88 | addresses = payload.get("addresses", []) |
| 89 | elf_url = payload.get("elf_url", "") |
| 90 | else: |
| 91 | stack_trace = request.form.get("stack_trace", "") |
| 92 | addresses_text = request.form.get("addresses", "") |
| 93 | elf_url = request.form.get("elf_url", "") |
| 94 | if addresses_text: |
| 95 | addresses = ADDRESS_RE.findall(addresses_text) |
| 96 | |
| 97 | if not addresses: |
| 98 | addresses = extract_addresses(stack_trace) |
| 99 | |
| 100 | elf_file = request.files.get("elf") |
| 101 | |
| 102 | with tempfile.TemporaryDirectory() as tmpdir: |
| 103 | tmpdir_path = Path(tmpdir) |
| 104 | elf_path = tmpdir_path / "firmware.elf" |
| 105 | |
| 106 | if elf_file: |
| 107 | elf_path.write_bytes(elf_file.read()) |
| 108 | elf_source = "upload" |
| 109 | elif elf_url: |
| 110 | download_elf(elf_url, elf_path) |
| 111 | elf_source = elf_url |
| 112 | else: |
| 113 | return jsonify({"error": "Missing ELF file or elf_url"}), 400 |
| 114 | |
| 115 | result = decode_addresses(elf_path, addresses) |
| 116 | |
| 117 | return jsonify( |
| 118 | { |
| 119 | "addresses": addresses, |
| 120 | "decoded": result["decoded"], |
| 121 | "addr2line": result["addr2line"], |
| 122 | "elf_source": elf_source, |
| 123 | } |
| 124 | ) |
| 125 | except Exception as exc: |
| 126 | return jsonify({"error": str(exc)}), 500 |
| 127 | |
| 128 | |
| 129 | if __name__ == "__main__": |
no test coverage detected