ppy/osu · error · NotSupportedException

Beatmap submission not supported in this configuration!

Error message

Beatmap submission not supported in this configuration!

What it means

Thrown by ReplaceBeatmapPackageRequest.Uri getter when API.Endpoints.BeatmapSubmissionServiceUrl is null. This request replaces an entire beatmapset's package (PUT /beatmapsets/{id}); the same production-rollout guard as the other submission requests applies. NotSupportedException indicates feature unavailability.

Source

Thrown at osu.Game/Online/API/Requests/ReplaceBeatmapPackageRequest.cs:18

// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.

using System;
using System.Net.Http;
using osu.Framework.IO.Network;

namespace osu.Game.Online.API.Requests
{
    public class ReplaceBeatmapPackageRequest : APIUploadRequest
    {
        protected override string Uri
        {
            get
            {
                // can be removed once the service has been successfully deployed to production
                if (API!.Endpoints.BeatmapSubmissionServiceUrl == null)
                    throw new NotSupportedException("Beatmap submission not supported in this configuration!");

                return $@"{API!.Endpoints.BeatmapSubmissionServiceUrl}/beatmapsets/{BeatmapSetID}";
            }
        }

        protected override string Target => throw new NotSupportedException();

        public uint BeatmapSetID { get; }

        private readonly byte[] oszPackage;

        public ReplaceBeatmapPackageRequest(uint beatmapSetID, byte[] oszPackage)
        {
            this.oszPackage = oszPackage;
            BeatmapSetID = beatmapSetID;
        }

        protected override WebRequest CreateWebRequest()

View on GitHub (pinned to d9c73e12ad)

Solutions

  1. Configure API.Endpoints.BeatmapSubmissionServiceUrl to enable the submission service.
  2. Hide/disable the replace-submission control when the URL is null.
  3. After production deployment, remove the guard as the comment indicates.

Example fix

// before
var req = new ReplaceBeatmapPackageRequest(beatmapSetId, oszBytes);
api.Perform(req); // NotSupportedException

// after
if (api.Endpoints.BeatmapSubmissionServiceUrl == null)
{
    Notifications.Post(new SimpleNotification { Text = "Beatmap submission is unavailable in this build." });
    return;
}
var req = new ReplaceBeatmapPackageRequest(beatmapSetId, oszBytes);
api.Perform(req);
Defensive patterns

Strategy: validation

Validate before calling

if (api.Endpoints.BeatmapSubmissionServiceUrl == null)
{ Notifications.Post(new SimpleNotification { Text = "Beatmap submission is unavailable." }); return; }
var req = new ReplaceBeatmapPackageRequest(beatmapSetId, oszBytes);

Type guard

static bool IsSubmissionEnabled(IAPIEndpointProvider endpoints)
    => !string.IsNullOrWhiteSpace(endpoints.BeatmapSubmissionServiceUrl);

Try / catch

try { api.Perform(new ReplaceBeatmapPackageRequest(id, bytes)); }
catch (NotSupportedException ex) when (ex.Message.Contains("Beatmap submission"))
{ /* inform user the build lacks the submission endpoint */ }

Prevention

When it happens

Trigger: Constructing/performing a ReplaceBeatmapPackageRequest (full replacement upload for an existing beatmapset) with BeatmapSubmissionServiceUrl unconfigured.

Common situations: Editor 'replace submission' path active on a build without the submission service URL; dev environments; pre-production rollout where the feature flag/endpoint isn't set.

Related errors


AI-assisted analysis of ppy/osu@d9c73e12ad (2026-08-13). Data as JSON: /api/errors/ec5cce3b2ad3c5a3. Report an issue: GitHub.