{"record":{"id":"74f5eacc201b0f2d","repo":"instructure/canvas-lms","slug":"unsupported-message-type-message-type","errorCode":null,"errorMessage":"Unsupported message type: #{message_type}","messagePattern":"Unsupported message type: #(.+?)","errorType":"exception","errorClass":null,"httpStatus":500,"severity":"error","filePath":"app/controllers/lti/launch_services.rb","lineNumber":73,"sourceCode":"\n      log_launch(\n        message_type:,\n        launch_type: log_launch_type,\n        launch_url: lti_launch.params[\"target_link_uri\"]\n      )\n      lti_launch\n    end\n\n    def build_jwt_message(adapter, message_type)\n      case message_type\n      when LtiAdvantage::Messages::AssetProcessorSettingsRequest::MESSAGE_TYPE\n        adapter.generate_post_payload_for_asset_processor_settings\n      when LtiAdvantage::Messages::ReportReviewRequest::MESSAGE_TYPE\n        adapter.generate_post_payload_for_report_review\n      when LtiAdvantage::Messages::EulaRequest::MESSAGE_TYPE\n        adapter.generate_post_payload_for_eula\n      else\n        raise \"Unsupported message type: #{message_type}\"\n      end\n    end\n\n    def create_lti_adapter(return_url:, lti_launch:, opts: {}, expander_opts: {})\n      default_opts = {\n        domain: HostUrl.context_host(@domain_root_account, request.host)\n      }\n\n      Lti::LtiAdvantageAdapter.new(\n        tool:,\n        user: @current_user,\n        context:,\n        return_url:,\n        expander: create_variable_expander(lti_launch:, expander_opts:),\n        include_storage_target: !in_lti_mobile_webview?,\n        opts: default_opts.merge(opts)\n      )\n    end","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/app/controllers/lti/launch_services.rb#L55-L91","documentation":"Lti::LaunchServices#build_jwt_message switches on the message type to pick a payload generator on the adapter; any message_type outside the explicitly supported list falls through to a generic RuntimeError. This guards the LTI Advantage JWT message pipeline against message types Canvas cannot build.","triggerScenarios":"Calling create_and_log_launch with a message_type not in the case list (e.g. a custom or newly introduced LtiAdvantage::Messages::* type whose adapter generator branch was not added), or a mistyped/nil message_type string.","commonSituations":"Upgrading lti-advantage gem adds a new message type (e.g. a newer AGS/Proctoring type) before Canvas's launch service learns about it; plugins or custom code request an unregistered message type; typo in MESSAGE_TYPE constant.","solutions":["Add a when branch for the new message type mapping to the matching adapter generator method.","Verify the message_type passed to build_jwt_message equals one of the supported LtiAdvantage::Messages::*::MESSAGE_TYPE constants.","If a new type is needed, extend the LTI adapter with the corresponding generate_post_payload_for_* method.","Rescue in create_and_log_launch and return 422/400 for unsupported types instead of a 500."],"exampleFix":"// before\nraise \"Unsupported message type: #{message_type}\"\n// after\nwhen LtiAdvantage::Messages::LineItemCreateRequest::MESSAGE_TYPE\n  adapter.generate_post_payload_for_line_item\nelse\n  raise \"Unsupported message type: #{message_type}\"","handlingStrategy":"validation","validationCode":"SUPPORTED = LtiAdvantage::Messages.constants.map { |c| \"LtiAdvantage::Messages::#{c}\".constantize.try(:MESSAGE_TYPE) }\nraise ArgumentError, message_type unless SUPPORTED.include?(message_type)","typeGuard":"def supported_message_type?(type)\n  [LtiAdvantage::Messages::ReportReviewRequest::MESSAGE_TYPE,\n   LtiAdvantage::Messages::EulaRequest::MESSAGE_TYPE].include?(type)\nend","tryCatchPattern":"begin\n  build_jwt_message(message_type, ...)\nrescue RuntimeError => e\n  raise UnsupportedMessageType, e.message if e.message.start_with?('Unsupported message type:')\n  raise\nend","preventionTips":["Only pass MESSAGE_TYPE constants, never hand-written strings.","When upgrading lti-advantage, audit new message types and add case branches.","Register custom message types before requesting them.","Fail fast with a typed error instead of the generic RuntimeError."],"tags":["lti","jwt-message","unsupported-type"],"backgroundTag":"unsupported-enum-value","analyzedSha":"1c9f0bb8013ed69c4f2efe11fd483025469b7e6c","analyzedAt":"2026-09-15T20:33:18.891Z","contentChangedAt":"2026-09-15T20:33:18.891Z","schemaVersion":2},"datasetVersion":"2026-09-23T02:17:17.105Z"}