# gohttp

## 目标

实现一个类似nginx功能的http服务器
## 功能

- 支持静态文件
- Proxy
- 支持rewrite 
- 支持TLS
- 支持端口复用
- 支持健康检查

## 配置
```json
{
   "logging" :{
        "appenders": {
            "out" :{
                "type": "file",
                "options":{
                    "file": "gohttpd.log"
                }
            }
        },
        "categories": {
            "default": {
                "appenders": [ "out" ],
                "level": "debug"
            }
        }
    },
    "admin" : {
        "name": "admin",
        "port" : 8088,
        "username": "admin",
        "password": "admin",
        "directives":[
            "Set-Header Access-Control-Allow-Origin *"
        ],
        "paths": [
            {
                "path": "/",
                "root": "./adminui",
                "default": "index.html"
            }
        ]
    },
    "servers":[{
        "port" : 8080,
        "name":"test",
        "paths":[
            {
                "path": "/",
                "root": "/home/kingecg/code/gohttp/public/",
                "default": "index.html"
            },
            {
                "path": "/ws",
                "upstreams":["http://localhost:3000"],
                "directives":[
                    "HostSchemas $target",
                    "HeaderOrigin",
                    "Path /ws /",
                    "RemoveCookie token"
                ]
            }
        ]
    }] 
}
```
- logging 日志配置
- admin 管理后台配置
- servers 服务器配置

日志采用自己实现的类log4j库，目前只支持console 和file两种appeder

servers 配置

- port 端口
- name 服务器名称
- paths 路径配置
- certfile 证书文件
- keyfile 证书密钥文件
- directives 指令 针对response的指令，目前只实现了set-header


paths 配置

- path 路径
- root 根目录
- default 默认文件
- upstreams 代理地址
- directives  这里指令针对的是代理请求，有以下几种：
    - HostSchemas [$target] 代理地址
    - HeaderOrigin 代理请求时，添加Origin头
    - Path [/ws] [/] 代理请求时，重写URL路径，用第二个参数替换url中的第一个部分
    - RemoveCookie [token] 代理请求时，删除cookie中的某些字段

### 健康检查配置（新）

健康检查功能允许系统定期检查上游服务器的健康状态，并在请求时自动跳过不健康的服务器。

#### 配置选项

- `health_check` - 在server配置中的健康检查参数
  - `interval` - 检查间隔时间（如"10s"）
  - `timeout` - 单次检查超时时间（如"5s"）
  - `retries` - 健康检查失败重试次数

#### 示例配置

```json
{
    "servers":[{
        "port" : 8080,
        "name":"test",
        "health_check": {
            "interval": "10s",  // 每10秒检查一次
            "timeout": "5s",   // 每次检查5秒超时
            "retries": 3         // 失败3次才认为是不健康
        },
        "paths":[{
            "path": "/",
            "root": "/home/kingecg/code/gohttp/public/",
            "default": "index.html"
        },{
            "path": "/ws",
            "upstreams":["http://localhost:3000"],
            "directives":[
                "HostSchemas $target",
                "HeaderOrigin",
                "Path /ws /",
                "RemoveCookie token"
            ]
        }]
    }]
}
```

#### 特性

- 自动检测上游服务器的健康状态
- 请求失败时自动重试其他可用服务器
- 定期后台检查服务器状态
- 详细的日志记录便于监控和调试

### 指令系统

指令系统采用了nginx的指令系统，指令的格式为：

```
指令名 参数1 参数2 ... 参数n
```
指令系统用来对特定的request/response进行处理。目前只支持：

- 返回的response中设置header
- 反向代理时，修改发送到上游服务器的请求

## Packages

### Server

RestMux 提供
- Restful API注册功能的 ServerMux
- Route
- Url路径参数解析(形如:/user/:id)
- 中间件
- server管理

### model
提供模型定义

### admin
管理后台api

### handler

目录 handler

提供文件和代理两种handler
其中proxy handler 提供简单的负载均衡和会话粘滞功能

## 构建

```bash
make clean && make build
```
在target目录下生成可执行文件

## 运行

```bash
./gohttpd
```
