Adjust Matrix/UP behavior to work with Synapse+Mastodon
This commit is contained in:
		
							parent
							
								
									b2bedafae7
								
							
						
					
					
						commit
						0606fbe60a
					
				
					 5 changed files with 34 additions and 61 deletions
				
			
		|  | @ -61,7 +61,6 @@ var ( | ||||||
| 	errHTTPBadRequestMessageJSONInvalid              = &errHTTP{40017, http.StatusBadRequest, "invalid request: request body must be message JSON", "https://ntfy.sh/docs/publish/#publish-as-json"} | 	errHTTPBadRequestMessageJSONInvalid              = &errHTTP{40017, http.StatusBadRequest, "invalid request: request body must be message JSON", "https://ntfy.sh/docs/publish/#publish-as-json"} | ||||||
| 	errHTTPBadRequestActionsInvalid                  = &errHTTP{40018, http.StatusBadRequest, "invalid request: actions invalid", "https://ntfy.sh/docs/publish/#action-buttons"} | 	errHTTPBadRequestActionsInvalid                  = &errHTTP{40018, http.StatusBadRequest, "invalid request: actions invalid", "https://ntfy.sh/docs/publish/#action-buttons"} | ||||||
| 	errHTTPBadRequestMatrixMessageInvalid            = &errHTTP{40019, http.StatusBadRequest, "invalid request: Matrix JSON invalid", "https://ntfy.sh/docs/publish/#matrix-gateway"} | 	errHTTPBadRequestMatrixMessageInvalid            = &errHTTP{40019, http.StatusBadRequest, "invalid request: Matrix JSON invalid", "https://ntfy.sh/docs/publish/#matrix-gateway"} | ||||||
| 	errHTTPBadRequestMatrixPushkeyBaseURLMismatch    = &errHTTP{40020, http.StatusBadRequest, "invalid request: push key must be prefixed with base URL", "https://ntfy.sh/docs/publish/#matrix-gateway"} |  | ||||||
| 	errHTTPBadRequestIconURLInvalid                  = &errHTTP{40021, http.StatusBadRequest, "invalid request: icon URL is invalid", "https://ntfy.sh/docs/publish/#icons"} | 	errHTTPBadRequestIconURLInvalid                  = &errHTTP{40021, http.StatusBadRequest, "invalid request: icon URL is invalid", "https://ntfy.sh/docs/publish/#icons"} | ||||||
| 	errHTTPBadRequestSignupNotEnabled                = &errHTTP{40022, http.StatusBadRequest, "invalid request: signup not enabled", "https://ntfy.sh/docs/config"} | 	errHTTPBadRequestSignupNotEnabled                = &errHTTP{40022, http.StatusBadRequest, "invalid request: signup not enabled", "https://ntfy.sh/docs/config"} | ||||||
| 	errHTTPBadRequestNoTokenProvided                 = &errHTTP{40023, http.StatusBadRequest, "invalid request: no token provided", ""} | 	errHTTPBadRequestNoTokenProvided                 = &errHTTP{40023, http.StatusBadRequest, "invalid request: no token provided", ""} | ||||||
|  | @ -92,5 +91,5 @@ var ( | ||||||
| 	errHTTPInternalError                             = &errHTTP{50001, http.StatusInternalServerError, "internal server error", ""} | 	errHTTPInternalError                             = &errHTTP{50001, http.StatusInternalServerError, "internal server error", ""} | ||||||
| 	errHTTPInternalErrorInvalidPath                  = &errHTTP{50002, http.StatusInternalServerError, "internal server error: invalid path", ""} | 	errHTTPInternalErrorInvalidPath                  = &errHTTP{50002, http.StatusInternalServerError, "internal server error: invalid path", ""} | ||||||
| 	errHTTPInternalErrorMissingBaseURL               = &errHTTP{50003, http.StatusInternalServerError, "internal server error: base-url must be be configured for this feature", "https://ntfy.sh/docs/config/"} | 	errHTTPInternalErrorMissingBaseURL               = &errHTTP{50003, http.StatusInternalServerError, "internal server error: base-url must be be configured for this feature", "https://ntfy.sh/docs/config/"} | ||||||
| 	errHTTPInsufficientStorage                       = &errHTTP{50701, http.StatusInsufficientStorage, "internal server error: cannot publish to UnifiedPush topic without active subscriber", ""} | 	errHTTPInsufficientStorage                       = &errHTTP{50701, http.StatusInsufficientStorage, "internal server error: cannot publish to UnifiedPush topic without previously active subscriber", ""} | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | @ -328,12 +328,6 @@ func (s *Server) handleError(w http.ResponseWriter, r *http.Request, v *visitor, | ||||||
| 		} | 		} | ||||||
| 		return // Do not attempt to write to upgraded connection | 		return // Do not attempt to write to upgraded connection | ||||||
| 	} | 	} | ||||||
| 	if matrixErr, ok := err.(*errMatrix); ok { |  | ||||||
| 		if err := writeMatrixError(w, r, v, matrixErr); err != nil { |  | ||||||
| 			logvr(v, r).Tag(tagMatrix).Err(err).Debug("Writing Matrix error failed") |  | ||||||
| 		} |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	if isNormalError { | 	if isNormalError { | ||||||
| 		logvr(v, r).Err(err).Debug("Connection closed with HTTP %d (ntfy error %d)", httpErr.HTTPCode, httpErr.Code) | 		logvr(v, r).Err(err).Debug("Connection closed with HTTP %d (ntfy error %d)", httpErr.HTTPCode, httpErr.Code) | ||||||
| 	} else { | 	} else { | ||||||
|  | @ -582,6 +576,10 @@ func (s *Server) handlePublishWithoutResponse(r *http.Request, v *visitor) (*mes | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	if unifiedpush && t.RateVisitor() == nil { | 	if unifiedpush && t.RateVisitor() == nil { | ||||||
|  | 		// UnifiedPush clients must subscribe before publishing to allow proper subscriber-based rate limiting (see | ||||||
|  | 		// Rate-Topics header). The 5xx response is because some app servers (in particular Mastodon) will remove | ||||||
|  | 		// the subscription as invalid if any 400-499 code (except 429/408) is returned. | ||||||
|  | 		// See https://github.com/mastodon/mastodon/blob/730bb3e211a84a2f30e3e2bbeae3f77149824a68/app/workers/web/push_notification_worker.rb#L35-L46 | ||||||
| 		return nil, errHTTPInsufficientStorage | 		return nil, errHTTPInsufficientStorage | ||||||
| 	} else if !util.ContainsIP(s.config.VisitorRequestExemptIPAddrs, v.ip) && !vrate.MessageAllowed() { | 	} else if !util.ContainsIP(s.config.VisitorRequestExemptIPAddrs, v.ip) && !vrate.MessageAllowed() { | ||||||
| 		return nil, errHTTPTooManyRequestsLimitMessages | 		return nil, errHTTPTooManyRequestsLimitMessages | ||||||
|  | @ -1525,12 +1523,14 @@ func (s *Server) transformMatrixJSON(next handleFunc) handleFunc { | ||||||
| 		newRequest, err := newRequestFromMatrixJSON(r, s.config.BaseURL, s.config.MessageLimit) | 		newRequest, err := newRequestFromMatrixJSON(r, s.config.BaseURL, s.config.MessageLimit) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			logvr(v, r).Tag(tagMatrix).Err(err).Debug("Invalid Matrix request") | 			logvr(v, r).Tag(tagMatrix).Err(err).Debug("Invalid Matrix request") | ||||||
|  | 			if e, ok := err.(*errMatrixPushkeyRejected); ok { | ||||||
|  | 				return writeMatrixResponse(w, e.rejectedPushKey) | ||||||
|  | 			} | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		if err := next(w, newRequest, v); err != nil { | 		if err := next(w, newRequest, v); err != nil { | ||||||
| 			logvr(v, r).Tag(tagMatrix).Err(err).Debug("Error handling Matrix request") | 			logvr(v, r).Tag(tagMatrix).Err(err).Debug("Error handling Matrix request") | ||||||
| 			// No normal error should cause pushKey rejection; don't set errMatrix.pushKey. | 			return err | ||||||
| 			return &errMatrix{err: err} |  | ||||||
| 		} | 		} | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -71,27 +71,18 @@ type matrixResponse struct { | ||||||
| 	Rejected []string `json:"rejected"` | 	Rejected []string `json:"rejected"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // errMatrix represents an error when handing Matrix gateway messages | // errMatrixPushkeyRejected represents an error when handing Matrix gateway messages | ||||||
| // | // | ||||||
| // If the pushKey is set, the app server will remove it and will never send messages using the same | // If the push key is set, the app server will remove it and will never send messages using the same | ||||||
| // push key again, until the user repairs it. | // push key again, until the user repairs it. | ||||||
| type errMatrix struct { | type errMatrixPushkeyRejected struct { | ||||||
| 	pushKey string | 	rejectedPushKey   string | ||||||
| 	err     error | 	configuredBaseURL string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (e errMatrix) Error() string { | func (e errMatrixPushkeyRejected) Error() string { | ||||||
| 	if e.err != nil { | 	return fmt.Sprintf("push key must be prefixed with base URL, received push key: %s, configured base URL: %s", e.rejectedPushKey, e.configuredBaseURL) | ||||||
| 		return fmt.Sprintf("message with push key %s rejected: %s", e.pushKey, e.err.Error()) |  | ||||||
| } | } | ||||||
| 	return fmt.Sprintf("message with push key %s rejected", e.pushKey) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	// matrixPushKeyHeader is a header that's used internally to pass the Matrix push key (from the matrixRequest) |  | ||||||
| 	// along with the request. The push key is only used if an error occurs down the line. |  | ||||||
| 	matrixPushKeyHeader = "X-Matrix-Pushkey" |  | ||||||
| ) |  | ||||||
| 
 | 
 | ||||||
| // newRequestFromMatrixJSON reads the request body as a Matrix JSON message, parses the "pushkey", and creates a new | // newRequestFromMatrixJSON reads the request body as a Matrix JSON message, parses the "pushkey", and creates a new | ||||||
| // HTTP request that looks like a normal ntfy request from it. | // HTTP request that looks like a normal ntfy request from it. | ||||||
|  | @ -125,17 +116,16 @@ func newRequestFromMatrixJSON(r *http.Request, baseURL string, messageLimit int) | ||||||
| 	} | 	} | ||||||
| 	pushKey := m.Notification.Devices[0].PushKey // We ignore other devices for now, see discussion in #316 | 	pushKey := m.Notification.Devices[0].PushKey // We ignore other devices for now, see discussion in #316 | ||||||
| 	if !strings.HasPrefix(pushKey, baseURL+"/") { | 	if !strings.HasPrefix(pushKey, baseURL+"/") { | ||||||
| 		return nil, &errMatrix{pushKey: pushKey, err: wrapErrHTTP(errHTTPBadRequestMatrixPushkeyBaseURLMismatch, "received push key: %s, configured base URL: %s", pushKey, baseURL)} | 		return nil, &errMatrixPushkeyRejected{rejectedPushKey: pushKey, configuredBaseURL: baseURL} | ||||||
| 	} | 	} | ||||||
| 	newRequest, err := http.NewRequest(http.MethodPost, pushKey, io.NopCloser(bytes.NewReader(body.PeekedBytes))) | 	newRequest, err := http.NewRequest(http.MethodPost, pushKey, io.NopCloser(bytes.NewReader(body.PeekedBytes))) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, &errMatrix{pushKey: pushKey, err: err} | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	newRequest.RemoteAddr = r.RemoteAddr // Not strictly necessary, since visitor was already extracted | 	newRequest.RemoteAddr = r.RemoteAddr // Not strictly necessary, since visitor was already extracted | ||||||
| 	if r.Header.Get("X-Forwarded-For") != "" { | 	if r.Header.Get("X-Forwarded-For") != "" { | ||||||
| 		newRequest.Header.Set("X-Forwarded-For", r.Header.Get("X-Forwarded-For")) | 		newRequest.Header.Set("X-Forwarded-For", r.Header.Get("X-Forwarded-For")) | ||||||
| 	} | 	} | ||||||
| 	newRequest.Header.Set(matrixPushKeyHeader, pushKey) |  | ||||||
| 	return newRequest, nil | 	return newRequest, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -147,17 +137,6 @@ func writeMatrixDiscoveryResponse(w http.ResponseWriter) error { | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // writeMatrixError logs and writes the errMatrix to the given http.ResponseWriter as a matrixResponse |  | ||||||
| func writeMatrixError(w http.ResponseWriter, r *http.Request, v *visitor, err *errMatrix) error { |  | ||||||
| 	logvr(v, r).Tag(tagMatrix).Err(err).Debug("Matrix gateway error") |  | ||||||
| 	if httpErr, ok := err.err.(*errHTTP); ok { |  | ||||||
| 		w.Header().Set("X-Ntfy-Error-Code", fmt.Sprintf("%d", httpErr.Code)) |  | ||||||
| 		w.Header().Set("X-Ntfy-Error-Message", httpErr.Message) |  | ||||||
| 		w.WriteHeader(httpErr.HTTPCode) |  | ||||||
| 	} |  | ||||||
| 	return writeMatrixResponse(w, err.pushKey) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // writeMatrixSuccess writes a successful matrixResponse (no rejected push key) to the given http.ResponseWriter | // writeMatrixSuccess writes a successful matrixResponse (no rejected push key) to the given http.ResponseWriter | ||||||
| func writeMatrixSuccess(w http.ResponseWriter) error { | func writeMatrixSuccess(w http.ResponseWriter) error { | ||||||
| 	return writeMatrixResponse(w, "") | 	return writeMatrixResponse(w, "") | ||||||
|  |  | ||||||
|  | @ -3,7 +3,6 @@ package server | ||||||
| import ( | import ( | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/http/httptest" | 	"net/http/httptest" | ||||||
| 	"net/netip" |  | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"testing" | 	"testing" | ||||||
| 
 | 
 | ||||||
|  | @ -19,7 +18,6 @@ func TestMatrix_NewRequestFromMatrixJSON_Success(t *testing.T) { | ||||||
| 	require.Nil(t, err) | 	require.Nil(t, err) | ||||||
| 	require.Equal(t, "POST", newRequest.Method) | 	require.Equal(t, "POST", newRequest.Method) | ||||||
| 	require.Equal(t, "https://ntfy.sh/upABCDEFGHI?up=1", newRequest.URL.String()) | 	require.Equal(t, "https://ntfy.sh/upABCDEFGHI?up=1", newRequest.URL.String()) | ||||||
| 	require.Equal(t, "https://ntfy.sh/upABCDEFGHI?up=1", newRequest.Header.Get("X-Matrix-Pushkey")) |  | ||||||
| 	require.Equal(t, body, readAll(t, newRequest.Body)) | 	require.Equal(t, body, readAll(t, newRequest.Body)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -56,10 +54,10 @@ func TestMatrix_NewRequestFromMatrixJSON_MismatchingPushKey(t *testing.T) { | ||||||
| 	body := `{"notification":{"content":{"body":"I'm floating in a most peculiar way.","msgtype":"m.text"},"counts":{"missed_calls":1,"unread":2},"devices":[{"app_id":"org.matrix.matrixConsole.ios","data":{},"pushkey":"https://ntfy.example.com/upABCDEFGHI?up=1","pushkey_ts":12345678,"tweaks":{"sound":"bing"}}],"event_id":"$3957tyerfgewrf384","prio":"high","room_alias":"#exampleroom:matrix.org","room_id":"!slw48wfj34rtnrf:example.com","room_name":"Mission Control","sender":"@exampleuser:matrix.org","sender_display_name":"Major Tom","type":"m.room.message"}}` | 	body := `{"notification":{"content":{"body":"I'm floating in a most peculiar way.","msgtype":"m.text"},"counts":{"missed_calls":1,"unread":2},"devices":[{"app_id":"org.matrix.matrixConsole.ios","data":{},"pushkey":"https://ntfy.example.com/upABCDEFGHI?up=1","pushkey_ts":12345678,"tweaks":{"sound":"bing"}}],"event_id":"$3957tyerfgewrf384","prio":"high","room_alias":"#exampleroom:matrix.org","room_id":"!slw48wfj34rtnrf:example.com","room_name":"Mission Control","sender":"@exampleuser:matrix.org","sender_display_name":"Major Tom","type":"m.room.message"}}` | ||||||
| 	r, _ := http.NewRequest("POST", "http://ntfy.example.com/_matrix/push/v1/notify", strings.NewReader(body)) | 	r, _ := http.NewRequest("POST", "http://ntfy.example.com/_matrix/push/v1/notify", strings.NewReader(body)) | ||||||
| 	_, err := newRequestFromMatrixJSON(r, baseURL, maxLength) | 	_, err := newRequestFromMatrixJSON(r, baseURL, maxLength) | ||||||
| 	matrixErr, ok := err.(*errMatrix) | 	matrixErr, ok := err.(*errMatrixPushkeyRejected) | ||||||
| 	require.True(t, ok) | 	require.True(t, ok) | ||||||
| 	require.Equal(t, "invalid request: push key must be prefixed with base URL, received push key: https://ntfy.example.com/upABCDEFGHI?up=1, configured base URL: https://ntfy.sh", matrixErr.err.Error()) | 	require.Equal(t, "push key must be prefixed with base URL, received push key: https://ntfy.example.com/upABCDEFGHI?up=1, configured base URL: https://ntfy.sh", matrixErr.Error()) | ||||||
| 	require.Equal(t, "https://ntfy.example.com/upABCDEFGHI?up=1", matrixErr.pushKey) | 	require.Equal(t, "https://ntfy.example.com/upABCDEFGHI?up=1", matrixErr.rejectedPushKey) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestMatrix_WriteMatrixDiscoveryResponse(t *testing.T) { | func TestMatrix_WriteMatrixDiscoveryResponse(t *testing.T) { | ||||||
|  | @ -71,10 +69,8 @@ func TestMatrix_WriteMatrixDiscoveryResponse(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| func TestMatrix_WriteMatrixError(t *testing.T) { | func TestMatrix_WriteMatrixError(t *testing.T) { | ||||||
| 	w := httptest.NewRecorder() | 	w := httptest.NewRecorder() | ||||||
| 	r, _ := http.NewRequest("POST", "http://ntfy.example.com/_matrix/push/v1/notify", nil) | 	require.Nil(t, writeMatrixResponse(w, "https://ntfy.example.com/upABCDEFGHI?up=1")) | ||||||
| 	v := newVisitor(newTestConfig(t), nil, nil, netip.MustParseAddr("1.2.3.4"), nil) | 	require.Equal(t, 200, w.Result().StatusCode) | ||||||
| 	require.Nil(t, writeMatrixError(w, r, v, &errMatrix{"https://ntfy.example.com/upABCDEFGHI?up=1", errHTTPBadRequestMatrixPushkeyBaseURLMismatch})) |  | ||||||
| 	require.Equal(t, 400, w.Result().StatusCode) |  | ||||||
| 	require.Equal(t, `{"rejected":["https://ntfy.example.com/upABCDEFGHI?up=1"]}`+"\n", w.Body.String()) | 	require.Equal(t, `{"rejected":["https://ntfy.example.com/upABCDEFGHI?up=1"]}`+"\n", w.Body.String()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1231,7 +1231,7 @@ func TestServer_MatrixGateway_Push_Success(t *testing.T) { | ||||||
| 	s := newTestServer(t, newTestConfig(t)) | 	s := newTestServer(t, newTestConfig(t)) | ||||||
| 
 | 
 | ||||||
| 	response := request(t, s, "GET", "/mytopic/json?poll=1", "", map[string]string{ | 	response := request(t, s, "GET", "/mytopic/json?poll=1", "", map[string]string{ | ||||||
| 		"Rate-Topics": "mytopic", | 		"Rate-Topics": "mytopic", // Register first! | ||||||
| 	}) | 	}) | ||||||
| 	require.Equal(t, 200, response.Code) | 	require.Equal(t, 200, response.Code) | ||||||
| 
 | 
 | ||||||
|  | @ -1251,17 +1251,15 @@ func TestServer_MatrixGateway_Push_Failure_NoSubscriber(t *testing.T) { | ||||||
| 	notification := `{"notification":{"devices":[{"pushkey":"http://127.0.0.1:12345/mytopic?up=1"}]}}` | 	notification := `{"notification":{"devices":[{"pushkey":"http://127.0.0.1:12345/mytopic?up=1"}]}}` | ||||||
| 	response := request(t, s, "POST", "/_matrix/push/v1/notify", notification, nil) | 	response := request(t, s, "POST", "/_matrix/push/v1/notify", notification, nil) | ||||||
| 	require.Equal(t, 507, response.Code) | 	require.Equal(t, 507, response.Code) | ||||||
| 	require.Equal(t, `{"rejected":[]}`+"\n", response.Body.String()) | 	require.Equal(t, 50701, toHTTPError(t, response.Body.String()).Code) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestServer_MatrixGateway_Push_Failure_InvalidPushkey(t *testing.T) { | func TestServer_MatrixGateway_Push_Failure_InvalidPushkey(t *testing.T) { | ||||||
| 	s := newTestServer(t, newTestConfig(t)) | 	s := newTestServer(t, newTestConfig(t)) | ||||||
| 	notification := `{"notification":{"devices":[{"pushkey":"http://wrong-base-url.com/mytopic?up=1"}]}}` | 	notification := `{"notification":{"devices":[{"pushkey":"http://wrong-base-url.com/mytopic?up=1"}]}}` | ||||||
| 	response := request(t, s, "POST", "/_matrix/push/v1/notify", notification, nil) | 	response := request(t, s, "POST", "/_matrix/push/v1/notify", notification, nil) | ||||||
| 	require.Equal(t, 400, response.Code) | 	require.Equal(t, 200, response.Code) | ||||||
| 	require.Equal(t, `{"rejected":["http://wrong-base-url.com/mytopic?up=1"]}`+"\n", response.Body.String()) | 	require.Equal(t, `{"rejected":["http://wrong-base-url.com/mytopic?up=1"]}`+"\n", response.Body.String()) | ||||||
| 	require.Equal(t, "40020", response.Header().Get("X-Ntfy-Error-Code")) |  | ||||||
| 	require.Equal(t, "invalid request: push key must be prefixed with base URL, received push key: http://wrong-base-url.com/mytopic?up=1, configured base URL: http://127.0.0.1:12345", response.Header().Get("X-Ntfy-Error-Message")) |  | ||||||
| 
 | 
 | ||||||
| 	response = request(t, s, "GET", "/mytopic/json?poll=1", "", nil) | 	response = request(t, s, "GET", "/mytopic/json?poll=1", "", nil) | ||||||
| 	require.Equal(t, 200, response.Code) | 	require.Equal(t, 200, response.Code) | ||||||
|  | @ -1273,9 +1271,12 @@ func TestServer_MatrixGateway_Push_Failure_EverythingIsWrong(t *testing.T) { | ||||||
| 	notification := `{"message":"this is not really a Matrix message"}` | 	notification := `{"message":"this is not really a Matrix message"}` | ||||||
| 	response := request(t, s, "POST", "/_matrix/push/v1/notify", notification, nil) | 	response := request(t, s, "POST", "/_matrix/push/v1/notify", notification, nil) | ||||||
| 	require.Equal(t, 400, response.Code) | 	require.Equal(t, 400, response.Code) | ||||||
| 	err := toHTTPError(t, response.Body.String()) | 	require.Equal(t, 40019, toHTTPError(t, response.Body.String()).Code) | ||||||
| 	require.Equal(t, 40019, err.Code) | 
 | ||||||
| 	require.Equal(t, 400, err.HTTPCode) | 	notification = `this isn't even JSON'` | ||||||
|  | 	response = request(t, s, "POST", "/_matrix/push/v1/notify", notification, nil) | ||||||
|  | 	require.Equal(t, 400, response.Code) | ||||||
|  | 	require.Equal(t, 40019, toHTTPError(t, response.Body.String()).Code) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestServer_MatrixGateway_Push_Failure_Unconfigured(t *testing.T) { | func TestServer_MatrixGateway_Push_Failure_Unconfigured(t *testing.T) { | ||||||
|  | @ -1285,9 +1286,7 @@ func TestServer_MatrixGateway_Push_Failure_Unconfigured(t *testing.T) { | ||||||
| 	notification := `{"notification":{"devices":[{"pushkey":"http://127.0.0.1:12345/mytopic?up=1"}]}}` | 	notification := `{"notification":{"devices":[{"pushkey":"http://127.0.0.1:12345/mytopic?up=1"}]}}` | ||||||
| 	response := request(t, s, "POST", "/_matrix/push/v1/notify", notification, nil) | 	response := request(t, s, "POST", "/_matrix/push/v1/notify", notification, nil) | ||||||
| 	require.Equal(t, 500, response.Code) | 	require.Equal(t, 500, response.Code) | ||||||
| 	err := toHTTPError(t, response.Body.String()) | 	require.Equal(t, 50003, toHTTPError(t, response.Body.String()).Code) | ||||||
| 	require.Equal(t, 50003, err.Code) |  | ||||||
| 	require.Equal(t, 500, err.HTTPCode) |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestServer_PublishActions_AndPoll(t *testing.T) { | func TestServer_PublishActions_AndPoll(t *testing.T) { | ||||||
|  | @ -2077,7 +2076,7 @@ func TestServer_Matrix_SubscriberRateLimiting_UP_Only(t *testing.T) { | ||||||
| 		} | 		} | ||||||
| 		response := request(t, s, "POST", "/_matrix/push/v1/notify", notification, nil) | 		response := request(t, s, "POST", "/_matrix/push/v1/notify", notification, nil) | ||||||
| 		require.Equal(t, 429, response.Code, notification) | 		require.Equal(t, 429, response.Code, notification) | ||||||
| 		require.Equal(t, `{"rejected":[]}`+"\n", response.Body.String()) | 		require.Equal(t, 42901, toHTTPError(t, response.Body.String()).Code) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue