Remove peaking, addresses #93
This commit is contained in:
parent
51583f5d28
commit
e50779664d
4 changed files with 24 additions and 101 deletions
|
@ -18,7 +18,9 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -459,9 +461,6 @@ func (s *Server) handlePublish(w http.ResponseWriter, r *http.Request, v *visito
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := maybePeakAttachmentURL(m); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := s.handlePublishBody(r, v, m, body); err != nil {
|
if err := s.handlePublishBody(r, v, m, body); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -507,19 +506,31 @@ func (s *Server) parsePublishParams(r *http.Request, v *visitor, m *message) (ca
|
||||||
firebase = readParam(r, "x-firebase", "firebase") != "no"
|
firebase = readParam(r, "x-firebase", "firebase") != "no"
|
||||||
m.Title = readParam(r, "x-title", "title", "t")
|
m.Title = readParam(r, "x-title", "title", "t")
|
||||||
m.Click = readParam(r, "x-click", "click")
|
m.Click = readParam(r, "x-click", "click")
|
||||||
attach := readParam(r, "x-attach", "attach", "a")
|
|
||||||
filename := readParam(r, "x-filename", "filename", "file", "f")
|
filename := readParam(r, "x-filename", "filename", "file", "f")
|
||||||
|
attach := readParam(r, "x-attach", "attach", "a")
|
||||||
if attach != "" || filename != "" {
|
if attach != "" || filename != "" {
|
||||||
m.Attachment = &attachment{}
|
m.Attachment = &attachment{}
|
||||||
}
|
}
|
||||||
|
if filename != "" {
|
||||||
|
m.Attachment.Name = filename
|
||||||
|
}
|
||||||
if attach != "" {
|
if attach != "" {
|
||||||
if !attachURLRegex.MatchString(attach) {
|
if !attachURLRegex.MatchString(attach) {
|
||||||
return false, false, "", errHTTPBadRequestAttachmentURLInvalid
|
return false, false, "", errHTTPBadRequestAttachmentURLInvalid
|
||||||
}
|
}
|
||||||
m.Attachment.URL = attach
|
m.Attachment.URL = attach
|
||||||
|
if m.Attachment.Name == "" {
|
||||||
|
u, err := url.Parse(m.Attachment.URL)
|
||||||
|
if err == nil {
|
||||||
|
m.Attachment.Name = path.Base(u.Path)
|
||||||
|
if m.Attachment.Name == "." || m.Attachment.Name == "/" {
|
||||||
|
m.Attachment.Name = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if m.Attachment.Name == "" {
|
||||||
|
m.Attachment.Name = "attachment"
|
||||||
}
|
}
|
||||||
if filename != "" {
|
|
||||||
m.Attachment.Name = filename
|
|
||||||
}
|
}
|
||||||
email = readParam(r, "x-email", "x-e-mail", "email", "e-mail", "mail", "e")
|
email = readParam(r, "x-email", "x-e-mail", "email", "e-mail", "mail", "e")
|
||||||
if email != "" {
|
if email != "" {
|
||||||
|
|
|
@ -743,10 +743,10 @@ func TestServer_PublishAttachmentExternalWithoutFilename(t *testing.T) {
|
||||||
msg := toMessage(t, response.Body.String())
|
msg := toMessage(t, response.Body.String())
|
||||||
require.Equal(t, "You received a file: Pink_flower.jpg", msg.Message)
|
require.Equal(t, "You received a file: Pink_flower.jpg", msg.Message)
|
||||||
require.Equal(t, "Pink_flower.jpg", msg.Attachment.Name)
|
require.Equal(t, "Pink_flower.jpg", msg.Attachment.Name)
|
||||||
require.Equal(t, "image/jpeg", msg.Attachment.Type)
|
|
||||||
require.Equal(t, int64(190173), msg.Attachment.Size)
|
|
||||||
require.Equal(t, int64(0), msg.Attachment.Expires)
|
|
||||||
require.Equal(t, "https://upload.wikimedia.org/wikipedia/commons/f/fd/Pink_flower.jpg", msg.Attachment.URL)
|
require.Equal(t, "https://upload.wikimedia.org/wikipedia/commons/f/fd/Pink_flower.jpg", msg.Attachment.URL)
|
||||||
|
require.Equal(t, "", msg.Attachment.Type)
|
||||||
|
require.Equal(t, int64(0), msg.Attachment.Size)
|
||||||
|
require.Equal(t, int64(0), msg.Attachment.Expires)
|
||||||
require.Equal(t, "", msg.Attachment.Owner)
|
require.Equal(t, "", msg.Attachment.Owner)
|
||||||
|
|
||||||
// Slightly unrelated cross-test: make sure we don't add an owner for external attachments
|
// Slightly unrelated cross-test: make sure we don't add an owner for external attachments
|
||||||
|
@ -764,10 +764,10 @@ func TestServer_PublishAttachmentExternalWithFilename(t *testing.T) {
|
||||||
msg := toMessage(t, response.Body.String())
|
msg := toMessage(t, response.Body.String())
|
||||||
require.Equal(t, "This is a custom message", msg.Message)
|
require.Equal(t, "This is a custom message", msg.Message)
|
||||||
require.Equal(t, "some file.jpg", msg.Attachment.Name)
|
require.Equal(t, "some file.jpg", msg.Attachment.Name)
|
||||||
require.Equal(t, "image/jpeg", msg.Attachment.Type)
|
|
||||||
require.Equal(t, int64(190173), msg.Attachment.Size)
|
|
||||||
require.Equal(t, int64(0), msg.Attachment.Expires)
|
|
||||||
require.Equal(t, "https://upload.wikimedia.org/wikipedia/commons/f/fd/Pink_flower.jpg", msg.Attachment.URL)
|
require.Equal(t, "https://upload.wikimedia.org/wikipedia/commons/f/fd/Pink_flower.jpg", msg.Attachment.URL)
|
||||||
|
require.Equal(t, "", msg.Attachment.Type)
|
||||||
|
require.Equal(t, int64(0), msg.Attachment.Size)
|
||||||
|
require.Equal(t, int64(0), msg.Attachment.Expires)
|
||||||
require.Equal(t, "", msg.Attachment.Owner)
|
require.Equal(t, "", msg.Attachment.Owner)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"heckel.io/ntfy/util"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
|
||||||
"path"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
peakAttachmentTimeout = 2500 * time.Millisecond
|
|
||||||
peakAttachmentReadBytes = 128
|
|
||||||
)
|
|
||||||
|
|
||||||
func maybePeakAttachmentURL(m *message) error {
|
|
||||||
return maybePeakAttachmentURLInternal(m, peakAttachmentTimeout)
|
|
||||||
}
|
|
||||||
|
|
||||||
func maybePeakAttachmentURLInternal(m *message, timeout time.Duration) error {
|
|
||||||
if m.Attachment == nil || m.Attachment.URL == "" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
client := http.Client{
|
|
||||||
Timeout: timeout,
|
|
||||||
Transport: &http.Transport{
|
|
||||||
DisableCompression: true, // Disable "Accept-Encoding: gzip", otherwise we won't get the Content-Length
|
|
||||||
Proxy: http.ProxyFromEnvironment,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
req, err := http.NewRequest(http.MethodGet, m.Attachment.URL, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
req.Header.Set("User-Agent", "ntfy")
|
|
||||||
resp, err := client.Do(req)
|
|
||||||
if err != nil {
|
|
||||||
return errHTTPBadRequestAttachmentURLPeakGeneral
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
if resp.StatusCode < 200 || resp.StatusCode > 299 {
|
|
||||||
return errHTTPBadRequestAttachmentURLPeakNon2xx
|
|
||||||
}
|
|
||||||
if size, err := strconv.ParseInt(resp.Header.Get("Content-Length"), 10, 64); err == nil {
|
|
||||||
m.Attachment.Size = size
|
|
||||||
}
|
|
||||||
buf := make([]byte, peakAttachmentReadBytes)
|
|
||||||
io.ReadFull(resp.Body, buf) // Best effort: We don't care about the error
|
|
||||||
mimeType, ext := util.DetectContentType(buf, m.Attachment.URL)
|
|
||||||
m.Attachment.Type = resp.Header.Get("Content-Type")
|
|
||||||
if m.Attachment.Type == "" {
|
|
||||||
m.Attachment.Type = mimeType
|
|
||||||
}
|
|
||||||
if m.Attachment.Name == "" {
|
|
||||||
u, err := url.Parse(m.Attachment.URL)
|
|
||||||
if err != nil {
|
|
||||||
m.Attachment.Name = fmt.Sprintf("attachment%s", ext)
|
|
||||||
} else {
|
|
||||||
m.Attachment.Name = path.Base(u.Path)
|
|
||||||
if m.Attachment.Name == "." || m.Attachment.Name == "/" {
|
|
||||||
m.Attachment.Name = fmt.Sprintf("attachment%s", ext)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestMaybePeakAttachmentURL_Success(t *testing.T) {
|
|
||||||
m := &message{
|
|
||||||
Attachment: &attachment{
|
|
||||||
URL: "https://ntfy.sh/static/img/ntfy.png",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
require.Nil(t, maybePeakAttachmentURL(m))
|
|
||||||
require.Equal(t, "ntfy.png", m.Attachment.Name)
|
|
||||||
require.Equal(t, int64(3627), m.Attachment.Size)
|
|
||||||
require.Equal(t, "image/png", m.Attachment.Type)
|
|
||||||
require.Equal(t, int64(0), m.Attachment.Expires)
|
|
||||||
}
|
|
Loading…
Reference in a new issue