Skip to content

Commit acca3de

Browse files
committed
feat: a little refactor about ip revise logic
1 parent 5ccfc73 commit acca3de

File tree

2 files changed

+28
-34
lines changed

2 files changed

+28
-34
lines changed

cmd/server.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,17 @@ goc server --port=localhost:8080
4242
if err != nil {
4343
log.Fatalf("New file based server failed, err: %v", err)
4444
}
45-
server.IPRevise = iprevise
45+
server.IPRevise = IPRevise
4646
server.Run(port)
4747
},
4848
}
4949

5050
var port, localPersistence string
51-
var iprevise bool
51+
var IPRevise bool
5252

5353
func init() {
5454
serverCmd.Flags().StringVarP(&port, "port", "", ":7777", "listen port to start a coverage host center")
5555
serverCmd.Flags().StringVarP(&localPersistence, "local-persistence", "", "_svrs_address.txt", "the file to save services address information")
56-
serverCmd.Flags().BoolVarP(&iprevise, "ip_revise", "", true, "setting the network type(default:regist server use proxy or under nat、same network ect,direct:use register request parm)")
56+
serverCmd.Flags().BoolVarP(&IPRevise, "ip_revise", "", true, "whether to do ip revise during registering. Recommend to set this as false if under NAT or Proxy environment")
5757
rootCmd.AddCommand(serverCmd)
5858
}

pkg/cover/server.go

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ func (s *server) Route(w io.Writer) *gin.Engine {
102102
type ServiceUnderTest struct {
103103
Name string `form:"name" json:"name" binding:"required"`
104104
Address string `form:"address" json:"address" binding:"required"`
105-
IPRevise string `form:"iprevise" json:"-"`
105+
IPRevise string `form:"ip_revise" json:"-"` // whether to do ip revise during registering
106106
}
107107

108108
// ProfileParam is param of profile API
@@ -126,13 +126,7 @@ func (s *server) registerService(c *gin.Context) {
126126
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
127127
return
128128
}
129-
if service.IPRevise == "" {
130-
service.IPRevise = strconv.FormatBool(s.IPRevise)
131-
}
132-
isrevise, err := strconv.ParseBool(service.IPRevise)
133-
if err != nil {
134-
isrevise = s.IPRevise
135-
}
129+
136130
u, err := url.Parse(service.Address)
137131
if err != nil {
138132
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
@@ -141,44 +135,44 @@ func (s *server) registerService(c *gin.Context) {
141135
if u.Scheme != "https" && u.Scheme != "http" {
142136
c.JSON(http.StatusBadRequest, gin.H{"error": "unsupport schema"})
143137
return
144-
} else if u.Path != "" {
145-
c.JSON(http.StatusBadRequest, gin.H{"error": "uri path must empty"})
138+
}
139+
if u.Host == "" {
140+
c.JSON(http.StatusBadRequest, gin.H{"error": "empty host"})
146141
return
147142
}
148-
if !isrevise {
149-
if u.Host == "" {
150-
c.JSON(http.StatusBadRequest, gin.H{"error": "address is empty"})
151-
return
152-
}
153-
if u.Hostname() == "" {
154-
c.JSON(http.StatusBadRequest, gin.H{"error": "empty host name"})
155-
return
156-
}
157-
} else {
158-
host := u.Hostname()
159-
port := u.Port()
160-
if host == "" {
161-
host = c.ClientIP()
162-
}
163-
if port == "" {
164-
port = "80"
165-
}
166-
u.Host = fmt.Sprintf("%s:%s", host, port)
167-
host, port, err := net.SplitHostPort(u.Host)
143+
host, port, err := net.SplitHostPort(u.Host)
144+
if err != nil {
145+
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
146+
return
147+
}
148+
149+
var doIPRevise bool
150+
// Prefer user's decision first.
151+
if service.IPRevise != "" {
152+
doIPRevise, err = strconv.ParseBool(service.IPRevise)
168153
if err != nil {
169154
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
170155
return
171156
}
157+
} else {
158+
doIPRevise = s.IPRevise
159+
}
172160

161+
if doIPRevise {
173162
realIP := c.ClientIP()
174163
// only for IPV4
175164
// refer: https://github.com/qiniu/goc/issues/177
176165
if net.ParseIP(realIP).To4() != nil && host != realIP {
177166
log.Printf("the registered host %s of service %s is different with the real one %s, here we choose the real one", service.Name, host, realIP)
178-
service.Address = fmt.Sprintf("%s://%s:%s", u.Scheme, realIP, port)
167+
host = realIP
179168
}
180169
}
181170

171+
service.Address = fmt.Sprintf("%s://%s", u.Scheme, host)
172+
if port != "" {
173+
service.Address = fmt.Sprintf("%s:%s", service.Address, port)
174+
}
175+
182176
address := s.Store.Get(service.Name)
183177
if !contains(address, service.Address) {
184178
if err := s.Store.Add(service); err != nil && err != ErrServiceAlreadyRegistered {

0 commit comments

Comments
 (0)