Skip to content

Commit 99841bd

Browse files
authored
Merge pull request #24 from xiaomakuaiz/fix-sample-count
Fix sample count
2 parents 174a6e0 + dde33c9 commit 99841bd

File tree

9 files changed

+172
-90
lines changed

9 files changed

+172
-90
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
name: release blazehttp docker image
2+
3+
permissions:
4+
contents: write
5+
6+
on:
7+
push:
8+
tags:
9+
- 'v*'
10+
11+
env:
12+
DOCKERHUB_REPO: chaitin/blazehttp
13+
14+
jobs:
15+
docker:
16+
runs-on: ubuntu-latest
17+
steps:
18+
-
19+
name: Checkout
20+
uses: actions/checkout@v4
21+
with:
22+
fetch-depth: 0
23+
-
24+
name: Set up QEMU
25+
uses: docker/setup-qemu-action@v3
26+
-
27+
name: Set up Docker Buildx
28+
uses: docker/setup-buildx-action@v3
29+
-
30+
name: Login to Docker Hub
31+
uses: docker/login-action@v3
32+
with:
33+
username: ${{ secrets.DOCKERHUB_USERNAME }}
34+
password: ${{ secrets.DOCKERHUB_TOKEN }}
35+
-
36+
name: Generate App Version
37+
run: echo APP_VERSION=`git describe --tags --always` >> $GITHUB_ENV
38+
-
39+
name: Build and push
40+
uses: docker/build-push-action@v5
41+
with:
42+
platforms: linux/amd64,linux/arm64
43+
push: true
44+
build-args: |
45+
APP_VERSION=${{ env.APP_VERSION }}
46+
tags: |
47+
${{ env.DOCKERHUB_REPO }}:latest
48+
${{ env.DOCKERHUB_REPO }}:${{ env.APP_VERSION }}
49+

.github/workflows/release-gui-macos.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: release blasehttp macos gui
1+
name: release blazehttp macos gui
22

33
permissions:
44
contents: write

.github/workflows/release-gui-windows.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: release blasehttp windows gui
1+
name: release blazehttp windows gui
22

33
permissions:
44
contents: write

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: release blasehttp cli
1+
name: release blazehttp cli
22

33
permissions:
44
contents: write

Dockerfile

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
FROM --platform=$BUILDPLATFORM golang:1.22 as builder
2+
3+
WORKDIR /src
4+
ENV CGO_ENABLED=0
5+
6+
COPY go.* .
7+
8+
ARG TARGETOS TARGETARCH
9+
10+
RUN --mount=type=bind,target=. \
11+
GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /build/blazehttp cmd/blazehttp/main.go
12+
13+
14+
FROM --platform=$BUILDPLATFORM alpine:latest as binary
15+
16+
RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
17+
&& echo "Asia/Shanghai" > /etc/timezone \
18+
&& apk del tzdata
19+
20+
WORKDIR /app
21+
22+
COPY --from=builder /build/blazehttp /app/blazehttp
23+
24+
CMD [ "/app/blazehttp" ]

README.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,22 @@ Connection: close
6464

6565
## 安装使用
6666

67+
**Docker 容器运行**
68+
69+
```bash
70+
# 下载镜像
71+
docker pull chaitin/blazehttp:latest
72+
# 开始测试 http://127.0.0.1:9444 是 WAF 的地址 (根据实际情况修改)
73+
docker run --rm --net=host chaitin/blazehttp:latest /app/blazehttp -t <http://127.0.0.1:9444>
74+
```
75+
6776
GitHub CI 预编译的产物已上传 Release,可以[直接下载](https://github.com/chaitin/blazehttp/releases)最新的版本使用。
6877

69-
**命令行**
78+
**命令行运行**
7079

7180
![blazehttp_cmd](https://github.com/chaitin/blazehttp/assets/30664688/7be052e9-2dfb-4f96-a6f2-eb2a0251910e)
7281

73-
**GUI** (MacOS & Windows)
82+
**GUI 运行** (MacOS & Windows)
7483

7584
> 如果 MacOS 双击打开报错**不受信任**或者**移到垃圾箱**,执行下面命令后再启动即可:
7685
> ``` bash

README_EN.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,15 @@ Connection: close
6464

6565
## Installation and Usage
6666

67+
** Docker Container**
68+
69+
```bash
70+
# pull latest image from DockerHub
71+
docker pull chaitin/blazehttp:latest
72+
# run test
73+
docker run --rm --net=host chaitin/blazehttp:latest /app/blazehttp -t <URL>
74+
```
75+
6776
Precompiled artifacts from GitHub CI have been uploaded to Releases for direct downloads of the latest version [here](https://github.com/chaitin/blazehttp/releases).
6877

6978
**Command Line**

gui/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,10 @@ func main() {
158158
m := lo.CountValuesBy(rawTestCaseData, func(item []string) string {
159159
if item[1] == "正常" {
160160
return "正常"
161-
} else {
161+
} else if item[1] == "恶意" {
162162
return "恶意"
163163
}
164+
return "unknown"
164165
})
165166

166167
_ = r.Total.Set(fmt.Sprintf("总样本: %d", len(allTestData)))

worker/worker.go

Lines changed: 74 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -181,106 +181,96 @@ func (w *Worker) Run() {
181181

182182
func (w *Worker) runWorker() {
183183
for job := range w.jobs {
184-
select {
185-
case <-w.ctx.Done():
186-
return
187-
default:
188-
func() {
189-
defer func() {
190-
w.jobResult <- job
191-
}()
192-
filePath := job.FilePath
193-
req := new(blazehttp.Request)
194-
if w.useEmbedFS {
195-
if err := req.ReadFileFromFS(testcases.EmbedTestCasesFS, filePath); err != nil {
196-
job.Result.Err = fmt.Sprintf("read request file: %s from embed fs error: %s\n", filePath, err)
197-
return
198-
}
199-
} else {
200-
if err := req.ReadFile(filePath); err != nil {
201-
job.Result.Err = fmt.Sprintf("read request file: %s error: %s\n", filePath, err)
202-
return
203-
}
184+
func() {
185+
defer func() {
186+
w.jobResult <- job
187+
}()
188+
filePath := job.FilePath
189+
req := new(blazehttp.Request)
190+
if w.useEmbedFS {
191+
if err := req.ReadFileFromFS(testcases.EmbedTestCasesFS, filePath); err != nil {
192+
job.Result.Err = fmt.Sprintf("read request file: %s from embed fs error: %s\n", filePath, err)
193+
return
204194
}
205-
206-
if w.reqHost != "" {
207-
req.SetHost(w.reqHost)
208-
} else {
209-
req.SetHost(w.addr)
195+
} else {
196+
if err := req.ReadFile(filePath); err != nil {
197+
job.Result.Err = fmt.Sprintf("read request file: %s error: %s\n", filePath, err)
198+
return
210199
}
200+
}
211201

212-
if w.reqPerSession {
213-
// one http request one connection
214-
req.SetHeader("Connection", "close")
215-
}
202+
if w.reqHost != "" {
203+
req.SetHost(w.reqHost)
204+
} else {
205+
req.SetHost(w.addr)
206+
}
216207

217-
req.CalculateContentLength()
208+
if w.reqPerSession {
209+
// one http request one connection
210+
req.SetHeader("Connection", "close")
211+
}
218212

219-
start := time.Now()
220-
conn := blazehttp.Connect(w.addr, w.isHttps, w.timeout)
221-
if conn == nil {
222-
job.Result.Err = fmt.Sprintf("connect to %s failed!\n", w.addr)
223-
return
224-
}
225-
nWrite, err := req.WriteTo(*conn)
226-
if err != nil {
227-
job.Result.Err = fmt.Sprintf("send request poc: %s length: %d error: %s", filePath, nWrite, err)
228-
return
229-
}
213+
req.CalculateContentLength()
230214

231-
rsp := new(blazehttp.Response)
232-
if err = rsp.ReadConn(*conn); err != nil {
233-
job.Result.Err = fmt.Sprintf("read poc file: %s response, error: %s", filePath, err)
234-
return
235-
}
236-
elap := time.Since(start).Nanoseconds()
237-
(*conn).Close()
238-
job.Result.Success = true
239-
if strings.HasSuffix(job.FilePath, "white") {
240-
job.Result.IsWhite = true // white case
241-
}
215+
start := time.Now()
216+
conn := blazehttp.Connect(w.addr, w.isHttps, w.timeout)
217+
if conn == nil {
218+
job.Result.Err = fmt.Sprintf("connect to %s failed!\n", w.addr)
219+
return
220+
}
221+
nWrite, err := req.WriteTo(*conn)
222+
if err != nil {
223+
job.Result.Err = fmt.Sprintf("send request poc: %s length: %d error: %s", filePath, nWrite, err)
224+
return
225+
}
242226

243-
code := rsp.GetStatusCode()
244-
job.Result.StatusCode = code
245-
if code != w.blockStatusCode {
246-
job.Result.IsPass = true
247-
}
248-
job.Result.TimeCost = elap
249-
}()
250-
}
227+
rsp := new(blazehttp.Response)
228+
if err = rsp.ReadConn(*conn); err != nil {
229+
job.Result.Err = fmt.Sprintf("read poc file: %s response, error: %s", filePath, err)
230+
return
231+
}
232+
elap := time.Since(start).Nanoseconds()
233+
(*conn).Close()
234+
job.Result.Success = true
235+
if strings.HasSuffix(job.FilePath, "white") {
236+
job.Result.IsWhite = true // white case
237+
}
238+
239+
code := rsp.GetStatusCode()
240+
job.Result.StatusCode = code
241+
if code != w.blockStatusCode {
242+
job.Result.IsPass = true
243+
}
244+
job.Result.TimeCost = elap
245+
}()
251246
}
252247
}
253248

254249
func (w *Worker) processJobResult() {
255250
for job := range w.jobResult {
256-
select {
257-
case <-w.ctx.Done():
258-
return
259-
default:
260-
if job.Result.Success {
261-
w.result.Success++
262-
w.result.SuccessTimeCost += job.Result.TimeCost
263-
if job.Result.IsWhite {
264-
if job.Result.IsPass {
265-
w.result.TN++
266-
} else {
267-
w.result.FP++
268-
}
251+
if job.Result.Success {
252+
w.result.Success++
253+
w.result.SuccessTimeCost += job.Result.TimeCost
254+
if job.Result.IsWhite {
255+
if job.Result.IsPass {
256+
w.result.TN++
269257
} else {
270-
if job.Result.IsPass {
271-
w.result.FN++
272-
} else {
273-
w.result.TP++
274-
}
258+
w.result.FP++
275259
}
276260
} else {
277-
w.result.Error++
278-
}
279-
if w.resultCh != nil {
280-
r := *w.result
281-
r.Job = job
282-
w.resultCh <- &r
261+
if job.Result.IsPass {
262+
w.result.FN++
263+
} else {
264+
w.result.TP++
265+
}
283266
}
267+
} else {
268+
w.result.Error++
269+
}
270+
if w.resultCh != nil {
271+
r := *w.result
272+
r.Job = job
273+
w.resultCh <- &r
284274
}
285275
}
286276
}

0 commit comments

Comments
 (0)