289 lines
8.5 KiB
Plaintext
289 lines
8.5 KiB
Plaintext
/*
|
|
文件名:HttpClass.nut
|
|
路径:Dps_A/BaseClass/HttpClass/HttpClass.nut
|
|
创建日期:2024-10-16 18:41
|
|
文件用途:Http类
|
|
*/
|
|
class Http {
|
|
|
|
Host = null;
|
|
Service = null;
|
|
|
|
constructor(host, service = "http") {
|
|
Host = host;
|
|
Service = service;
|
|
}
|
|
|
|
// 辅助函数:将参数表编码为 URL 编码字符串
|
|
function _EncodeParams(params) {
|
|
local encoded = "";
|
|
foreach(key, value in params) {
|
|
if (encoded.len() > 0) encoded += "&";
|
|
encoded += key + "=" + value; // 需要实现 urlencode
|
|
}
|
|
return encoded;
|
|
}
|
|
|
|
function Request(Type, Url, Content) {
|
|
local RequestBuffer = Type + " " + Url + " HTTP/1.1\r\nHost: " + Host + "\r\n";
|
|
|
|
if (Content) {
|
|
RequestBuffer += "Content-Length: " + Content.len() + "\r\n";
|
|
RequestBuffer += "Content-Type: application/x-www-form-urlencoded\r\n";
|
|
RequestBuffer += "\r\n";
|
|
RequestBuffer += Content;
|
|
} else {
|
|
RequestBuffer += "Connection: close\r\n\r\n";
|
|
}
|
|
return Sq_CreateHttp(Host, Service, RequestBuffer);
|
|
}
|
|
|
|
// 发送请求
|
|
function Post(Url, params = null) {
|
|
local content = null;
|
|
if (params != null && typeof params == "table") {
|
|
content = _EncodeParams(params); // 编码参数
|
|
}
|
|
return Request("POST", Url, content);
|
|
}
|
|
|
|
function Get(Url, Content = null) {
|
|
return Request("GET", Url, Content);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function xorEncryptDecrypt(BlobObj, Key) {
|
|
local Arr = [];
|
|
for (local i = 0; i< BlobObj.len(); i++) {
|
|
local currentKeyChar = Key[i % Key.len()];
|
|
Arr.push(BlobObj[i] ^ currentKeyChar);
|
|
}
|
|
return Arr;
|
|
}
|
|
|
|
function base64_encode(input) {
|
|
local base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
local inputLength = input.len();
|
|
local i = 0;
|
|
local j = 0;
|
|
local charArray3 = array(3);
|
|
local charArray4 = array(4);
|
|
local encoded = "";
|
|
|
|
while (inputLength--) {
|
|
charArray3[i++] = input[inputLength];
|
|
if (i == 3) {
|
|
charArray4[0] = (charArray3[0] & 0xfc) >> 2;
|
|
charArray4[1] = ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4);
|
|
charArray4[2] = ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6);
|
|
charArray4[3] = charArray3[2] & 0x3f;
|
|
|
|
for (i = 0; i< 4; i++) {
|
|
encoded += base64_chars.slice(charArray4[i], charArray4[i] + 1);
|
|
}
|
|
i = 0;
|
|
}
|
|
}
|
|
|
|
if (i) {
|
|
for (j = i; j< 3; j++) {
|
|
charArray3[j] = 0;
|
|
}
|
|
|
|
charArray4[0] = (charArray3[0] & 0xfc) >> 2;
|
|
charArray4[1] = ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4);
|
|
charArray4[2] = ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6);
|
|
charArray4[3] = charArray3[2] & 0x3f;
|
|
|
|
for (j = 0; j< i + 1; j++) {
|
|
encoded += base64_chars.slice(charArray4[j], charArray4[j] + 1);
|
|
}
|
|
|
|
while (i++<3) {
|
|
encoded += "=";
|
|
}
|
|
}
|
|
return encoded;
|
|
}
|
|
|
|
function AsciiToStr(code) {
|
|
local str = Memory.alloc(1);
|
|
str.writeS8(code);
|
|
return str.readUtf8String();
|
|
}
|
|
|
|
function base64_decode(input) {
|
|
local base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
local base64_map = {};
|
|
for (local i = 0; i< base64_chars.len(); i++) {
|
|
local key = base64_chars.slice(i, i + 1);
|
|
if (key != "=") {
|
|
base64_map[key] <- i;
|
|
}
|
|
}
|
|
local inputLength = input.len();
|
|
local i = 0;
|
|
local j = 0;
|
|
local charArray4 = array(4);
|
|
local charArray3 = array(3);
|
|
local decoded = [];
|
|
|
|
while (inputLength--) {
|
|
if (input.slice(i, i + 1) == "=") {
|
|
charArray4[j++] = 0;
|
|
} else {
|
|
charArray4[j++] = base64_map[input.slice(i, i + 1)];
|
|
}
|
|
i++;
|
|
if (j == 4) {
|
|
charArray3[0] = (charArray4[0] << 2) + ((charArray4[1] & 0x30) >> 4);
|
|
charArray3[1] = ((charArray4[1] & 0xf) << 4) + ((charArray4[2] & 0x3c) >> 2);
|
|
charArray3[2] = ((charArray4[2] & 0x3) << 6) + charArray4[3];
|
|
|
|
for (j = 0; j< 3; j++) {
|
|
decoded.push(charArray3[j]);
|
|
}
|
|
j = 0;
|
|
}
|
|
}
|
|
|
|
if (j) {
|
|
for (local k = j; k< 4; k++) {
|
|
charArray4[k] = 0;
|
|
}
|
|
|
|
charArray3[0] = (charArray4[0] << 2) + ((charArray4[1] & 0x30) >> 4);
|
|
charArray3[1] = ((charArray4[1] & 0xf) << 4) + ((charArray4[2] & 0x3c) >> 2);
|
|
charArray3[2] = ((charArray4[2] & 0x3) << 6) + charArray4[3];
|
|
|
|
for (local k = 0; k< j - 1; k++) {
|
|
decoded.push(charArray3[k]);
|
|
}
|
|
}
|
|
local ret = decoded.reverse();
|
|
ret.remove(0);
|
|
ret.push(0);
|
|
return ret;
|
|
}
|
|
|
|
|
|
function GetMyIp() {
|
|
local Hb = Http("tnedi.me");
|
|
return Hb.Get("/");
|
|
}
|
|
|
|
function generateRandomString(length) {
|
|
local alphabet = "abcdefghijklmnopqrstuvwxyz";
|
|
local result = "";
|
|
for (local i = 0; i< length; i++) {
|
|
local randomIndex = math.random(0, alphabet.len() - 1);
|
|
result += alphabet.get(randomIndex);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function Blend(str1, str2) {
|
|
local alphabet = "abcdefghijklmnopqrstuvwxyz";
|
|
local result = "";
|
|
local len = MathClass.getMin(str1.len(), str2.len());
|
|
for (local i = 0; i< len; i++) {
|
|
print((str1[i].tointeger() % alphabet.len()) - 1);
|
|
result += alphabet.slice((str1[i].tointeger() % alphabet.len()), (str1[i].tointeger() % alphabet.len()) + 1) + str2[i];
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function Encode(Str, Key = [9, 4, 7, 3, 3, 0, 6, 7, 0]) {
|
|
local StrPointer = Memory.allocUtf8String(Str);
|
|
local BlobObj = StrPointer.readBinary(Str.len());
|
|
local str = "";
|
|
for (local i = 0; i< BlobObj.len(); i++) {
|
|
str += BlobObj[i].tostring();
|
|
str += ","
|
|
}
|
|
print(str)
|
|
// printT(BlobObj);
|
|
local Arr = xorEncryptDecrypt(BlobObj, Key);
|
|
local encodestr = base64_encode(Arr);
|
|
return encodestr;
|
|
}
|
|
|
|
function Decode(Str, Key = [9, 4, 7, 3, 3, 0, 6, 7, 0]) {
|
|
local StrArr = base64_decode(Str);
|
|
local Arr = xorEncryptDecrypt(StrArr, Key);
|
|
local str = "";
|
|
for (local i = 0; i< Arr.len(); i++) {
|
|
str += Arr[i].tostring();
|
|
str += ","
|
|
}
|
|
print(str)
|
|
local StrPointer = Memory.alloc(Arr.len());
|
|
StrPointer.writeByteArray(Arr);
|
|
local decodestr = StrPointer.readUtf8String(Arr.len());
|
|
return decodestr;
|
|
}
|
|
}
|
|
|
|
|
|
class HttpResponse {
|
|
C_Object = null;
|
|
constructor(obj) {
|
|
C_Object = obj;
|
|
}
|
|
|
|
function Write(Msg) {
|
|
local response = "HTTP/1.1 200 OK\r\n";
|
|
if (typeof Msg == "table") {
|
|
response += "Content-Type: application/json\r\n";
|
|
local JsonString = Json.Encode(Msg);
|
|
response += "Content-Length: " + JsonString.len() + "\r\n";
|
|
response += "\r\n";
|
|
response += JsonString;
|
|
}
|
|
else if(typeof Msg == "string") {
|
|
response += "Content-Type: text/plain\r\n";
|
|
response += "Content-Length: " + Msg.len() + "\r\n";
|
|
response += "\r\n";
|
|
response += Msg;
|
|
}
|
|
|
|
Sq_HttpServerResponse_Write(C_Object, response);
|
|
}
|
|
}
|
|
|
|
class HttpServer {
|
|
|
|
Host = null;
|
|
Service = null;
|
|
|
|
//处理函数
|
|
Handler = null;
|
|
|
|
|
|
constructor(host, service = "80") {
|
|
Host = host;
|
|
Service = service;
|
|
|
|
getroottable()["HttpServer_" + Host + "_" + Service] <- this;
|
|
}
|
|
|
|
function Listen(Func) {
|
|
//记录处理函数
|
|
Handler = Func;
|
|
|
|
local success = Sq_CreateHttpServer(Host, Service, this);
|
|
if (success) {
|
|
::print("Server started successfully.");
|
|
} else {
|
|
::print("Failed to start server.");
|
|
}
|
|
}
|
|
|
|
function Event(SocketObject, Msg) {
|
|
Timer.SetTimeOut(Handler, 1, HttpResponse(SocketObject), Msg);
|
|
}
|
|
} |