Flight search app built on FlightConnections.com API data. Features: airport search with autocomplete, browse by country/state/map, flight schedules by route and date, multi-airline support with per-airline schedule loading. Includes 4,561-airport GPS database for map browsing. Adaptive light/dark mode UI inspired by Flighty. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
102 lines
3.6 KiB
JavaScript
102 lines
3.6 KiB
JavaScript
/*
|
|
* Simple URL connection logger.
|
|
* Hooks at the lowest level to catch ALL HTTP traffic regardless of OkHttp version.
|
|
*/
|
|
Java.perform(function() {
|
|
console.log("[*] Simple HTTP hook starting...");
|
|
|
|
// Hook HttpURLConnection
|
|
try {
|
|
var HttpURLConnection = Java.use("java.net.HttpURLConnection");
|
|
HttpURLConnection.getInputStream.implementation = function() {
|
|
var url = this.getURL().toString();
|
|
var code = this.getResponseCode();
|
|
console.log("[HTTP] " + code + " " + url);
|
|
return this.getInputStream();
|
|
};
|
|
console.log("[+] HttpURLConnection.getInputStream hooked");
|
|
} catch(e) {
|
|
console.log("[-] HttpURLConnection hook failed: " + e);
|
|
}
|
|
|
|
// Hook OkHttp Response - try multiple class paths
|
|
var okHttpClasses = [
|
|
"okhttp3.internal.http.RealInterceptorChain",
|
|
"okhttp3.internal.connection.RealInterceptorChain",
|
|
"okhttp3.RealCall"
|
|
];
|
|
|
|
for (var i = 0; i < okHttpClasses.length; i++) {
|
|
try {
|
|
var cls = Java.use(okHttpClasses[i]);
|
|
var methods = cls.class.getDeclaredMethods();
|
|
console.log("[*] Found " + okHttpClasses[i] + " with " + methods.length + " methods:");
|
|
for (var j = 0; j < methods.length; j++) {
|
|
console.log(" " + methods[j].getName());
|
|
}
|
|
} catch(e) {
|
|
console.log("[-] " + okHttpClasses[i] + ": not found");
|
|
}
|
|
}
|
|
|
|
// Hook OkHttp Response.body() to see what responses come back
|
|
try {
|
|
var Response = Java.use("okhttp3.Response");
|
|
Response.body.implementation = function() {
|
|
var body = this.body();
|
|
try {
|
|
var url = this.request().url().toString();
|
|
var code = this.code();
|
|
console.log("[OkHttp] " + code + " " + url);
|
|
|
|
if (body !== null && url.indexOf("spirit.com") !== -1 ||
|
|
url.indexOf("delta.com") !== -1 || url.indexOf("united.com") !== -1) {
|
|
|
|
// Try to peek at the body
|
|
try {
|
|
var source = body.source();
|
|
source.request(java_lang_Long.MAX_VALUE.value);
|
|
var buffer = source.getBuffer().clone();
|
|
var bodyStr = buffer.readUtf8();
|
|
|
|
if (bodyStr.length > 0) {
|
|
console.log("[BODY] (" + bodyStr.length + " chars) " + bodyStr.substring(0, Math.min(2000, bodyStr.length)));
|
|
|
|
send({
|
|
type: "RESPONSE",
|
|
url: url,
|
|
status: code,
|
|
body: bodyStr
|
|
});
|
|
}
|
|
} catch(be) {
|
|
console.log("[BODY-ERR] " + be);
|
|
}
|
|
}
|
|
} catch(e) {
|
|
// ignore
|
|
}
|
|
return body;
|
|
};
|
|
console.log("[+] OkHttp Response.body() hooked");
|
|
} catch(e) {
|
|
console.log("[-] OkHttp Response hook failed: " + e);
|
|
}
|
|
|
|
var java_lang_Long = Java.use("java.lang.Long");
|
|
|
|
// Also hook URL.openConnection for non-OkHttp traffic
|
|
try {
|
|
var URL = Java.use("java.net.URL");
|
|
URL.openConnection.overload().implementation = function() {
|
|
console.log("[URL] " + this.toString());
|
|
return this.openConnection();
|
|
};
|
|
console.log("[+] URL.openConnection hooked");
|
|
} catch(e) {
|
|
console.log("[-] URL hook failed: " + e);
|
|
}
|
|
|
|
console.log("[*] Simple HTTP hook ready.");
|
|
});
|