shamblett / coap

A Coap package for dart
Other
16 stars 13 forks source link

Multiple CoapConfig causes null pointer exception #72

Closed JosefWN closed 2 years ago

JosefWN commented 2 years ago

This limitation should perhaps at least be documented, better yet fixed for those who run multiple clients and want to use a base config as starting point.

Steps to reproduce:

FutureOr<void> main(List<String> args) async {
  // intended for client1
  final conf1 = CoapConfig();
  // intended for client2, default config but different port (example)
  final conf2 = CoapConfig()..defaultPort = 1234;

  final uri = Uri(scheme: 'coap', host: 'coap.me', port: conf1.defaultPort);
  final client1 = CoapClient(uri, conf1);

  final request = CoapRequest.newGet();
  request.addUriPath('large');
  client1.request = request;

  await client1.get();

  client1.close();
}

Output:

Unhandled exception:
Null check operator used on a null value
#0      CoapEndPoint._serializeRequest (package:coap/src/net/coap_endpoint.dart:230:28)
#1      CoapEndPoint.sendRequest (package:coap/src/net/coap_endpoint.dart:185:21)
#2      CoapStackBottomLayer.sendRequest (package:coap/src/stack/coap_layer_stack.dart:116:23)
#3      CoapNextLayer.sendRequest (package:coap/src/stack/coap_layer_stack.dart:20:10)
#4      CoapAbstractLayer.sendRequest (package:coap/src/stack/coap_abstract_layer.dart:18:15)
#5      CoapReliabilityLayer.sendRequest (package:coap/src/stack/coap_reliability_layer.dart:140:11)
#6      CoapNextLayer.sendRequest (package:coap/src/stack/coap_layer_stack.dart:20:10)
#7      CoapAbstractLayer.sendRequest (package:coap/src/stack/coap_abstract_layer.dart:18:15)
#8      CoapTokenLayer.sendRequest (package:coap/src/stack/coap_token_layer.dart:28:11)
#9      CoapNextLayer.sendRequest (package:coap/src/stack/coap_layer_stack.dart:20:10)
#10     CoapAbstractLayer.sendRequest (package:coap/src/stack/coap_abstract_layer.dart:18:15)
#11     CoapBlockwiseLayer.sendRequest (package:coap/src/stack/coap_blockwise_layer.dart:57:13)
#12     CoapNextLayer.sendRequest (package:coap/src/stack/coap_layer_stack.dart:20:10)
#13     CoapAbstractLayer.sendRequest (package:coap/src/stack/coap_abstract_layer.dart:18:15)
#14     CoapNextLayer.sendRequest (package:coap/src/stack/coap_layer_stack.dart:20:10)
#15     CoapAbstractLayer.sendRequest (package:coap/src/stack/coap_abstract_layer.dart:18:15)
#16     CoapStackTopLayer.sendRequest (package:coap/src/stack/coap_layer_stack.dart:71:11)
#17     CoapLayerStack.sendRequest (package:coap/src/stack/coap_layer_stack.dart:142:18)
#18     CoapEndPoint.sendEpRequest.<anonymous closure> (package:coap/src/net/coap_endpoint.dart:89:37)
#19     CoapExecutor.start.<anonymous closure> (package:coap/src/threading/coap_executor.dart:18:11)
#20     _Executor.scheduleTask (package:executor/src/executor_impl.dart:61:29)
<asynchronous suspension>

Workaround, set spec manually:

final CoapConfig coapConfig = CoapConfig()
  ..spec = CoapRfc7252();
JosefWN commented 2 years ago

Fixed