diff --git a/http/http.go b/http/http.go index 14d7d12..b57eb90 100644 --- a/http/http.go +++ b/http/http.go @@ -34,6 +34,8 @@ type Server struct { type Response struct { IP net.IP `json:"ip"` IPDecimal *big.Int `json:"ip_decimal"` + RegionName string `json:"region_name,omitempty"` + RegionCode string `json:"region_code,omitempty"` Country string `json:"country,omitempty"` CountryEU *bool `json:"country_eu,omitempty"` CountryISO string `json:"country_iso,omitempty"` @@ -44,6 +46,9 @@ type Response struct { ASN string `json:"asn,omitempty"` ASNOrg string `json:"asn_org,omitempty"` UserAgent *useragent.UserAgent `json:"user_agent,omitempty"` + PostalCode string `json:"zip_code,omitempty"` + Timezone string `json:"time_zone,omitempty"` + MetroCode uint `json:"metro_code,omitempty"` } type PortResponse struct { @@ -129,6 +134,11 @@ func (s *Server) newResponse(r *http.Request) (Response, error) { ASN: autonomousSystemNumber, ASNOrg: asn.AutonomousSystemOrganization, UserAgent: userAgent, + PostalCode: city.PostalCode, + Timezone: city.Timezone, + MetroCode: city.MetroCode, + RegionName: city.RegionName, + RegionCode: city.RegionCode, } s.cache.Set(ip, response) return *response, nil diff --git a/iputil/geo/geo.go b/iputil/geo/geo.go index 4543d3d..b187831 100644 --- a/iputil/geo/geo.go +++ b/iputil/geo/geo.go @@ -24,6 +24,11 @@ type City struct { Name string Latitude float64 Longitude float64 + PostalCode string + Timezone string + MetroCode uint + RegionName string + RegionCode string } type ASN struct { @@ -101,12 +106,27 @@ func (g *geoip) City(ip net.IP) (City, error) { if c, exists := record.City.Names["en"]; exists { city.Name = c } + if c, exists := record.Subdivisions[0].Names["en"]; exists { + city.RegionName = c + } + if record.Subdivisions[0].IsoCode != "" { + city.RegionCode = record.Subdivisions[0].IsoCode + } if !math.IsNaN(record.Location.Latitude) { city.Latitude = record.Location.Latitude } if !math.IsNaN(record.Location.Longitude) { city.Longitude = record.Location.Longitude } + if record.Location.TimeZone != "" { + city.Timezone = record.Location.TimeZone + } + if record.Location.MetroCode > 0 && record.Country.IsoCode == "US" { + city.MetroCode = record.Location.MetroCode + } + if record.Postal.Code != "" { + city.PostalCode = record.Postal.Code + } return city, nil }