paho.mqtt.java icon indicating copy to clipboard operation
paho.mqtt.java copied to clipboard

MqttTopic.publish() drops UserProperties

Open AcidSepp opened this issue 3 years ago • 0 comments

Please fill out the form below before submitting, thank you!

  • [x] Bug exists Release Version 1.2.5 ( Master Branch)
  • [ ] Bug exists in MQTTv3 Client on Snapshot Version 1.2.6-SNAPSHOT (Develop Branch)
  • [x] Bug exists in MQTTv5 Client on Snapshot Version 1.2.6-SNAPSHOT (Develop Branch)

Expected behaviour

MqttTopic.publish(...) correctly sends the user properties

Actual behaviour

MqttTopic.publish(...) does not send user properties

Reproducer

public class Publisher {

    public static void main(final String[] args) throws MqttException {
        MqttClient client = new MqttClient("tcp://localhost:1883", "my-client");
        client.connect();

        MqttTopic topic = client.getTopic("prop/topic");

        MqttMessage message = new MqttMessage("test".getBytes(StandardCharsets.UTF_8));
        MqttProperties proper = new MqttProperties();

        List<UserProperty> userProperties = new ArrayList<>();
        UserProperty header1 = new UserProperty("name1", "value1");
        UserProperty header2 = new UserProperty("name1", "value2");
        UserProperty header3 = new UserProperty("name2", "value3");
        userProperties.add(header1);
        userProperties.add(header2);
        userProperties.add(header3);
        proper.setUserProperties(userProperties);

        message.setProperties(proper);
        message.setQos(1);

        topic.publish(message);
    }
}

Problem

I think this problem happens because the method MqttTopic.publish() creates a new MqttProperties instead of taking the one provided by message:

	public MqttToken publish(MqttMessage message) throws MqttException, MqttPersistenceException {
		MqttToken token = new MqttToken(comms.getClient().getClientId());
                token.internalTok.setDeliveryToken(true);
		token.setMessage(message);
		comms.sendNoWait(createPublish(message, new MqttProperties()), token);
		token.internalTok.waitUntilSent();
		return token;
	}

AcidSepp avatar Jun 02 '22 15:06 AcidSepp