mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-07-13 12:52:44 +08:00
71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
package rpc
|
||
|
||
import (
|
||
"context"
|
||
"log"
|
||
"net"
|
||
"net/http"
|
||
|
||
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
|
||
pb "github.com/shadow1ng/fscan/RPC/lib"
|
||
"github.com/shadow1ng/fscan/RPC/service"
|
||
"google.golang.org/grpc"
|
||
"google.golang.org/grpc/credentials/insecure"
|
||
)
|
||
|
||
// 暴露的启动函数(可供外部调用)
|
||
func StartHTTPServer() {
|
||
go runGRPCServer() // 启动 gRPC 服务
|
||
if err := runHTTPGateway(); err != nil {
|
||
log.Fatalf("HTTP 启动失败: %v", err)
|
||
}
|
||
}
|
||
|
||
// 启动 gRPC 服务
|
||
func runGRPCServer() {
|
||
lis, err := net.Listen("tcp", ":50051")
|
||
if err != nil {
|
||
log.Fatalf("监听失败: %v", err)
|
||
}
|
||
s := grpc.NewServer()
|
||
pb.RegisterFscanServiceServer(s, &service.FscanService{})
|
||
log.Println("✅ gRPC 服务已启动,端口 50051")
|
||
if err := s.Serve(lis); err != nil {
|
||
log.Fatalf("gRPC 启动失败: %v", err)
|
||
}
|
||
}
|
||
|
||
// 启动 HTTP Gateway 服务
|
||
func runHTTPGateway() error {
|
||
ctx := context.Background()
|
||
mux := runtime.NewServeMux()
|
||
opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
|
||
|
||
err := pb.RegisterFscanServiceHandlerFromEndpoint(ctx, mux, "localhost:50051", opts)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
// 包裹 mux,加上 CORS 支持
|
||
handler := allowCORS(mux)
|
||
|
||
log.Println("✅ HTTP Gateway 已启动,端口 8080")
|
||
return http.ListenAndServe(":8080", handler)
|
||
}
|
||
|
||
// 添加 CORS 支持
|
||
func allowCORS(h http.Handler) http.Handler {
|
||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
w.Header().Set("Access-Control-Allow-Origin", "*")
|
||
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
|
||
w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
|
||
|
||
if r.Method == "OPTIONS" {
|
||
w.WriteHeader(http.StatusOK)
|
||
return
|
||
}
|
||
|
||
h.ServeHTTP(w, r)
|
||
})
|
||
}
|