mirror of
https://github.com/sot-tech/mochi.git
synced 2026-06-30 22:08:58 -07:00
Bring in more old behaviour, use types for peer_id and infohash
This commit is contained in:
committed by
Jimmy Zelinskie
parent
05b7b955a1
commit
75b4a20e56
@@ -11,10 +11,13 @@ import (
|
||||
)
|
||||
|
||||
type httpConfig struct {
|
||||
Addr string `yaml:"addr"`
|
||||
RequestTimeout time.Duration `yaml:"requestTimeout"`
|
||||
ReadTimeout time.Duration `yaml:"readTimeout"`
|
||||
WriteTimeout time.Duration `yaml:"writeTimeout"`
|
||||
Addr string `yaml:"addr"`
|
||||
RequestTimeout time.Duration `yaml:"requestTimeout"`
|
||||
ReadTimeout time.Duration `yaml:"readTimeout"`
|
||||
WriteTimeout time.Duration `yaml:"writeTimeout"`
|
||||
AllowIPSpoofing bool `yaml:"allowIPSpoofing"`
|
||||
DualStackedPeers bool `yaml:"dualStackedPeers"`
|
||||
RealIPHeader string `yaml:"realIPHeader"`
|
||||
}
|
||||
|
||||
func newHTTPConfig(srvcfg interface{}) (*httpConfig, error) {
|
||||
|
||||
+9
-117
@@ -14,7 +14,6 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/chihaya/chihaya"
|
||||
"github.com/chihaya/chihaya/pkg/event"
|
||||
)
|
||||
|
||||
// ErrKeyNotFound is returned when a provided key has no value associated with
|
||||
@@ -24,8 +23,8 @@ var ErrKeyNotFound = errors.New("query: value for the provided key does not exis
|
||||
// Query represents a parsed URL.Query.
|
||||
type Query struct {
|
||||
query string
|
||||
infohashes []string
|
||||
params map[string]string
|
||||
infoHashes []chihaya.InfoHash
|
||||
}
|
||||
|
||||
// New parses a raw URL query.
|
||||
@@ -33,14 +32,12 @@ func New(query string) (*Query, error) {
|
||||
var (
|
||||
keyStart, keyEnd int
|
||||
valStart, valEnd int
|
||||
firstInfohash string
|
||||
|
||||
onKey = true
|
||||
hasInfohash = false
|
||||
onKey = true
|
||||
|
||||
q = &Query{
|
||||
query: query,
|
||||
infohashes: nil,
|
||||
infoHashes: nil,
|
||||
params: make(map[string]string),
|
||||
}
|
||||
)
|
||||
@@ -73,19 +70,10 @@ func New(query string) (*Query, error) {
|
||||
}
|
||||
}
|
||||
|
||||
q.params[strings.ToLower(keyStr)] = valStr
|
||||
|
||||
if keyStr == "info_hash" {
|
||||
if hasInfohash {
|
||||
// Multiple infohashes
|
||||
if q.infohashes == nil {
|
||||
q.infohashes = []string{firstInfohash}
|
||||
}
|
||||
q.infohashes = append(q.infohashes, valStr)
|
||||
} else {
|
||||
firstInfohash = valStr
|
||||
hasInfohash = true
|
||||
}
|
||||
q.infoHashes = append(q.infoHashes, chihaya.InfoHash(valStr))
|
||||
} else {
|
||||
q.params[strings.ToLower(keyStr)] = valStr
|
||||
}
|
||||
|
||||
valEnd = 0
|
||||
@@ -106,18 +94,6 @@ func New(query string) (*Query, error) {
|
||||
return q, nil
|
||||
}
|
||||
|
||||
// Infohashes returns a list of requested infohashes.
|
||||
func (q *Query) Infohashes() ([]string, error) {
|
||||
if q.infohashes == nil {
|
||||
infohash, err := q.String("info_hash")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return []string{infohash}, nil
|
||||
}
|
||||
return q.infohashes, nil
|
||||
}
|
||||
|
||||
// String returns a string parsed from a query. Every key can be returned as a
|
||||
// string because they are encoded in the URL as strings.
|
||||
func (q *Query) String(key string) (string, error) {
|
||||
@@ -144,91 +120,7 @@ func (q *Query) Uint64(key string) (uint64, error) {
|
||||
return val, nil
|
||||
}
|
||||
|
||||
// AnnounceRequest generates an chihaya.AnnounceRequest with the parameters
|
||||
// provided by a query.
|
||||
func (q *Query) AnnounceRequest() (chihaya.AnnounceRequest, error) {
|
||||
request := make(chihaya.AnnounceRequest)
|
||||
|
||||
request["query"] = q.query
|
||||
|
||||
eventStr, err := q.String("event")
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: event")
|
||||
}
|
||||
request["event"], err = event.New(eventStr)
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to provide valid client event")
|
||||
}
|
||||
|
||||
compactStr, err := q.String("compact")
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: compact")
|
||||
}
|
||||
request["compact"] = compactStr != "0"
|
||||
|
||||
request["info_hash"], err = q.String("info_hash")
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: info_hash")
|
||||
}
|
||||
|
||||
request["peer_id"], err = q.String("peer_id")
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: peer_id")
|
||||
}
|
||||
|
||||
request["left"], err = q.Uint64("left")
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: left")
|
||||
}
|
||||
|
||||
request["downloaded"], err = q.Uint64("downloaded")
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: downloaded")
|
||||
}
|
||||
|
||||
request["uploaded"], err = q.Uint64("uploaded")
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: uploaded")
|
||||
}
|
||||
|
||||
request["numwant"], err = q.String("numwant")
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: numwant")
|
||||
}
|
||||
|
||||
request["port"], err = q.Uint64("port")
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: port")
|
||||
}
|
||||
|
||||
request["ip"], err = q.String("ip")
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: ip")
|
||||
}
|
||||
|
||||
request["ipv4"], err = q.String("ipv4")
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: ipv4")
|
||||
}
|
||||
|
||||
request["ipv6"], err = q.String("ipv6")
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: ipv6")
|
||||
}
|
||||
|
||||
return request, nil
|
||||
}
|
||||
|
||||
// ScrapeRequest generates an chihaya.ScrapeRequeset with the parameters
|
||||
// provided by a query.
|
||||
func (q *Query) ScrapeRequest() (chihaya.ScrapeRequest, error) {
|
||||
request := make(chihaya.ScrapeRequest)
|
||||
|
||||
var err error
|
||||
request["info_hash"], err = q.Infohashes()
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to parse parameter: info_hash")
|
||||
}
|
||||
|
||||
return request, nil
|
||||
// InfoHashes returns a list of requested infohashes.
|
||||
func (q *Query) InfoHashes() []chihaya.InfoHash {
|
||||
return q.infoHashes
|
||||
}
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
// Copyright 2016 The Chihaya Authors. All rights reserved.
|
||||
// Use of this source code is governed by the BSD 2-Clause license,
|
||||
// which can be found in the LICENSE file.
|
||||
|
||||
package query
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
"testing"
|
||||
)
|
||||
|
||||
var (
|
||||
baseAddr = "https://www.subdomain.tracker.com:80/"
|
||||
testInfoHash = "01234567890123456789"
|
||||
testPeerID = "-TEST01-6wfG2wk6wWLc"
|
||||
|
||||
ValidAnnounceArguments = []url.Values{
|
||||
url.Values{"peer_id": {testPeerID}, "port": {"6881"}, "downloaded": {"1234"}, "left": {"4321"}},
|
||||
url.Values{"peer_id": {testPeerID}, "ip": {"192.168.0.1"}, "port": {"6881"}, "downloaded": {"1234"}, "left": {"4321"}},
|
||||
url.Values{"peer_id": {testPeerID}, "ip": {"192.168.0.1"}, "port": {"6881"}, "downloaded": {"1234"}, "left": {"4321"}, "numwant": {"28"}},
|
||||
url.Values{"peer_id": {testPeerID}, "ip": {"192.168.0.1"}, "port": {"6881"}, "downloaded": {"1234"}, "left": {"4321"}, "event": {"stopped"}},
|
||||
url.Values{"peer_id": {testPeerID}, "ip": {"192.168.0.1"}, "port": {"6881"}, "downloaded": {"1234"}, "left": {"4321"}, "event": {"started"}, "numwant": {"13"}},
|
||||
url.Values{"peer_id": {testPeerID}, "port": {"6881"}, "downloaded": {"1234"}, "left": {"4321"}, "no_peer_id": {"1"}},
|
||||
url.Values{"peer_id": {testPeerID}, "port": {"6881"}, "downloaded": {"1234"}, "left": {"4321"}, "compact": {"0"}, "no_peer_id": {"1"}},
|
||||
url.Values{"peer_id": {testPeerID}, "port": {"6881"}, "downloaded": {"1234"}, "left": {"4321"}, "compact": {"0"}, "no_peer_id": {"1"}, "key": {"peerKey"}},
|
||||
url.Values{"peer_id": {testPeerID}, "port": {"6881"}, "downloaded": {"1234"}, "left": {"4321"}, "compact": {"0"}, "no_peer_id": {"1"}, "key": {"peerKey"}, "trackerid": {"trackerId"}},
|
||||
url.Values{"peer_id": {"%3Ckey%3A+0x90%3E"}, "port": {"6881"}, "downloaded": {"1234"}, "left": {"4321"}, "compact": {"0"}, "no_peer_id": {"1"}, "key": {"peerKey"}, "trackerid": {"trackerId"}},
|
||||
url.Values{"peer_id": {"%3Ckey%3A+0x90%3E"}, "compact": {"1"}},
|
||||
url.Values{"peer_id": {""}, "compact": {""}},
|
||||
}
|
||||
|
||||
InvalidQueries = []string{
|
||||
baseAddr + "announce/?" + "info_hash=%0%a",
|
||||
}
|
||||
)
|
||||
|
||||
func mapArrayEqual(boxed map[string][]string, unboxed map[string]string) bool {
|
||||
if len(boxed) != len(unboxed) {
|
||||
return false
|
||||
}
|
||||
|
||||
for mapKey, mapVal := range boxed {
|
||||
// Always expect box to hold only one element
|
||||
if len(mapVal) != 1 || mapVal[0] != unboxed[mapKey] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func TestValidQueries(t *testing.T) {
|
||||
for parseIndex, parseVal := range ValidAnnounceArguments {
|
||||
parsedQueryObj, err := New(baseAddr + "announce/?" + parseVal.Encode())
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if !mapArrayEqual(parseVal, parsedQueryObj.params) {
|
||||
t.Errorf("Incorrect parse at item %d.\n Expected=%v\n Recieved=%v\n", parseIndex, parseVal, parsedQueryObj.params)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestInvalidQueries(t *testing.T) {
|
||||
for parseIndex, parseStr := range InvalidQueries {
|
||||
parsedQueryObj, err := New(parseStr)
|
||||
if err == nil {
|
||||
t.Error("Should have produced error", parseIndex)
|
||||
}
|
||||
|
||||
if parsedQueryObj != nil {
|
||||
t.Error("Should be nil after error", parsedQueryObj, parseIndex)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkParseQuery(b *testing.B) {
|
||||
for bCount := 0; bCount < b.N; bCount++ {
|
||||
for parseIndex, parseStr := range ValidAnnounceArguments {
|
||||
parsedQueryObj, err := New(baseAddr + "announce/?" + parseStr.Encode())
|
||||
if err != nil {
|
||||
b.Error(err, parseIndex)
|
||||
b.Log(parsedQueryObj)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkURLParseQuery(b *testing.B) {
|
||||
for bCount := 0; bCount < b.N; bCount++ {
|
||||
for parseIndex, parseStr := range ValidAnnounceArguments {
|
||||
parsedQueryObj, err := url.ParseQuery(baseAddr + "announce/?" + parseStr.Encode())
|
||||
if err != nil {
|
||||
b.Error(err, parseIndex)
|
||||
b.Log(parsedQueryObj)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,171 @@
|
||||
// Copyright 2016 The Chihaya Authors. All rights reserved.
|
||||
// Use of this source code is governed by the BSD 2-Clause license,
|
||||
// which can be found in the LICENSE file.
|
||||
|
||||
package http
|
||||
|
||||
import (
|
||||
"net"
|
||||
"net/http"
|
||||
|
||||
"github.com/chihaya/chihaya"
|
||||
"github.com/chihaya/chihaya/errors"
|
||||
"github.com/chihaya/chihaya/pkg/event"
|
||||
"github.com/chihaya/chihaya/server/http/query"
|
||||
)
|
||||
|
||||
func announceRequest(r *http.Request, cfg *httpConfig) (*chihaya.AnnounceRequest, error) {
|
||||
q, err := query.New(r.URL.RawQuery)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
request := &chihaya.AnnounceRequest{Params: q}
|
||||
|
||||
eventStr, err := q.String("event")
|
||||
if err != nil {
|
||||
return nil, errors.NewBadRequest("failed to parse parameter: event")
|
||||
}
|
||||
request.Event, err = event.New(eventStr)
|
||||
if err != nil {
|
||||
return nil, errors.NewBadRequest("failed to provide valid client event")
|
||||
}
|
||||
|
||||
compactStr, err := q.String("compact")
|
||||
if err != nil {
|
||||
return nil, errors.NewBadRequest("failed to parse parameter: compact")
|
||||
}
|
||||
request.Compact = compactStr != "0"
|
||||
|
||||
infoHashes := q.InfoHashes()
|
||||
if len(infoHashes) < 1 {
|
||||
return nil, errors.NewBadRequest("no info_hash parameter supplied")
|
||||
}
|
||||
if len(infoHashes) > 1 {
|
||||
return nil, errors.NewBadRequest("multiple info_hash parameters supplied")
|
||||
}
|
||||
request.InfoHash = infoHashes[0]
|
||||
|
||||
peerID, err := q.String("peer_id")
|
||||
if err != nil {
|
||||
return nil, errors.NewBadRequest("failed to parse parameter: peer_id")
|
||||
}
|
||||
request.PeerID = chihaya.PeerID(peerID)
|
||||
|
||||
request.Left, err = q.Uint64("left")
|
||||
if err != nil {
|
||||
return nil, errors.NewBadRequest("failed to parse parameter: left")
|
||||
}
|
||||
|
||||
request.Downloaded, err = q.Uint64("downloaded")
|
||||
if err != nil {
|
||||
return nil, errors.NewBadRequest("failed to parse parameter: downloaded")
|
||||
}
|
||||
|
||||
request.Uploaded, err = q.Uint64("uploaded")
|
||||
if err != nil {
|
||||
return nil, errors.NewBadRequest("failed to parse parameter: uploaded")
|
||||
}
|
||||
|
||||
request.NumWant, err = q.Uint64("numwant")
|
||||
if err != nil {
|
||||
return nil, errors.NewBadRequest("failed to parse parameter: numwant")
|
||||
}
|
||||
|
||||
port, err := q.Uint64("port")
|
||||
if err != nil {
|
||||
return nil, errors.NewBadRequest("failed to parse parameter: port")
|
||||
}
|
||||
request.Port = uint16(port)
|
||||
|
||||
return request, nil
|
||||
}
|
||||
|
||||
func scrapeRequest(r *http.Request, cfg *httpConfig) (*chihaya.ScrapeRequest, error) {
|
||||
q, err := query.New(r.URL.RawQuery)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
request := &chihaya.ScrapeRequest{
|
||||
InfoHashes: q.InfoHashes(),
|
||||
Params: q,
|
||||
}
|
||||
|
||||
return request, nil
|
||||
}
|
||||
|
||||
// requestedIP returns the IP address for a request. If there are multiple in
|
||||
// the request, one IPv4 and one IPv6 will be returned.
|
||||
func requestedIP(q *query.Query, r *http.Request, cfg *httpConfig) (v4, v6 net.IP, err error) {
|
||||
var done bool
|
||||
|
||||
if cfg.AllowIPSpoofing {
|
||||
if str, e := q.String("ip"); e == nil {
|
||||
if v4, v6, done = getIPs(str, v4, v6, cfg); done {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if str, e := q.String("ipv4"); e == nil {
|
||||
if v4, v6, done = getIPs(str, v4, v6, cfg); done {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if str, e := q.String("ipv6"); e == nil {
|
||||
if v4, v6, done = getIPs(str, v4, v6, cfg); done {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if cfg.RealIPHeader != "" {
|
||||
if xRealIPs, ok := r.Header[cfg.RealIPHeader]; ok {
|
||||
if v4, v6, done = getIPs(string(xRealIPs[0]), v4, v6, cfg); done {
|
||||
return
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if r.RemoteAddr == "" && v4 == nil {
|
||||
if v4, v6, done = getIPs("127.0.0.1", v4, v6, cfg); done {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if v4, v6, done = getIPs(r.RemoteAddr, v4, v6, cfg); done {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if v4 == nil && v6 == nil {
|
||||
err = errors.NewBadRequest("failed to parse IP address")
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func getIPs(ipstr string, ipv4, ipv6 net.IP, cfg *httpConfig) (net.IP, net.IP, bool) {
|
||||
host, _, err := net.SplitHostPort(ipstr)
|
||||
if err != nil {
|
||||
host = ipstr
|
||||
}
|
||||
|
||||
if ip := net.ParseIP(host); ip != nil {
|
||||
ipTo4 := ip.To4()
|
||||
if ipv4 == nil && ipTo4 != nil {
|
||||
ipv4 = ipTo4
|
||||
} else if ipv6 == nil && ipTo4 == nil {
|
||||
ipv6 = ip
|
||||
}
|
||||
}
|
||||
|
||||
var done bool
|
||||
if cfg.DualStackedPeers {
|
||||
done = ipv4 != nil && ipv6 != nil
|
||||
} else {
|
||||
done = ipv4 != nil || ipv6 != nil
|
||||
}
|
||||
|
||||
return ipv4, ipv6, done
|
||||
}
|
||||
+8
-25
@@ -15,7 +15,6 @@ import (
|
||||
|
||||
"github.com/chihaya/chihaya/config"
|
||||
"github.com/chihaya/chihaya/server"
|
||||
"github.com/chihaya/chihaya/server/http/query"
|
||||
"github.com/chihaya/chihaya/tracker"
|
||||
)
|
||||
|
||||
@@ -99,49 +98,33 @@ func (s *httpServer) routes() *httprouter.Router {
|
||||
}
|
||||
|
||||
func (s *httpServer) serveAnnounce(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
|
||||
writer := &writer{w}
|
||||
|
||||
q, err := query.New(r.URL.RawQuery)
|
||||
req, err := announceRequest(r, s.cfg)
|
||||
if err != nil {
|
||||
writer.writeError(err)
|
||||
return
|
||||
}
|
||||
|
||||
req, err := q.AnnounceRequest()
|
||||
if err != nil {
|
||||
writer.writeError(err)
|
||||
writeError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
resp, err := s.tkr.HandleAnnounce(req)
|
||||
if err != nil {
|
||||
writer.writeError(err)
|
||||
writeError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
writer.writeAnnounceResponse(resp)
|
||||
writeAnnounceResponse(w, resp)
|
||||
}
|
||||
|
||||
func (s *httpServer) serveScrape(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
|
||||
writer := &writer{w}
|
||||
|
||||
q, err := query.New(r.URL.RawQuery)
|
||||
req, err := scrapeRequest(r, s.cfg)
|
||||
if err != nil {
|
||||
writer.writeError(err)
|
||||
return
|
||||
}
|
||||
|
||||
req, err := q.ScrapeRequest()
|
||||
if err != nil {
|
||||
writer.writeError(err)
|
||||
writeError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
resp, err := s.tkr.HandleScrape(req)
|
||||
if err != nil {
|
||||
writer.writeError(err)
|
||||
writeError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
writer.writeScrapeResponse(resp)
|
||||
writeScrapeResponse(w, resp)
|
||||
}
|
||||
|
||||
+15
-5
@@ -8,18 +8,28 @@ import (
|
||||
"net/http"
|
||||
|
||||
"github.com/chihaya/chihaya"
|
||||
"github.com/chihaya/chihaya/errors"
|
||||
"github.com/chihaya/chihaya/pkg/bencode"
|
||||
)
|
||||
|
||||
type writer struct{ http.ResponseWriter }
|
||||
func writeError(w http.ResponseWriter, err error) error {
|
||||
message := "internal server error"
|
||||
chihayaErr, ok := err.(*errors.Error)
|
||||
|
||||
if ok {
|
||||
w.WriteHeader(chihayaErr.Status())
|
||||
|
||||
if chihayaErr.Public() {
|
||||
message = err.Error()
|
||||
}
|
||||
}
|
||||
|
||||
func (w *writer) writeError(err error) error {
|
||||
return bencode.NewEncoder(w).Encode(bencode.Dict{
|
||||
"failure reason": err.Error(),
|
||||
"failure reason": message,
|
||||
})
|
||||
}
|
||||
|
||||
func (w *writer) writeAnnounceResponse(resp *chihaya.AnnounceResponse) error {
|
||||
func writeAnnounceResponse(w http.ResponseWriter, resp *chihaya.AnnounceResponse) error {
|
||||
bdict := bencode.Dict{
|
||||
"complete": resp.Complete,
|
||||
"incomplete": resp.Incomplete,
|
||||
@@ -63,7 +73,7 @@ func (w *writer) writeAnnounceResponse(resp *chihaya.AnnounceResponse) error {
|
||||
return bencode.NewEncoder(w).Encode(bdict)
|
||||
}
|
||||
|
||||
func (w *writer) writeScrapeResponse(resp *chihaya.ScrapeResponse) error {
|
||||
func writeScrapeResponse(w http.ResponseWriter, resp *chihaya.ScrapeResponse) error {
|
||||
filesDict := bencode.NewDict()
|
||||
for infohash, scrape := range resp.Files {
|
||||
filesDict[infohash] = bencode.Dict{
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"github.com/chihaya/chihaya/errors"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
@@ -22,9 +22,17 @@ func TestWriteError(t *testing.T) {
|
||||
|
||||
for _, tt := range table {
|
||||
r := httptest.NewRecorder()
|
||||
w := &writer{r}
|
||||
err := w.writeError(errors.New(tt.reason))
|
||||
assert.Nil(t, err, "writeError should not fail with test input")
|
||||
assert.Equal(t, r.Body.String(), tt.expected, "writer should write the expected value")
|
||||
err := writeError(r, errors.NewMessage(tt.reason))
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, r.Body.String(), tt.expected)
|
||||
assert.Equal(t, r.Code, 200)
|
||||
}
|
||||
}
|
||||
|
||||
func TestWriteStatus(t *testing.T) {
|
||||
r := httptest.NewRecorder()
|
||||
err := writeError(r, errors.NewBadRequest("something is missing"))
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, r.Body.String(), "d14:failure reason20:something is missinge")
|
||||
assert.Equal(t, r.Code, 400)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user