更新HttpServer类以支持服务ID管理,添加MD5类的hex_encode函数和改进base64_encode函数,修改A.nut文件以增加注释和功能
This commit is contained in:
@@ -262,12 +262,17 @@ class HttpServer {
|
||||
|
||||
//处理函数
|
||||
Handler = null;
|
||||
//服务ID
|
||||
ServerId = null;
|
||||
|
||||
|
||||
constructor(host, service = "80") {
|
||||
Host = host;
|
||||
Service = service;
|
||||
|
||||
if (getroottable().rawin("HttpServer_" + Host + "_" + Service)){
|
||||
throw "端口被占用";
|
||||
}
|
||||
getroottable()["HttpServer_" + Host + "_" + Service] <- this;
|
||||
}
|
||||
|
||||
@@ -275,15 +280,20 @@ class HttpServer {
|
||||
//记录处理函数
|
||||
Handler = Func;
|
||||
|
||||
local success = Sq_CreateHttpServer(Host, Service, this);
|
||||
if (success) {
|
||||
ServerId = Sq_CreateHttpServer(Host, Service, this);
|
||||
if (ServerId) {
|
||||
::print("Server started successfully.");
|
||||
} else {
|
||||
::print("Failed to start server.");
|
||||
}
|
||||
}
|
||||
|
||||
function Event(SocketObject, Msg) {
|
||||
Timer.SetTimeOut(Handler, 1, HttpResponse(SocketObject), Msg);
|
||||
function Stop()
|
||||
{
|
||||
Sq_StopHttpServer(ServerId);
|
||||
}
|
||||
|
||||
function Event(SocketObject, Header, Msg) {
|
||||
Timer.SetTimeOut(Handler, 1, HttpResponse(SocketObject), Header, Msg);
|
||||
}
|
||||
}
|
||||
@@ -21,31 +21,78 @@ class MD5 {
|
||||
Sq_CallFunc(MD5_Final_ptr, "void", ["pointer", "pointer"], Ctx, Result);
|
||||
}
|
||||
|
||||
// 16进制编码函数
|
||||
// 参数: input - 可以是字符串或字节数组或Memory对象
|
||||
// 返回: 32位16进制小写字符串(默认格式)
|
||||
function hex_encode(input) {
|
||||
local byteArray = [];
|
||||
|
||||
// 如果输入是字符串,转换为字节数组
|
||||
if (typeof input == "string") {
|
||||
for (local i = 0; i < input.len(); i++) {
|
||||
byteArray.append(input[i].tointeger() & 0xFF);
|
||||
}
|
||||
}
|
||||
// 如果输入是数组,直接使用
|
||||
else {
|
||||
byteArray = input;
|
||||
}
|
||||
|
||||
local encoded = "";
|
||||
|
||||
for (local i = 0; i < byteArray.len(); i++) {
|
||||
local byte = byteArray[i] & 0xFF;
|
||||
encoded += format("%02x", byte);
|
||||
}
|
||||
|
||||
return encoded;
|
||||
}
|
||||
|
||||
// Base64 编码函数
|
||||
// 参数: input - 可以是字符串或字节数组
|
||||
// 返回: base64 编码后的字符串
|
||||
function base64_encode(input) {
|
||||
local base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
local inputLength = input.len();
|
||||
|
||||
// 如果输入是字符串,转换为字节数组
|
||||
local byteArray = [];
|
||||
if (typeof input == "string") {
|
||||
for (local i = 0; i< input.len(); i++) {
|
||||
byteArray.append(input[i].tointeger() & 0xFF);
|
||||
}
|
||||
} else {
|
||||
// 假设是数组,直接使用
|
||||
byteArray = input;
|
||||
}
|
||||
|
||||
local inputLength = byteArray.len();
|
||||
local i = 0;
|
||||
local j = 0;
|
||||
local charArray3 = array(3);
|
||||
local charArray4 = array(4);
|
||||
local encoded = "";
|
||||
|
||||
while (inputLength--) {
|
||||
charArray3[i++] = input[inputLength];
|
||||
// 处理每3个字节为一组
|
||||
local pos = 0;
|
||||
while (pos< inputLength) {
|
||||
charArray3[i++] = byteArray[pos++];
|
||||
|
||||
if (i == 3) {
|
||||
// 将3个字节转换为4个base64字符
|
||||
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[charArray4[i]];
|
||||
encoded += base64_chars.slice(charArray4[i], charArray4[i] + 1);
|
||||
}
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (i) {
|
||||
// 处理剩余的字节(不足3个字节的情况)
|
||||
if (i > 0) {
|
||||
for (j = i; j< 3; j++) {
|
||||
charArray3[j] = 0;
|
||||
}
|
||||
@@ -56,9 +103,10 @@ class MD5 {
|
||||
charArray4[3] = charArray3[2] & 0x3f;
|
||||
|
||||
for (j = 0; j< i + 1; j++) {
|
||||
encoded += base64_chars[charArray4[j]];
|
||||
encoded += base64_chars.slice(charArray4[j], charArray4[j] + 1);
|
||||
}
|
||||
|
||||
// 添加填充字符 '='
|
||||
while (i++<3) {
|
||||
encoded += "=";
|
||||
}
|
||||
@@ -67,6 +115,7 @@ class MD5 {
|
||||
return encoded;
|
||||
}
|
||||
|
||||
|
||||
function GetFile(FileName) {
|
||||
local Io = IO(FileName, "r+");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user