Skip to content

Commit c98653c

Browse files
committed
add http signatures, gha tests
1 parent f2bc3e1 commit c98653c

21 files changed

Lines changed: 1199 additions & 25 deletions

File tree

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
name: Test Offchain
2+
on:
3+
push:
4+
branches:
5+
- "**"
6+
jobs:
7+
test:
8+
name: "Test offchain"
9+
runs-on: ubuntu-latest
10+
steps:
11+
- uses: actions/checkout@v4
12+
- uses: actions/setup-go@v5
13+
with:
14+
go-version: "1.24"
15+
- run: sudo apt-get install -y just
16+
- run: just lint test

Justfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,10 @@
22

33
install:
44
go install -v ./cmd/oc/...
5+
6+
test:
7+
go test -v ./...
8+
9+
lint:
10+
go fmt ./...
11+
go vet ./...

cmd/oc/main.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,23 @@ func NewRootCmd() *cobra.Command {
5454
if err != nil {
5555
return err
5656
}
57+
ctx := cmd.Context()
58+
5759
if exchange == "" {
58-
return fmt.Errorf("--exchange is required")
60+
if cmd.Name() == "start" || cmd.Name() == "config" {
61+
// okay
62+
} else {
63+
return fmt.Errorf("--exchange is required")
64+
}
65+
} else {
66+
exchangeConfig, ok := config.GetExchange(oc.ExchangeId(exchange))
67+
if !ok {
68+
return fmt.Errorf("exchange not found")
69+
}
70+
slog.Info("Using exchange", "exchange", exchange)
71+
ctx = context.WithValue(ctx, exchangeConfigKey, exchangeConfig)
5972
}
60-
exchangeConfig, ok := config.GetExchange(oc.ExchangeId(exchange))
61-
if !ok {
62-
return fmt.Errorf("exchange not found")
63-
}
64-
slog.Info("Using exchange", "exchange", exchange)
6573

66-
ctx := cmd.Context()
67-
ctx = context.WithValue(ctx, exchangeConfigKey, exchangeConfig)
6874
ctx = context.WithValue(ctx, configContextKey, config)
6975
cmd.SetContext(ctx)
7076

@@ -79,6 +85,7 @@ func NewRootCmd() *cobra.Command {
7985
cmd.AddCommand(NewGetDepositAddressCmd())
8086
cmd.AddCommand(NewListWithdrawalHistoryCmd())
8187
cmd.AddCommand(NewSecretCmd())
88+
cmd.AddCommand(NewStartCmd())
8289

8390
cmd.PersistentFlags().CountVarP(
8491
&verbose,

cmd/oc/start.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package main
2+
3+
import (
4+
"github.com/cordialsys/offchain/loader"
5+
"github.com/cordialsys/offchain/server"
6+
"github.com/spf13/cobra"
7+
)
8+
9+
func NewStartCmd() *cobra.Command {
10+
var listen string
11+
cmd := &cobra.Command{
12+
Use: "start",
13+
Short: "Serve the offchain server",
14+
RunE: func(cmd *cobra.Command, args []string) error {
15+
config := cmd.Context().Value(configContextKey).(*loader.Config)
16+
server := server.New(listen, config)
17+
return server.Start()
18+
},
19+
}
20+
21+
cmd.Flags().StringVarP(&listen, "listen", "l", ":8080", "address to listen on")
22+
23+
return cmd
24+
}

go.mod

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ require (
77
github.com/aws/aws-sdk-go-v2 v1.36.3
88
github.com/aws/aws-sdk-go-v2/config v1.29.9
99
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.35.2
10+
github.com/gofiber/fiber/v2 v2.52.6
1011
github.com/google/uuid v1.6.0
1112
github.com/hashicorp/vault/api v1.16.0
1213
github.com/ilyakaznacheev/cleanenv v1.5.0
@@ -24,6 +25,7 @@ require (
2425
cloud.google.com/go/compute/metadata v0.6.0 // indirect
2526
cloud.google.com/go/iam v1.3.1 // indirect
2627
github.com/BurntSushi/toml v1.2.1 // indirect
28+
github.com/andybalholm/brotli v1.1.1 // indirect
2729
github.com/aws/aws-sdk-go-v2/credentials v1.17.62 // indirect
2830
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect
2931
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect
@@ -55,23 +57,30 @@ require (
5557
github.com/hashicorp/hcl v1.0.0 // indirect
5658
github.com/inconshreveable/mousetrap v1.1.0 // indirect
5759
github.com/joho/godotenv v1.5.1 // indirect
60+
github.com/klauspost/compress v1.18.0 // indirect
61+
github.com/mattn/go-colorable v0.1.14 // indirect
62+
github.com/mattn/go-isatty v0.0.20 // indirect
63+
github.com/mattn/go-runewidth v0.0.16 // indirect
5864
github.com/mitchellh/go-homedir v1.1.0 // indirect
5965
github.com/mitchellh/mapstructure v1.5.0 // indirect
6066
github.com/pmezard/go-difflib v1.0.0 // indirect
67+
github.com/rivo/uniseg v0.4.7 // indirect
6168
github.com/ryanuber/go-glob v1.0.0 // indirect
6269
github.com/spf13/pflag v1.0.6 // indirect
70+
github.com/valyala/bytebufferpool v1.0.0 // indirect
71+
github.com/valyala/fasthttp v1.60.0 // indirect
6372
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
6473
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect
6574
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
6675
go.opentelemetry.io/otel v1.34.0 // indirect
6776
go.opentelemetry.io/otel/metric v1.34.0 // indirect
6877
go.opentelemetry.io/otel/trace v1.34.0 // indirect
69-
golang.org/x/crypto v0.35.0 // indirect
70-
golang.org/x/net v0.35.0 // indirect
78+
golang.org/x/crypto v0.36.0 // indirect
79+
golang.org/x/net v0.38.0 // indirect
7180
golang.org/x/oauth2 v0.27.0 // indirect
72-
golang.org/x/sync v0.11.0 // indirect
73-
golang.org/x/sys v0.30.0 // indirect
74-
golang.org/x/text v0.22.0 // indirect
81+
golang.org/x/sync v0.12.0 // indirect
82+
golang.org/x/sys v0.31.0 // indirect
83+
golang.org/x/text v0.23.0 // indirect
7584
golang.org/x/time v0.10.0 // indirect
7685
google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 // indirect
7786
google.golang.org/genproto/googleapis/api v0.0.0-20250207221924-e9438ea467c6 // indirect

go.sum

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ cloud.google.com/go/secretmanager v1.14.5 h1:W++V0EL9iL6T2+ec24Dm++bIti0tI6Gx6sC
1212
cloud.google.com/go/secretmanager v1.14.5/go.mod h1:GXznZF3qqPZDGZQqETZwZqHw4R6KCaYVvcGiRBA+aqY=
1313
github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
1414
github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
15+
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
16+
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
1517
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
1618
github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM=
1719
github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg=
@@ -62,6 +64,8 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
6264
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
6365
github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw=
6466
github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
67+
github.com/gofiber/fiber/v2 v2.52.6 h1:Rfp+ILPiYSvvVuIPvxrBns+HJp8qGLDnLJawAu27XVI=
68+
github.com/gofiber/fiber/v2 v2.52.6/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw=
6569
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
6670
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
6771
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
@@ -107,16 +111,20 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
107111
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
108112
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
109113
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
114+
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
115+
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
110116
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
111117
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
112118
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
113119
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
114120
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
115-
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
116-
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
121+
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
122+
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
117123
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
118124
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
119125
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
126+
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
127+
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
120128
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
121129
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
122130
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
@@ -127,6 +135,9 @@ github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR
127135
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
128136
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
129137
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
138+
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
139+
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
140+
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
130141
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
131142
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
132143
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -145,6 +156,12 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
145156
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
146157
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
147158
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
159+
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
160+
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
161+
github.com/valyala/fasthttp v1.60.0 h1:kBRYS0lOhVJ6V+bYN8PqAHELKHtXqwq9zNMLKx1MBsw=
162+
github.com/valyala/fasthttp v1.60.0/go.mod h1:iY4kDgV3Gc6EqhRZ8icqcmlG6bqhcDXfuHgTO4FXCvc=
163+
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
164+
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
148165
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
149166
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
150167
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
@@ -163,20 +180,21 @@ go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiy
163180
go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
164181
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
165182
go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
166-
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
167-
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
168-
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
169-
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
183+
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
184+
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
185+
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
186+
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
170187
golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
171188
golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
172-
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
173-
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
189+
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
190+
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
174191
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
175192
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
176-
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
177-
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
178-
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
179-
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
193+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
194+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
195+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
196+
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
197+
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
180198
golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
181199
golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
182200
google.golang.org/api v0.224.0 h1:Ir4UPtDsNiwIOHdExr3fAj4xZ42QjK7uQte3lORLJwU=

pkg/hex/hex.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package hex
2+
3+
import (
4+
"encoding/hex"
5+
"encoding/json"
6+
"strings"
7+
)
8+
9+
var EncodeToString = hex.EncodeToString
10+
var DecodeString = hex.DecodeString
11+
12+
type Hex []byte
13+
14+
func (h Hex) String() string {
15+
return hex.EncodeToString(h)
16+
}
17+
18+
func (h Hex) Bytes() []byte {
19+
return []byte(h)
20+
}
21+
22+
func (h Hex) MarshalJSON() ([]byte, error) {
23+
return json.Marshal(h.String())
24+
}
25+
26+
func (h *Hex) UnmarshalJSON(data []byte) error {
27+
var s string
28+
if err := json.Unmarshal(data, &s); err != nil {
29+
return err
30+
}
31+
bz, err := hex.DecodeString(strings.TrimPrefix(s, "0x"))
32+
if err != nil {
33+
return err
34+
}
35+
*h = bz
36+
return nil
37+
}

pkg/httpsignature/base.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package httpsignature
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
)
7+
8+
type SigBase struct {
9+
*SigParams
10+
Method string
11+
Path string
12+
Query string
13+
ContentDigest *ContentDigest
14+
}
15+
16+
func NewSigBase(params *SigParams, method string, path string, query string, body []byte) *SigBase {
17+
content := NewContentDigest(body)
18+
19+
return &SigBase{
20+
SigParams: params,
21+
Method: method,
22+
Path: path,
23+
Query: query,
24+
ContentDigest: content,
25+
}
26+
}
27+
28+
func SigbaseFrom(params *SigParams, method string, path string, query string, digestHeader *ContentDigest) *SigBase {
29+
return &SigBase{
30+
SigParams: params,
31+
Method: method,
32+
Path: path,
33+
Query: query,
34+
ContentDigest: digestHeader,
35+
}
36+
}
37+
38+
func (s *SigBase) Serialize() string {
39+
query := s.Query
40+
if !strings.HasPrefix(query, "?") {
41+
// should have leading ?
42+
query = "?" + query
43+
}
44+
path := s.Path
45+
if !strings.HasPrefix(path, "/") {
46+
// should have leading /
47+
path = "/" + path
48+
}
49+
// each line has '\n' newline
50+
template := fmt.Sprintf(`"@method": %s
51+
"@path": %s
52+
"@query": %s
53+
content-digest: sha-256=:%s:
54+
"@signature-params": %s
55+
`,
56+
s.Method,
57+
path,
58+
query,
59+
s.ContentDigest.Base64(),
60+
s.SigParams.Serialize(),
61+
)
62+
// fmt.Printf("%s\n", template)
63+
64+
return template
65+
}

0 commit comments

Comments
 (0)