Skip to content

Commit 618ff87

Browse files
authored
Service proxy (#148)
1 parent 4aa1cf8 commit 618ff87

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+804
-2286
lines changed

encoding/parse.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ func stripTags(body string) string {
3131
return re.ReplaceAllString(body, "")
3232
}
3333

34+
var regexSpaces = regexp.MustCompile(`[ ]+`)
35+
3436
// FindSaltpack finds saltpack message in a string starting with "BEGIN {BRAND }MESSAGE."
3537
// and ending with "END {BRAND }MESSAGE". {BRAND } is optional.
36-
// Characters not in the range a-zA-Z0-9 are ignored (expecting base62).
3738
// If isHTML is true, we html unescape the string first.
3839
func FindSaltpack(msg string, isHTML bool) (string, string) {
3940
if isHTML {
@@ -45,7 +46,7 @@ func FindSaltpack(msg string, isHTML bool) (string, string) {
4546

4647
brand, out := "", ""
4748
if len(s) >= 2 {
48-
brand = strings.TrimSpace(TrimSaltpack(s[1], true))
49+
brand = strings.TrimSpace(TrimSaltpack(s[1], []rune{' '}))
4950
}
5051
if len(s) >= 3 {
5152
out = s[2]
@@ -55,7 +56,9 @@ func FindSaltpack(msg string, isHTML bool) (string, string) {
5556
if isHTML {
5657
out = stripTags(out)
5758
}
58-
59-
out = TrimSaltpack(out, false)
59+
out = TrimSaltpack(out, []rune{' ', '\n', '.'})
60+
out = regexSpaces.ReplaceAllString(out, " ")
61+
out = strings.TrimSpace(out)
62+
out = strings.Trim(out, "\n")
6063
return out, brand
6164
}

encoding/parse_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func TestBreakString(t *testing.T) {
2929
}
3030

3131
func TestTrimSaltpack(t *testing.T) {
32-
msg := encoding.TrimSaltpack(">> abcdefghijklmnopqrstuvwxyz @@@ ABCXDEFGHIJKLMNOPQRSTUVWXYZ\n > 0123456789. ", false)
32+
msg := encoding.TrimSaltpack(">> abcdefghijklmnopqrstuvwxyz @@@ ABCXDEFGHIJKLMNOPQRSTUVWXYZ\n > 0123456789. ", nil)
3333
expected := "abcdefghijklmnopqrstuvwxyzABCXDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
3434
require.Equal(t, expected, msg)
3535
}
@@ -56,15 +56,15 @@ func TestFindSaltpack(t *testing.T) {
5656
xxnKzSyXt6ltPcX WkaseWW5coa1e5V XvEMPpyt5IQii1Q 5ox8p3recj6hVN.
5757
END MESSAGE.`
5858
out, brand := encoding.FindSaltpack(msg, false)
59-
require.Equal(t, "l0eEt9tsSRb8xzEXvvgqPrizO9VJe9AcsbRmIt5NoSP8AjLpClFdJJ1upFbIxxnKzSyXt6ltPcXWkaseWW5coa1e5VXvEMPpyt5IQii1Q5ox8p3recj6hVN", out)
59+
require.Equal(t, "l0eEt9tsSRb8xzE XvvgqPrizO9VJe9 AcsbRmIt5NoSP8A jLpClFdJJ1upFbI\nxxnKzSyXt6ltPcX WkaseWW5coa1e5V XvEMPpyt5IQii1Q 5ox8p3recj6hVN.", out)
6060
require.Equal(t, "", brand)
6161

6262
msg = `This is a saltpack encoded message... BEGIN EDX25519 KEY MESSAGE.
6363
l0eEt9tsSRb8xzE XvvgqPrizO9VJe9 AcsbRmIt5NoSP8A jLpClFdJJ1upFbI
6464
xxnKzSyXt6ltPcX WkaseWW5coa1e5V XvEMPpyt5IQii1Q 5ox8p3recj6hVN.
6565
END EDX25519 KEY MESSAGE. --`
6666
out, brand = encoding.FindSaltpack(msg, false)
67-
require.Equal(t, "l0eEt9tsSRb8xzEXvvgqPrizO9VJe9AcsbRmIt5NoSP8AjLpClFdJJ1upFbIxxnKzSyXt6ltPcXWkaseWW5coa1e5VXvEMPpyt5IQii1Q5ox8p3recj6hVN", out)
67+
require.Equal(t, "l0eEt9tsSRb8xzE XvvgqPrizO9VJe9 AcsbRmIt5NoSP8A jLpClFdJJ1upFbI\nxxnKzSyXt6ltPcX WkaseWW5coa1e5V XvEMPpyt5IQii1Q 5ox8p3recj6hVN.", out)
6868
require.Equal(t, "EDX25519 KEY", brand)
6969

7070
msg = `This is a saltpack encoded message... BEGIN EDX25519
@@ -74,14 +74,14 @@ func TestFindSaltpack(t *testing.T) {
7474
END EDX25519
7575
KEY MESSAGE. --`
7676
out, brand = encoding.FindSaltpack(msg, false)
77-
require.Equal(t, "l0eEt9tsSRb8xzEXvvgqPrizO9VJe9AcsbRmIt5NoSP8AjLpClFdJJ1upFbIxxnKzSyXt6ltPcXWkaseWW5coa1e5VXvEMPpyt5IQii1Q5ox8p3recj6hVN", out)
77+
require.Equal(t, "l0eEt9tsSRb8xzE XvvgqPrizO9VJe9 AcsbRmIt5NoSP8A jLpClFdJJ1upFbI\nxxnKzSyXt6ltPcX WkaseWW5coa1e5V XvEMPpyt5IQii1Q 5ox8p3recj6hVN.", out)
7878
require.Equal(t, "EDX25519 KEY", brand)
7979
}
8080

8181
func TestFindSaltpackInTwitter(t *testing.T) {
8282
data := testdata(t, "../testdata/twitter/1205589994380783616")
8383
s, brand := encoding.FindSaltpack(string(data), true)
84-
expected := `FD0Lv2C2AtvqD1XEwqDo1tOTkv8LKisQMlS6gluxz0npc1S2MuNVOfTph934h1xXQqj5EtueEBntfhbDceoOBETCKq6Xr2MZHgg4UNRDbZy2loGoGN3Mvxd4r7FIwpZOJPE1JEqD2gGjkgLByR9CFG2aCgRgZZwl5UAa46bmBzjE5yyl9oNKSO6lAVCOrl3JBganxnssAnkQt3vM3TdJOf`
84+
expected := `FD0Lv2C2AtvqD1X EwqDo1tOTkv8LKi sQMlS6gluxz0npc 1S2MuNVOfTph934 h1xXQqj5EtueEBn tfhbDceoOBETCKq 6Xr2MZHgg4UNRDb Zy2loGoGN3Mvxd4 r7FIwpZOJPE1JEq D2gGjkgLByR9CFG 2aCgRgZZwl5UAa4 6bmBzjE5yyl9oNK SO6lAVCOrl3JBga nxnssAnkQt3vM3T dJOf.`
8585
require.Equal(t, expected, s)
8686
require.Equal(t, "", brand)
8787
}

encoding/saltpack.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ import (
88
)
99

1010
// TrimSaltpack removes non base63 characters from a string.
11-
func TrimSaltpack(msg string, allowSpace bool) string {
11+
func TrimSaltpack(msg string, allow []rune) string {
1212
charsOnly := func(r rune) rune {
1313
// 0-9, A-Z, a-z
1414
if (r >= 0x30 && r <= 0x39) || (r >= 0x41 && r <= 0x5A) || (r >= 0x61 && r <= 0x7A) {
1515
return r
1616
}
17-
if allowSpace && r == ' ' {
18-
return r
17+
for _, a := range allow {
18+
if r == a {
19+
return r
20+
}
1921
}
2022
return -1
2123
}
@@ -33,6 +35,7 @@ func DecodeSaltpack(msg string, isHTML bool) ([]byte, string, error) {
3335
if s == "" {
3436
return nil, "", nil
3537
}
38+
s = TrimSaltpack(s, nil)
3639
b, err := Decode(s, Base62)
3740
if err != nil {
3841
return nil, "", errors.Wrapf(err, "failed to decode saltpack message")
@@ -47,7 +50,7 @@ func encodeSaltpack(b []byte) string {
4750
}
4851

4952
func decodeSaltpack(s string) ([]byte, error) {
50-
s = TrimSaltpack(s, false)
53+
s = TrimSaltpack(s, nil)
5154
return Decode(s, Base62)
5255
}
5356

http/alias.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,9 @@ package http
22

33
import "net/http"
44

5-
// Client alias
6-
type Client = http.Client
7-
85
// Transport alias
96
type Transport = http.Transport
107

11-
// Header alias
12-
type Header = http.Header
13-
148
// Request alias
159
type Request = http.Request
1610

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
// Package request provides clients for requesting data.
2-
package request
1+
// Package http provides a http client.
2+
package http
33

44
import (
5-
"bytes"
65
"context"
76
"fmt"
87
"io/ioutil"
@@ -29,7 +28,7 @@ func (e ErrHTTP) Error() string {
2928
return fmt.Sprintf("http error %d", e.StatusCode)
3029
}
3130

32-
func client() *http.Client {
31+
func httpClient() *http.Client {
3332
// TODO: Longer timeout?
3433
transport := &http.Transport{
3534
Dial: (&net.Dialer{
@@ -57,12 +56,8 @@ func client() *http.Client {
5756
return client
5857
}
5958

60-
func doRequest(client *http.Client, method string, urs string, headers []Header, body []byte, options ...func(*http.Request)) (http.Header, []byte, error) {
61-
logger.Debugf("Requesting %s %s", method, urs)
62-
req, err := http.NewRequest(method, urs, bytes.NewReader(body))
63-
if err != nil {
64-
return nil, nil, err
65-
}
59+
func doRequest(client *http.Client, req *Request, headers []Header, options ...func(*http.Request)) (http.Header, []byte, error) {
60+
logger.Debugf("Requesting %s %s", req.Method, req.URL)
6661

6762
req.Header.Set("User-Agent", "keys.pub")
6863
for _, header := range headers {
@@ -139,21 +134,21 @@ type Header struct {
139134
Value string
140135
}
141136

142-
// Requestor defines how to get bytes from a URL.
143-
type Requestor interface {
144-
RequestURLString(ctx context.Context, urs string, headers []Header) ([]byte, error)
137+
// Client defines how to request a resource.
138+
type Client interface {
139+
Request(ctx context.Context, req *Request, headers []Header) ([]byte, error)
145140
}
146141

147-
type requestor struct{}
142+
type client struct{}
148143

149-
// NewHTTPRequestor creates a Requestor for HTTP URLs.
150-
func NewHTTPRequestor() Requestor {
151-
return requestor{}
144+
// NewClient creates a Requestor for HTTP URLs.
145+
func NewClient() Client {
146+
return client{}
152147
}
153148

154-
// RequestURLString requests an URL string.
155-
func (r requestor) RequestURLString(ctx context.Context, urs string, headers []Header) ([]byte, error) {
156-
_, body, err := doRequest(client(), "GET", urs, headers, nil)
149+
// Request an URL.
150+
func (c client) Request(ctx context.Context, req *Request, headers []Header) ([]byte, error) {
151+
_, body, err := doRequest(httpClient(), req, headers)
157152
if err != nil {
158153
logger.Warningf("Failed request: %s", err)
159154
}
@@ -165,40 +160,41 @@ type mockResponse struct {
165160
err error
166161
}
167162

168-
var _ Requestor = &MockRequestor{}
163+
var _ Client = &Mock{}
169164

170-
// MockRequestor ...
171-
type MockRequestor struct {
165+
// Mock ...
166+
type Mock struct {
172167
resp map[string]*mockResponse
173168
}
174169

175-
// NewMockRequestor with mocked responses.
176-
func NewMockRequestor() *MockRequestor {
177-
return &MockRequestor{resp: map[string]*mockResponse{}}
170+
// NewMock with mocked responses.
171+
func NewMock() *Mock {
172+
return &Mock{resp: map[string]*mockResponse{}}
178173
}
179174

180175
// SetResponse ...
181-
func (r *MockRequestor) SetResponse(url string, b []byte) {
176+
func (r *Mock) SetResponse(url string, b []byte) {
182177
r.resp[url] = &mockResponse{data: b}
183178
}
184179

185180
// Response returns mocked response.
186-
func (r *MockRequestor) Response(url string) ([]byte, error) {
181+
func (r *Mock) Response(url string) ([]byte, error) {
182+
// TODO: Match on method without params, etc.
187183
resp, ok := r.resp[url]
188184
if !ok {
189-
return nil, errors.Errorf("no mock response for %s", url)
185+
panic(errors.Errorf("no mock response for %s", url))
190186
}
191187
logger.Debugf("Mock response %s, data=%d; err=%s", url, len(resp.data), resp.err)
192188
// logger.Debugf("Mock data: %s", string(resp.data))
193189
return resp.data, resp.err
194190
}
195191

196-
// SetError ...
197-
func (r *MockRequestor) SetError(url string, err error) {
192+
// SetError sets response error for ur
193+
func (r *Mock) SetError(url string, err error) {
198194
r.resp[url] = &mockResponse{err: err}
199195
}
200196

201-
// RequestURLString ...
202-
func (r *MockRequestor) RequestURLString(ctx context.Context, urs string, headers []Header) ([]byte, error) {
203-
return r.Response(urs)
197+
// Request mock response.
198+
func (r *Mock) Request(ctx context.Context, req *Request, headers []Header) ([]byte, error) {
199+
return r.Response(req.URL.String())
204200
}
Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
1-
package request_test
1+
package http_test
22

33
import (
44
"context"
55
"testing"
66

77
"github.com/keys-pub/keys/encoding"
8-
"github.com/keys-pub/keys/request"
8+
"github.com/keys-pub/keys/http"
99
"github.com/stretchr/testify/require"
1010
)
1111

12-
func TestGithub(t *testing.T) {
13-
req := request.NewHTTPRequestor()
12+
func TestGithubRequest(t *testing.T) {
13+
client := http.NewClient()
1414
urs := "https://gist.github.com/gabriel/ceea0f3b675bac03425472692273cf52"
15-
res, err := req.RequestURLString(context.TODO(), urs, nil)
15+
req, err := http.NewRequest("GET", urs, nil)
16+
require.NoError(t, err)
17+
res, err := client.Request(context.TODO(), req, nil)
1618
require.NoError(t, err)
1719

1820
out, brand := encoding.FindSaltpack(string(res), true)
21+
out = encoding.TrimSaltpack(out, nil)
1922
require.Equal(t, "kdZaJI1U5AS7G6iVoUxdP8OtPzEoM6pYhVl0YQZJnotVEwLg9BDb5SUO05pmabUSeCvBfdPoRpPJ8wrcF5PP3wTCKq6Xr2MZHgg6m2QalgJCD6vMqlBQfIg6QsfB27aP5DMuXlJAUVIAvMDHIoptmSriNMzfpwBjRShVLWH70a0GOEqD6L8bkC5EFOwCedvHFpcAQVqULHjcSpeCfZEIOaQ2IP", out)
2023
require.Equal(t, "", brand)
2124
}

request/log.go renamed to http/log.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package request
1+
package http
22

33
import (
44
"context"
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1-
package request_test
1+
package http_test
22

33
import (
44
"context"
55
"encoding/json"
66
"testing"
77

8-
"github.com/keys-pub/keys/request"
8+
"github.com/keys-pub/keys/http"
99
"github.com/stretchr/testify/require"
1010
)
1111

1212
func TestReddit(t *testing.T) {
13-
req := request.NewHTTPRequestor()
13+
client := http.NewClient()
1414
urs := "https://old.reddit.com/r/keyspubmsgs/comments/f8g9vd/gabrlh.json"
15-
res, err := req.RequestURLString(context.TODO(), urs, nil)
15+
req, err := http.NewRequest("GET", urs, nil)
16+
require.NoError(t, err)
17+
res, err := client.Request(context.TODO(), req, nil)
1618
require.NoError(t, err)
1719

1820
var red reddit

rand.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package keys
22

33
import (
44
"crypto/rand"
5+
"encoding/hex"
56
"math/big"
67
"os"
78
"path/filepath"
@@ -77,6 +78,11 @@ func RandUsername(length int) string {
7778
return string(r)
7879
}
7980

81+
// RandHex returns random hex.
82+
func RandHex(numBytes int) string {
83+
return hex.EncodeToString(RandBytes(numBytes))
84+
}
85+
8086
// RandTempPath returns a unique random file name in os.TempDir.
8187
// RandTempPath() => "/tmp/CTGMMOLLZCXMGP7VR4BHKAI7PE"
8288
func RandTempPath() string {

request/twitter_test.go

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)