forgerpl / geoproxy

Geolocation-enabled HTTP reverse proxy written in Rust

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

GeoProxy

What is it?

This is a simple reverse http proxy written in Rust. It uses simplistic geo indexing to select appropriate backend on the basis of provided Geolocation header. The proxy aims to be as transparent as possible, leaving request/response mostly untouched.

Quickstart

First, build the proxy:

docker build -t geoproxy .

Then edit provided config.json file, adding polygons/backends mappings as desired.

Next, run on your host network (assuming, that you also have statsd running on 127.0.0.1:8125/UDP):

docker run -d \
    --name geoproxy \
    --net host \
    -v $PWD/config.json:/config.json \
    geoproxy --statsd 127.0.0.1:8125 --config /config.json

Geolocation

Routing with the header

  • the format of the header is Geolocation: [x, y]
  • if the header is not provided, or there's no polygon under provided point the default backend is used.
  • in case some polygons overlap, the backend used will be selected arbitrarily
$> curl -i -H "Geolocation: [2.0, 3.0]" http://localhost:8000/

HTTP/1.1 200 OK
x-backend: 1
content-length: 2
date: Wed, 19 Jun 2019 18:04:50 GMT

OK

Statsd support

Statsd support is disabled by default, pass -s host:port via the command line to enable.

Configuration file format

{
  "backends": [
    {
      "areas": [
        {
          "exterior": [
            {
              "x": 0,
              "y": 0
            },
            {
              "x": 0,
              "y": 5
            },
            {
              "x": 5,
              "y": 5
            },
            {
              "x": 5,
              "y": 0
            }
          ],
          "interiors": []
        },
        {
          "exterior": [
            {
              "x": 20,
              "y": 0
            },
            {
              "x": 20,
              "y": 5
            },
            {
              "x": 25,
              "y": 5
            },
            {
              "x": 25,
              "y": 0
            }
          ],
          "interiors": []
        }
      ],
      "backend": {
        "base_url": "http://backend1"
      }
    },
    {
      "areas": [
        {
          "exterior": [
            {
              "x": 0,
              "y": 0
            },
            {
              "x": 0,
              "y": -5
            },
            {
              "x": -5,
              "y": -5
            },
            {
              "x": -5,
              "y": 0
            }
          ],
          "interiors": []
        },
        {
          "exterior": [
            {
              "x": -20,
              "y": 0
            },
            {
              "x": -20,
              "y": -5
            },
            {
              "x": -25,
              "y": -5
            },
            {
              "x": -25,
              "y": 0
            }
          ],
          "interiors": []
        }
      ],
      "backend": {
        "base_url": "http://backend2"
      }
    }
  ],
  "default_backend": {
    "base_url": "http://default_backend"
  }
}

About

Geolocation-enabled HTTP reverse proxy written in Rust

License:MIT License


Languages

Language:Rust 93.2%Language:Dockerfile 6.8%