101 lines
2.3 KiB
Go
101 lines
2.3 KiB
Go
|
// Copyright 2014 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/http"
|
||
|
|
||
|
"github.com/julienschmidt/httprouter"
|
||
|
|
||
|
"github.com/chihaya/chihaya/config"
|
||
|
"github.com/chihaya/chihaya/models/query"
|
||
|
"github.com/chihaya/chihaya/tracker/models"
|
||
|
)
|
||
|
|
||
|
// NewAnnounce parses an HTTP request and generates a models.Announce.
|
||
|
func NewAnnounce(cfg *config.Config, r *http.Request, p httprouter.Params) (*models.Announce, error) {
|
||
|
q, err := query.New(r.URL.RawQuery)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
compact := q.Params["compact"] != "0"
|
||
|
event, _ := q.Params["event"]
|
||
|
numWant := q.RequestedPeerCount(cfg.NumWantFallback)
|
||
|
|
||
|
infohash, exists := q.Params["info_hash"]
|
||
|
if !exists {
|
||
|
return nil, models.ErrMalformedRequest
|
||
|
}
|
||
|
|
||
|
peerID, exists := q.Params["peer_id"]
|
||
|
if !exists {
|
||
|
return nil, models.ErrMalformedRequest
|
||
|
}
|
||
|
|
||
|
ip, err := q.RequestedIP(r)
|
||
|
if err != nil {
|
||
|
return nil, models.ErrMalformedRequest
|
||
|
}
|
||
|
|
||
|
port, err := q.Uint64("port")
|
||
|
if err != nil {
|
||
|
return nil, models.ErrMalformedRequest
|
||
|
}
|
||
|
|
||
|
left, err := q.Uint64("left")
|
||
|
if err != nil {
|
||
|
return nil, models.ErrMalformedRequest
|
||
|
}
|
||
|
|
||
|
downloaded, err := q.Uint64("downloaded")
|
||
|
if err != nil {
|
||
|
return nil, models.ErrMalformedRequest
|
||
|
}
|
||
|
|
||
|
uploaded, err := q.Uint64("uploaded")
|
||
|
if err != nil {
|
||
|
return nil, models.ErrMalformedRequest
|
||
|
}
|
||
|
|
||
|
return &models.Announce{
|
||
|
Config: cfg,
|
||
|
Compact: compact,
|
||
|
Downloaded: downloaded,
|
||
|
Event: event,
|
||
|
IP: ip,
|
||
|
Infohash: infohash,
|
||
|
Left: left,
|
||
|
NumWant: numWant,
|
||
|
Passkey: p.ByName("passkey"),
|
||
|
PeerID: peerID,
|
||
|
Port: port,
|
||
|
Uploaded: uploaded,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
// NewScrape parses an HTTP request and generates a models.Scrape.
|
||
|
func NewScrape(cfg *config.Config, r *http.Request, p httprouter.Params) (*models.Scrape, error) {
|
||
|
q, err := query.New(r.URL.RawQuery)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if q.Infohashes == nil {
|
||
|
if _, exists := q.Params["info_hash"]; !exists {
|
||
|
// There aren't any infohashes.
|
||
|
return nil, models.ErrMalformedRequest
|
||
|
}
|
||
|
q.Infohashes = []string{q.Params["info_hash"]}
|
||
|
}
|
||
|
|
||
|
return &models.Scrape{
|
||
|
Config: cfg,
|
||
|
|
||
|
Passkey: p.ByName("passkey"),
|
||
|
Infohashes: q.Infohashes,
|
||
|
}, nil
|
||
|
}
|