package httpserver
import (
"context"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"github.com/dnsdao/dnsdao.resolver/Agent/dns"
"github.com/dnsdao/dnsdao.resolver/config"
"github.com/dnsdao/dnsdao.resolver/database/ldb"
"github.com/dnsdao/dnsdao.resolver/server/httpserver/api"
"github.com/ethereum/go-ethereum/crypto"
"log"
"net"
"net/http"
"regexp"
"strconv"
"strings"
"time"
)
const (
DnsName = "/dns/name"
DnsEthAddress = "/dns/ethaddr"
DnsIP4 = "/dns/ip4"
DnsBlockchainAddress = "/dns/blockchainaddr"
DnsCName = "/dns/cname"
DnsIP6 = "/dns/ip6"
DnsGetTotalBySubLen = "/dns/totalbysub"
DnsQuerySubDomainByPage = "/dns/querysub"
DnsGetTotalByPrice = "/dns/totalbyprice"
DnsAddress = "/dns/addr"
GetEarningsByAddress = "/dns/getincomebyaddr"
GetEarningsDetailsByAddress = "/dns/getincomedetails"
GetCashDetailsByAddress = "/dns/getcashbyaddr"
)
func Cors(f http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*") // 允许访问所有域,可以换成具体url,注意仅具体url才能带cookie信息
w.Header().Add("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token") //header的类型
w.Header().Add("Access-Control-Allow-Credentials", "true") //设置为true,允许ajax异步请求带cookie信息
w.Header().Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE") //允许请求方法
w.Header().Set("content-type", "application/json;charset=UTF-8") //返回数据格式是json
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusNoContent)
return
}
f(w, r)
}
}
type WebProxyServer struct {
listenAddr string
quit chan struct{}
server *http.Server
}
type route struct {
pattern *regexp.Regexp
handler http.Handler
}
type RegexpHander struct {
routes []*route
}
func (rh *RegexpHander) Handle(pattern string, handler http.Handler) {
rh.routes = append(rh.routes, &route{pattern: regexp.MustCompilePOSIX(pattern), handler: handler})
}
func (rh *RegexpHander) HandleFunc(pattern string, handleFunc func(http.ResponseWriter, *http.Request)) {
rh.routes = append(rh.routes, &route{pattern: regexp.MustCompilePOSIX(pattern), handler: http.HandlerFunc(handleFunc)})
}
func (rh *RegexpHander) ServeHTTP(w http.ResponseWriter, r *http.Request) {
for _, route := range rh.routes {
if route.pattern.MatchString(r.URL.Path) {
route.handler.ServeHTTP(w, r)
return
}
}
// no pattern matched; send 404 response
http.NotFound(w, r)
}
func NewWebServer(networkAddr string) *WebProxyServer {
ws := WebProxyServer{
listenAddr: networkAddr,
quit: make(chan struct{}, 8),
}
return ws.init()
}
func (ws *WebProxyServer) init() *WebProxyServer {
rh := &RegexpHander{
routes: make([]*route, 0),
}
wapi := api.NewApi()
rh.HandleFunc(DnsEthAddress, Cors(ws.ethAddrResolve))
rh.HandleFunc(DnsName, Cors(ws.dnsNameResolve))
//rh.HandleFunc("/tokenId", ws.DnsTokenId)
rh.HandleFunc(DnsIP4, Cors(ws.ipv4Resolve))
rh.HandleFunc(DnsBlockchainAddress, Cors(wapi.Blockchain))
rh.HandleFunc(DnsCName, Cors(wapi.CName))
rh.HandleFunc(DnsIP6, Cors(wapi.Ipv6))
rh.HandleFunc(DnsGetTotalBySubLen, Cors(wapi.GetTotalBySubLen))
rh.HandleFunc(DnsQuerySubDomainByPage, Cors(wapi.QuerySubDomainByPage))
rh.HandleFunc(GetEarningsByAddress, Cors(wapi.GetEarningsByAddress))
rh.HandleFunc(DnsAddress, Cors(wapi.AddrResolve))
rh.HandleFunc(GetEarningsDetailsByAddress, Cors(wapi.GetEarningsDetailsByAddress))
rh.HandleFunc(GetCashDetailsByAddress, Cors(wapi.GetCashDetailsByAddress))
server := &http.Server{
Handler: rh,
}
ws.server = server
return ws
}