Files
SunnyNet/Api/SunnyNet.go
2026-05-30 16:14:39 +08:00

1541 lines
36 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package Api
import "C"
import (
"bytes"
"fmt"
"io/ioutil"
"net/url"
"runtime"
"sort"
"strconv"
"strings"
"time"
"github.com/qtgolang/SunnyNet/SunnyNet"
"github.com/qtgolang/SunnyNet/src/Call"
"github.com/qtgolang/SunnyNet/src/SunnyProxy"
"github.com/qtgolang/SunnyNet/src/http"
"github.com/qtgolang/SunnyNet/src/public"
)
// GetSunnyVersion 获取SunnyNet版本
func GetSunnyVersion() uintptr {
return public.PointerPtr(public.SunnyVersion)
}
// SetRequestHeader 设置HTTP/S请求体中的协议头
func SetRequestHeader(MessageId int, name, val string) {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return
}
if k == nil {
return
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Request == nil {
return
}
if k.Request.Header == nil {
k.Request.Header = make(http.Header)
}
array := strings.Split(strings.ReplaceAll(val, "\r", ""), "\n")
var arr []string
for _, v := range array {
if v != "" {
arr = append(arr, v)
}
}
k.Request.Header.SetArray(name, arr)
}
// SetRequestALLHeader 设置HTTP/S请求体中的全部协议头
func SetRequestALLHeader(MessageId int, value string) {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return
}
if k == nil {
return
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Request == nil {
return
}
k.Request.Header = make(http.Header)
arr := strings.Split(strings.ReplaceAll(value, "\r", ""), "\n")
if len(arr) > 0 {
for _, v := range arr {
arr2 := strings.Split(v, ":")
if len(arr2) >= 1 {
key := strings.TrimSpace(arr2[0])
if key != "" {
if len(v) >= len(arr2[0])+1 {
data := strings.TrimSpace(v[len(key)+1:])
if len(k.Request.Header[key]) > 0 {
k.Request.Header[key] = append(k.Request.Header[key], data)
} else {
k.Request.Header[key] = []string{data}
}
} else {
if len(k.Request.Header[key]) < 1 {
k.Request.Header[key] = []string{}
}
}
}
}
}
}
}
// SetRequestProxy 设置HTTP/S请求代理仅支持Socket5和http 例如 socket5://admin:123456@127.0.0.1:8888 或 http://admin:123456@127.0.0.1:8888
func SetRequestProxy(MessageId int, ProxyUrl string, outTime int) bool {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Proxy == nil {
k.Proxy, _ = SunnyProxy.ParseProxy(ProxyUrl, outTime)
}
if k.Proxy == nil {
return false
}
return true
}
// SetRequestHTTP2Config 设置HTTP 2.0 请求指纹配置 (若服务器支持则使用,若服务器不支持,设置了也不会使用),如果强制请求发送时使用HTTP/1.1 请填入参数 http/1.1
func SetRequestHTTP2Config(MessageId int, h2Config string) bool {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
if k.TlsConfig == nil {
return false
}
k.Lock.Lock()
defer k.Lock.Unlock()
isHTTP1 := strings.ToLower(strings.ReplaceAll(strings.TrimSpace(h2Config), " ", "")) == "http/1.1"
if isHTTP1 {
k.TlsConfig.NextProtos = public.HTTP1NextProtos
k.Request.SetHTTP2Config(nil)
return true
}
k.TlsConfig.NextProtos = public.HTTP2NextProtos
if h2Config != "" {
c, e := http.StringToH2Config(h2Config)
if e != nil {
k.Request.SetHTTP2Config(nil)
return false
}
k.Request.SetHTTP2Config(c)
return true
}
k.Request.SetHTTP2Config(nil)
return false
}
// GetResponseStatusCode 获取HTTP/S返回的状态码
func GetResponseStatusCode(MessageId int) int {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return -1
}
if k == nil {
return -1
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Response.Response == nil {
return -1
}
return k.Response.StatusCode
}
// GetRequestClientIp 获取当前HTTP/S请求由哪个IP发起
func GetRequestClientIp(MessageId int) string {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return ""
}
if k == nil {
return ""
}
k.Lock.Lock()
defer k.Lock.Unlock()
loadDrive := k.Global.Drive()
if loadDrive != nil {
if loadDrive.Name() == "tun" && runtime.GOOS == "android" {
return k.Conn.LocalAddr().String()
}
}
return k.Conn.RemoteAddr().String()
}
// GetResponseStatus 获取HTTP/S返回的状态文本 例如 [200 OK]
func GetResponseStatus(MessageId int) string {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return ""
}
if k == nil {
return ""
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Response.Response == nil {
return ""
}
k.Response.Status = strconv.Itoa(k.Response.StatusCode) + public.Space + http.StatusText(k.Response.StatusCode)
return k.Response.Status
}
// SetResponseStatus 修改HTTP/S返回的状态码
func SetResponseStatus(MessageId, code int) {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return
}
if k == nil {
return
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Response.Response == nil {
k.Response.Response = new(http.Response)
k.Response.Header = make(http.Header)
k.Response.Header.Set("Connection", "Close")
k.Response.ContentLength = 0
}
k.Response.StatusCode = code
k.Response.Status = strconv.Itoa(code) + public.Space + http.StatusText(code)
}
// DelResponseHeader 删除HTTP/S返回数据中指定的协议头
func DelResponseHeader(MessageId int, name string) {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return
}
if k == nil {
return
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Response.Response == nil {
return
}
if k.Response.Header == nil {
k.Response.Header = make(http.Header)
}
k.Response.Header.Del(name)
}
// DelRequestHeader 删除HTTP/S请求数据中指定的协议头
func DelRequestHeader(MessageId int, name string) {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return
}
if k == nil {
return
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Request == nil {
return
}
if k.Request.Header == nil {
k.Request.Header = make(http.Header)
}
k.Request.Header.Del(name)
}
// SetRequestCipherSuites 设置CipherSuites
func SetRequestCipherSuites(MessageId int) bool {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
if k.TlsConfig == nil {
return false
}
k.Lock.Lock()
defer k.Lock.Unlock()
k.RandomCipherSuites()
return true
}
// SetRequestOutTime 请求设置超时-毫秒
func SetRequestOutTime(MessageId int, times int) {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return
}
if k == nil {
return
}
k.Lock.Lock()
defer k.Lock.Unlock()
k.SendTimeout = time.Duration(times) * time.Millisecond
}
// SetRequestUrl 修改HTTP/S当前请求的URL
func SetRequestUrl(MessageId int, URI string) bool {
f := URI
arr := strings.Split(f, "/")
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Request == nil {
return false
}
Host := k.Request.Host
if len(arr) >= 3 {
Host = arr[2]
}
_u, _ := url.Parse(f)
if _u == nil {
if strings.HasSuffix(f, public.HttpRequestPrefix) || strings.HasSuffix(f, public.HttpsRequestPrefix) {
return false
}
_u, _ = url.Parse(public.HttpRequestPrefix + f)
if _u == nil {
return false
}
}
k.Request.Host = Host
k.Request.URL = _u
k.Request.RequestURI = ""
k.UpdateRawTarget(0)
k.Request.SetContext(public.Connect_Raw_Address, func() string { return Host })
if k.Request.Header.Get("host") != "" {
k.Request.Header.Set("host", k.Request.Host)
}
return true
}
// SetRequestCookie 修改、设置 HTTP/S当前请求数据中指定Cookie
func SetRequestCookie(MessageId int, name, val string) {
Cookie := public.NULL
books := false
sn := name
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return
}
if k == nil {
return
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Request == nil {
return
}
values := k.Request.Cookies()
for i := 0; i < len(values); i++ {
if values[i].Name == sn {
books = true
Cookie += values[i].Name + "=" + val + "; "
} else {
Cookie += values[i].Name + "=" + values[i].Value + "; "
}
}
if books == false {
Cookie += sn + "=" + val + "; "
}
if k.Request.Header == nil {
k.Request.Header = make(http.Header)
}
k.Request.Header.Set("Cookie", Cookie)
}
// SetRequestAllCookie 修改、设置 HTTP/S当前请求数据中的全部Cookie
func SetRequestAllCookie(MessageId int, val string) {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return
}
if k == nil {
return
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Request == nil {
return
}
if k.Request.Header == nil {
k.Request.Header = make(http.Header)
}
k.Request.Header.Set("Cookie", val)
}
// GetRequestHeader 获取 HTTP/S当前请求数据中的指定协议头
func GetRequestHeader(MessageId int, name string) string {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return ""
}
if k == nil {
return ""
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Request == nil {
return ""
}
if k.Request.Header == nil {
k.Request.Header = make(http.Header)
}
val := k.Request.Header.GetArray(name)
if strings.EqualFold(name, "cookie") {
return strings.Join(val, "; ")
}
if len(val) < 1 {
return ""
}
s := ""
for i, vv := range val {
if i == 0 {
s = vv
} else {
s += "\r\n" + vv
}
}
if len(s) > 0 {
return s
}
return ""
}
// SetResponseHeader 修改、设置 HTTP/S当前返回数据中的指定协议头
func SetResponseHeader(MessageId int, name string, val string) {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return
}
if k == nil {
return
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Response.Response == nil {
k.Response.Response = new(http.Response)
k.Response.Header = make(http.Header)
k.Response.Header.Set("Connection", "Close")
k.Response.ContentLength = 0
}
if k.Response.Header == nil {
k.Response.Header = make(http.Header)
}
arr := strings.Split(strings.ReplaceAll(val, "\r", ""), "\n")
var array []string
for _, v := range arr {
if v != "" {
array = append(array, v)
}
}
k.Response.Header.SetArray(name, array)
}
// SetResponseAllHeader 修改、设置 HTTP/S当前返回数据中的全部协议头例如设置返回两条Cookie 使用本命令设置 使用设置、修改 单条命令无效
func SetResponseAllHeader(MessageId int, value string) {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return
}
if k == nil {
return
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Response.Response == nil {
k.Response.Response = new(http.Response)
k.Response.Header = make(http.Header)
k.Response.Header.Set("Connection", "Close")
k.Response.ContentLength = 0
}
if k.Response.Header == nil {
k.Response.Header = make(http.Header)
}
arr := strings.Split(strings.ReplaceAll(value, "\r", ""), "\n")
if len(arr) > 0 {
k.Response.Header = make(http.Header)
for _, v := range arr {
arr2 := strings.Split(v, ":")
if len(arr2) >= 1 {
name := arr2[0]
if name == "" {
continue
}
if len(v) >= len(name)+1 {
data := strings.TrimSpace(v[len(name)+1:])
k.Response.Header.Add(name, data)
} else {
k.Response.Header.SetArray(name, []string{})
}
}
}
}
}
// GetRequestCookie 获取 HTTP/S当前请求数据中指定的Cookie
func GetRequestCookie(MessageId int, name string) string {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return ""
}
if k == nil {
return ""
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Request == nil {
return ""
}
val, E := k.Request.Cookie(name)
if E != nil {
return ""
}
return val.Name + "=" + val.Value + "; "
}
// SetResponseData 设置、修改 HTTP/S 当前请求返回数据 如果再发起请求时调用本命令,请求将不会被发送,将会直接返回 data=数据指针 dataLen=数据长度
func SetResponseData(MessageId int, data []byte) bool {
n := data
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Response.Response == nil {
k.Response.Response = new(http.Response)
k.Response.Header = make(http.Header)
k.Response.Header.Set("Server", "Sunny")
k.Response.Header.Set("Accept-Ranges", "bytes")
k.Response.Header.Set("Connection", "Close")
}
if k.Response.Header == nil {
k.Response.Header = make(http.Header)
}
k.Response.Header.Set("Content-Length", strconv.Itoa(len(n)))
k.Response.ContentLength = int64(len(n))
k.Response.Body = ioutil.NopCloser(bytes.NewBuffer(n))
return true
}
// GetRequestBody 获取 HTTP/S 当前POST提交数据 返回 数据指针
func GetRequestBody(MessageId int) []byte {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return nil
}
if k == nil {
return nil
}
if k.Request == nil {
return nil
}
k.Lock.Lock()
defer k.Lock.Unlock()
body := k.Request.GetData()
if body != nil {
return body
}
return nil
}
// GetRequestBodyLen 获取 HTTP/S 当前请求POST提交数据长度
func GetRequestBodyLen(MessageId int) int {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return 0
}
if k == nil {
return 0
}
if k.Request == nil {
return 0
}
k.Lock.Lock()
defer k.Lock.Unlock()
body := k.Request.GetData()
return len(body)
}
// GetResponseBodyLen 获取 HTTP/S 当前返回 数据长度
func GetResponseBodyLen(MessageId int) int {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return 0
}
if k == nil {
return 0
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Response.Response == nil {
return 0
}
if k.Response.Body != nil {
bodyBytes, e := ioutil.ReadAll(k.Response.Body)
k.Response.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
if e != nil {
return 0
}
return len(bodyBytes)
}
return 0
}
// SetRequestData 设置、修改 HTTP/S 当前请求POST提交数据 data=数据指针 dataLen=数据长度
func SetRequestData(MessageId int, data []byte) bool {
n := data
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
if k.Request == nil {
return false
}
k.Lock.Lock()
defer k.Lock.Unlock()
k.Request.SetData(n)
return true
}
// IsRequestRawBody 此请求是否为原始body 如果是 将无法修改提交的Body请使用 RawRequestDataToFile 命令来储存到文件
func IsRequestRawBody(MessageId int) bool {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
return k.IsRequestRawBody()
}
// RawRequestDataToFile 获取 HTTP/S 当前POST提交数据原始Data,传入保存文件名路径,例如"c:\1.txt"
func RawRequestDataToFile(MessageId int, saveFileName string) bool {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
return k.RawRequestDataToFile(saveFileName)
}
// GetResponseBody 获取 HTTP/S 当前返回数据 返回 数据指针
func GetResponseBody(MessageId int) []byte {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return nil
}
if k == nil {
return nil
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Response.Response == nil {
return nil
}
if k.Response.Body != nil {
bodyBytes, _ := ioutil.ReadAll(k.Response.Body)
k.Response.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
return bodyBytes
}
return nil
}
// GetRequestALLCookie 获取 HTTP/S 当前请求全部Cookie
func GetRequestALLCookie(MessageId int) string {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return ""
}
if k == nil {
return ""
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Request == nil {
return ""
}
val := k.Request.Cookies()
Cookie := public.NULL
for i := 0; i < len(val); i++ {
Cookie += val[i].Name + "=" + val[i].Value + "; "
}
return Cookie
}
// GetRequestProto 获取 HTTPS 请求的协议版本
func GetRequestProto(MessageId int) uintptr {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return public.NULLPtr
}
if k == nil {
return public.NULLPtr
}
if k.Request == nil {
return public.NULLPtr
}
k.Lock.Lock()
defer k.Lock.Unlock()
return public.PointerPtr(k.Request.Proto)
}
// GetResponseProto 获取 HTTPS 响应的协议版本
func GetResponseProto(MessageId int) uintptr {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return public.NULLPtr
}
if k == nil {
return public.NULLPtr
}
if k.Response.Response == nil {
return public.NULLPtr
}
k.Lock.Lock()
defer k.Lock.Unlock()
return public.PointerPtr(k.Response.Proto)
}
// GetResponseAllHeader 获取 HTTP/S 当前返回全部协议头
func GetResponseAllHeader(MessageId int) string {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return ""
}
if k == nil {
return ""
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Response.Response == nil {
return ""
}
if k.Response.Header == nil {
return ""
}
Head := public.NULL
var key []string
for value, _ := range k.Response.Header {
key = append(key, value)
}
sort.Strings(key)
for _, kv := range key {
for _, value := range k.Response.Header[kv] {
Head += kv + ": " + value + "\r\n"
}
}
return Head
}
// GetResponseHeader 获取 HTTP/S 当前返回数据中指定的协议头
func GetResponseHeader(MessageId int, name string) string {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return ""
}
if k == nil {
return ""
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Response.Response == nil {
return ""
}
if k.Response.Header == nil {
return ""
}
Head := k.Response.Header.GetArray(name)
if len(Head) < 1 {
return ""
}
s := ""
for i, vv := range Head {
if i == 0 {
s = vv
} else {
s += "\r\n" + vv
}
}
if len(s) > 0 {
return s
}
return ""
}
// GetResponseServerAddress 获取 HTTP/S 相应的服务器地址
func GetResponseServerAddress(MessageId int) string {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return ""
}
if k == nil {
return ""
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Response.Response == nil {
return ""
}
return k.Response.ServerIP
}
// GetRequestAllHeader 获取 HTTP/S 当前请求数据全部协议头
func GetRequestAllHeader(MessageId int) string {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return ""
}
if k == nil {
return ""
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.Request == nil {
return ""
}
if k.Request.Header == nil {
return ""
}
Head := public.NULL
var key []string
for value, _ := range k.Request.Header {
key = append(key, value)
}
sort.Strings(key)
for _, kv := range key {
if strings.EqualFold(kv, "cookie") {
Head += kv + ": " + strings.Join(k.Request.Header[kv], "; ") + "\r\n"
continue
}
for _, value := range k.Request.Header[kv] {
Head += kv + ": " + value + "\r\n"
}
}
return Head
}
// SetTcpBody 修改 TCP消息数据 MsgType=1 发送的消息 MsgType=2 接收的消息 如果 MsgType和MessageId不匹配将不会执行操作 data=数据指针 dataLen=数据长度
func SetTcpBody(MessageId, MsgType int, data []byte) bool {
n := data
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
k.Lock.Lock()
defer k.Lock.Unlock()
if MsgType == 1 {
if k.TCP.Send == nil {
return false
}
k.TCP.Send.Data.Reset()
k.TCP.Send.Data.Write(n)
}
if MsgType == 2 {
if k.TCP.Receive == nil {
return false
}
k.TCP.Receive.Data.Reset()
k.TCP.Receive.Data.Write(n)
}
return true
}
// SetTcpAgent 给当前TCP连接设置S5代理 仅先TCP回调 即将连接时使用
func SetTcpAgent(MessageId int, ProxyUrl string, outTime int) bool {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
k.Lock.Lock()
defer k.Lock.Unlock()
if k.TCP.Send == nil {
return false
}
proxy, err := SunnyProxy.ParseProxy(ProxyUrl, outTime)
if err != nil || proxy == nil {
return false
}
k.TCP.Send.Proxy = proxy
return true
}
// TcpCloseClient 根据唯一ID关闭指定的TCP连接 唯一ID在回调参数中
func TcpCloseClient(theology int) bool {
SunnyNet.TcpSceneLock.Lock()
w := SunnyNet.TcpStorage[theology]
SunnyNet.TcpSceneLock.Unlock()
if w == nil {
return false
}
w.L.Lock()
if w.ConnSend != nil {
_ = w.ConnSend.Close()
}
if w.ConnServer != nil {
_ = w.ConnServer.Close()
}
w.L.Unlock()
return true
}
// SetTcpConnectionIP 给指定的TCP连接 修改目标连接地址 目标地址必须带端口号 例如 baidu.com:443
func SetTcpConnectionIP(MessageId int, data string) bool {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
if k.TCP.Send == nil {
return false
}
k.Lock.Lock()
defer k.Lock.Unlock()
k.TCP.Send.Data.Reset()
k.TCP.Send.Data.WriteString(data)
return true
}
// TcpSendMsg 指定的TCP连接 模拟客户端向服务器端主动发送数据
func TcpSendMsg(theology int, data []byte) int {
n := data
SunnyNet.TcpSceneLock.Lock()
w := SunnyNet.TcpStorage[theology]
SunnyNet.TcpSceneLock.Unlock()
if w == nil {
return 0
}
if w.Send == nil {
return 0
}
w.L.Lock()
defer w.L.Unlock()
if len(n) > 0 {
x, e := w.ReceiveBw.Write(n)
if e == nil {
_ = w.ReceiveBw.Flush()
}
return x
}
return 0
}
// TcpSendMsgClient 指定的TCP连接 模拟服务器端向客户端主动发送数据
func TcpSendMsgClient(theology int, data []byte) int {
n := data
SunnyNet.TcpSceneLock.Lock()
w := SunnyNet.TcpStorage[theology]
SunnyNet.TcpSceneLock.Unlock()
if w == nil {
return 0
}
if w.Receive == nil {
return 0
}
if len(n) > 0 {
w.L.Lock()
defer w.L.Unlock()
x, e := w.SendBw.Write(n)
if e == nil {
_ = w.SendBw.Flush()
}
return x
}
return 0
}
// CloseWebsocket 主动关闭Websocket
func CloseWebsocket(Theology int) bool {
k, ok := SunnyNet.GetSceneWebSocketClient(Theology)
if ok == false {
return false
}
if k == nil {
return false
}
k.Sync.Lock()
if k.Server != nil {
_ = k.Server.Close()
}
if k.Client != nil {
_ = k.Client.Close()
}
k.Sync.Unlock()
return true
}
/*
GetMessageNote 获取请求中的注释,由脚本代码中设置
*/
func GetMessageNote(MessageId int) string {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return ""
}
if k == nil {
return ""
}
k.Lock.Lock()
defer k.Lock.Unlock()
return k.GetNote()
}
// GetWebsocketBodyLen 获取 WebSocket消息长度
func GetWebsocketBodyLen(MessageId int) int {
k, ok := SunnyNet.GetSceneWebSocketMsg(MessageId)
if ok == false {
return 0
}
if k == nil {
return 0
}
k.Sync.Lock()
defer k.Sync.Unlock()
return k.Data.Len()
}
// GetWebsocketBody 获取 WebSocket消息 返回数据指针
func GetWebsocketBody(MessageId int) []byte {
k, ok := SunnyNet.GetSceneWebSocketMsg(MessageId)
if ok == false {
return nil
}
if k == nil {
return nil
}
k.Sync.Lock()
defer k.Sync.Unlock()
return k.Data.Bytes()
}
// SetWebsocketBody 修改 WebSocket消息 data=数据指针 dataLen=数据长度
func SetWebsocketBody(MessageId int, data []byte) bool {
n := data
k, ok := SunnyNet.GetSceneWebSocketMsg(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
k.Sync.Lock()
k.Data.Reset()
k.Data.Write(n)
k.Sync.Unlock()
return true
}
// SendWebsocketBody 主动向Websocket服务器发送消息 MessageType=WS消息类型 data=数据指针 dataLen=数据长度
func SendWebsocketBody(Theology, MessageType int, bs []byte) bool {
m, ok := SunnyNet.GetSceneWebSocketClient(Theology)
if ok == false {
return false
}
if m == nil {
return false
}
if m.Sync == nil {
return false
}
if m.Server == nil {
return false
}
m.Sync.Lock()
e := m.Server.WriteMessage(MessageType, bs)
m.Sync.Unlock()
if e != nil {
return false
}
return true
}
// SendWebsocketClientBody 主动向Websocket客户端发送消息 MessageType=WS消息类型 data=数据指针 dataLen=数据长度
func SendWebsocketClientBody(Theology, MessageType int, bs []byte) bool {
m, ok := SunnyNet.GetSceneWebSocketClient(Theology)
if ok == false {
return false
}
if m == nil {
return false
}
if m.Sync == nil {
return false
}
if m.Client == nil {
return false
}
m.Sync.Lock()
e := m.Client.WriteMessage(MessageType, bs)
m.Sync.Unlock()
if e != nil {
return false
}
return true
}
// CreateSunnyNet 创建Sunny中间件对象,可创建多个
func CreateSunnyNet() int {
Sunny := SunnyNet.NewSunny()
SunnyNet.SunnyStorageLock.Lock()
SunnyNet.SunnyStorage[Sunny.SunnyContext] = Sunny
SunnyNet.SunnyStorageLock.Unlock()
return Sunny.SunnyContext
}
// ReleaseSunnyNet 释放SunnyNet
func ReleaseSunnyNet(SunnyContext int) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
defer SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.Close()
delete(SunnyNet.SunnyStorage, SunnyContext)
return true
}
// SetHTTPRequestMaxUpdateLength 设置HTTP请求,提交数据,最大的长度
func SetHTTPRequestMaxUpdateLength(SunnyContext int, i int64) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.SetHTTPRequestMaxUpdateLength(i)
return true
}
// SunnyNetStart 启动Sunny中间件 成功返回true
func SunnyNetStart(SunnyContext int) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.Start()
return w.Error == nil
}
// SunnyNetSetPort 设置指定端口 Sunny中间件启动之前调用
func SunnyNetSetPort(SunnyContext, Port int) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.SetPort(Port)
return true
}
// SunnyNetClose 关闭停止指定Sunny中间件
func SunnyNetClose(SunnyContext int) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.Close()
return true
}
// SunnyNetSetCert 设置自定义证书
func SunnyNetSetCert(SunnyContext, CertificateManagerId int) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.SetCert(CertificateManagerId)
return true
}
// SunnyNetInstallCert 安装证书 将证书安装到Windows系统内
func SunnyNetInstallCert(SunnyContext int) uintptr {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return public.PointerPtr("SunnyNet no exist")
}
return public.PointerPtr(w.InstallCert())
}
// SunnyNetSetCallback 是否中间件回调地址 httpCallback =HTTP、Websocket 回调地址 tcpCallback=TCP回调地址
func SunnyNetSetCallback(SunnyContext, httpCallback, tcpCallback, wsCallback, udpCallback int) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.SetCallback(httpCallback, tcpCallback, wsCallback, udpCallback)
return true
}
// SunnyNetVerifyUser 开启或关闭身份验证模式
func SunnyNetVerifyUser(SunnyContext int, open bool) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.Socket5VerifyUser(open)
return true
}
// SunnyNetSocket5AddUser 添加 S5代理需要验证的用户名
func SunnyNetSocket5AddUser(SunnyContext int, User, Pass string) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.Socket5AddUser(User, Pass)
return true
}
// SunnyNetSocket5DelUser 删除 S5需要验证的用户名
func SunnyNetSocket5DelUser(SunnyContext int, User string) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.Socket5DelUser(User)
return true
}
// SunnyNetGetSocket5User 开启身份验证模式后 获取授权的S5账号,注意UDP请求无法获取到授权的s5账号
func SunnyNetGetSocket5User(Theology int) uintptr {
return public.PointerPtr(SunnyNet.GetSocket5User(Theology))
}
// SunnyNetError 获取中间件启动时的错误信息
func SunnyNetError(SunnyContext int) uintptr {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return public.NULLPtr
}
if w.Error == nil {
return public.NULLPtr
}
return public.PointerPtr(w.Error.Error())
}
// SunnyNetMustTcp 设置中间件是否开启强制走TCP
func SunnyNetMustTcp(SunnyContext int, open bool) {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return
}
w.MustTcp(open)
}
// CompileProxyRegexp 创建上游代理使用规则
func CompileProxyRegexp(SunnyContext int, Regexp string) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
return w.CompileProxyRegexp(Regexp) == nil
}
// SetOutRouterIP 设置数据出口IP 请传入网卡对应的IP地址,用于指定网卡,例如 192.168.31.11(全局)
func SetOutRouterIP(SunnyContext int, ip string) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
return w.SetOutRouterIP(ip)
}
// RequestSetOutRouterIP 设置数据出口IP 请传入网卡对应的IP地址,用于指定网卡,例如 192.168.31.11TCP/HTTP请求共用这个函数
func RequestSetOutRouterIP(MessageId int, ip string) bool {
k, ok := SunnyNet.GetSceneProxyRequest(MessageId)
if ok == false {
return false
}
if k == nil {
return false
}
k.Lock.Lock()
defer k.Lock.Unlock()
return k.SetOutRouterIP(ip)
}
// SetMustTcpRegexp 设置强制走TCP规则,如果 打开了全部强制走TCP状态,本功能则无效
func SetMustTcpRegexp(SunnyContext int, Regexp string, RulesAllow bool) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
return w.SetMustTcpRegexp(Regexp, RulesAllow) == nil
}
// SetGlobalProxy 设置全局上游代理 仅支持Socket5和http 例如 socket5://admin:123456@127.0.0.1:8888 或 http://admin:123456@127.0.0.1:8888
func SetGlobalProxy(SunnyContext int, ProxyAddress string, outTime int) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w != nil {
return w.SetGlobalProxy(ProxyAddress, outTime)
}
return false
}
// ExportCert 导出已设置的证书
func ExportCert(SunnyContext int) uintptr {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w != nil {
return public.PointerPtr(w.ExportCert())
}
return 0
}
// SetIeProxy 设置IE代理
func SetIeProxy(SunnyContext int) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
return w.SetIEProxy()
}
// CancelIEProxy 取消设置的IE代理
func CancelIEProxy(SunnyContext int) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
return w.CancelIEProxy()
}
// OpenDrive 开始进程代理/打开驱动 只允许一个 SunnyNet 使用 [会自动安装所需驱动文件]
// DevMode 0=Proxifier,1=NFAPI 2=Tun
func OpenDrive(SunnyContext int, DevMode int) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w != nil {
return w.OpenDrive(DevMode)
}
return false
}
// UnDrive 卸载驱动仅Windows 有效【需要管理权限】执行成功后会立即重启系统,若函数执行后没有重启系统表示没有管理员权限
func UnDrive(SunnyContext int) {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w != nil {
w.UnDrive()
}
return
}
// ProcessALLName 设置是否全部进程通过
func ProcessALLName(SunnyContext int, open, StopNetwork bool) {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w != nil {
w.ProcessALLName(open, StopNetwork)
}
}
// ProcessDelName 进程代理 删除进程名
func ProcessDelName(SunnyContext int, s string) {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w != nil {
w.ProcessDelName(s)
}
}
// ProcessAddName 进程代理 添加进程名
func ProcessAddName(SunnyContext int, s string) {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w != nil {
w.ProcessAddName(s)
}
}
// ProcessDelPid 进程代理 删除PID
func ProcessDelPid(SunnyContext, pid int) {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w != nil {
w.ProcessDelPid(pid)
}
}
// ProcessAddPid 进程代理 添加PID
func ProcessAddPid(SunnyContext, pid int) {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w != nil {
w.ProcessAddPid(pid)
}
}
// ProcessCancelAll 进程代理 取消全部已设置的进程名
func ProcessCancelAll(SunnyContext int) {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w != nil {
w.ProcessCancelAll()
}
}
// SetScriptCode 加载用户的脚本代码
func SetScriptCode(SunnyContext int, code string) string {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w != nil {
return w.SetScriptCode(code)
}
return "SunnyContext Error"
}
// SetScriptCall 设置脚本代码的回调函数
func SetScriptCall(SunnyContext int, log, save uintptr) {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w != nil {
l := func(Context int, info ...any) {
Call.Call(int(log), Context, fmt.Sprintf("%v", info))
}
s := func(Context int, code []byte) {
Call.Call(int(save), Context, code, int32(len(code)))
}
w.SetScriptCall(l, s)
}
}
// SetScriptPage 设置脚本编辑器页面 需不少于8个字符
func SetScriptPage(SunnyContext int, Page string) uintptr {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return 0
}
return public.PointerPtr(w.SetScriptPage(Page))
}
// DisableTCP 禁用TCP 仅对当前SunnyContext有效
func DisableTCP(SunnyContext int, Disable bool) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.DisableTCP(Disable)
return true
}
// DisableUDP 禁用TCP 仅对当前SunnyContext有效
func DisableUDP(SunnyContext int, Disable bool) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.DisableUDP(Disable)
return true
}
// SetRandomTLS 是否使用随机TLS指纹 仅对当前SunnyContext有效
func SetRandomTLS(SunnyContext int, open bool) bool {
SunnyNet.SunnyStorageLock.Lock()
w := SunnyNet.SunnyStorage[SunnyContext]
SunnyNet.SunnyStorageLock.Unlock()
if w == nil {
return false
}
w.SetRandomTLS(open)
return true
}