config.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package geoip
  2. import (
  3. "github.com/mholt/caddy"
  4. maxminddb "github.com/oschwald/maxminddb-golang"
  5. )
  6. // Config specifies configuration parsed for Caddyfile
  7. type Config struct {
  8. DBHandler *maxminddb.Reader // Database's handler if it gets opened.
  9. // Yout can set returned header names in config
  10. // Country
  11. HeaderNameCountryCode string
  12. HeaderNameCountryIsEU string
  13. HeaderNameCountryName string
  14. // City
  15. HeaderNameCityName string
  16. // Location
  17. HeaderNameLocationLat string
  18. HeaderNameLocationLon string
  19. HeaderNameLocationTimeZone string
  20. }
  21. // NewConfig initialize new Config with default values
  22. func NewConfig() Config {
  23. c := Config{}
  24. c.HeaderNameCountryCode = "X-Geoip-Country-Code"
  25. c.HeaderNameCountryIsEU = "X-Geoip-Country-Eu"
  26. c.HeaderNameCountryName = "X-Geoip-Country-Name"
  27. c.HeaderNameCityName = "X-Geoip-City-Name"
  28. c.HeaderNameLocationLat = "X-Geoip-Location-Lat"
  29. c.HeaderNameLocationLon = "X-Geoip-Location-Lon"
  30. c.HeaderNameLocationTimeZone = "X-Geoip-Location-Tz"
  31. return c
  32. }
  33. func parseConfig(c *caddy.Controller) (Config, error) {
  34. var config = NewConfig()
  35. for c.Next() {
  36. for c.NextBlock() {
  37. value := c.Val()
  38. switch value {
  39. case "database":
  40. if !c.NextArg() {
  41. continue
  42. }
  43. // Check if a database has already been opened
  44. if config.DBHandler != nil {
  45. continue
  46. }
  47. database := c.Val()
  48. // Open the database.
  49. var err error
  50. config.DBHandler, err = maxminddb.Open(database)
  51. if err != nil {
  52. return config, c.Err("geoip: Can't open database: " + database)
  53. }
  54. case "set_header_country_code":
  55. if !c.NextArg() {
  56. continue
  57. }
  58. config.HeaderNameCountryCode = c.Val()
  59. case "set_header_country_name":
  60. if !c.NextArg() {
  61. continue
  62. }
  63. config.HeaderNameCountryName = c.Val()
  64. case "set_header_country_eu":
  65. if !c.NextArg() {
  66. continue
  67. }
  68. config.HeaderNameCountryIsEU = c.Val()
  69. case "set_header_city_name":
  70. if !c.NextArg() {
  71. continue
  72. }
  73. config.HeaderNameCityName = c.Val()
  74. case "set_header_location_lat":
  75. if !c.NextArg() {
  76. continue
  77. }
  78. config.HeaderNameLocationLat = c.Val()
  79. case "set_header_location_lon":
  80. if !c.NextArg() {
  81. continue
  82. }
  83. config.HeaderNameLocationLon = c.Val()
  84. case "set_header_location_tz":
  85. if !c.NextArg() {
  86. continue
  87. }
  88. config.HeaderNameLocationTimeZone = c.Val()
  89. }
  90. }
  91. }
  92. return config, nil
  93. }