From fafdb01283bf23713b48ca0f925822279ece007c Mon Sep 17 00:00:00 2001 From: JosefWN Date: Mon, 26 Jun 2023 11:16:36 +0200 Subject: [PATCH] Merge pull request #181 * URI tweaks --- README.md | 4 +- example/cancel_request.dart | 12 +- example/delete_resource.dart | 8 +- example/discover_resources.dart | 6 +- example/get_blockwise.dart | 8 +- example/get_max_retransmit.dart | 9 +- example/get_observe_async.dart | 24 ++-- example/get_resource.dart | 20 +-- example/get_resource_multicast.dart | 2 +- example/get_resource_secure.dart | 20 +-- example/log_events.dart | 9 +- example/multi_client.dart | 4 +- example/ping.dart | 6 +- example/post_blockwise.dart | 14 +- example/post_resource.dart | 12 +- example/put_resource.dart | 13 +- example/sync_vs_async.dart | 10 +- lib/src/coap_client.dart | 159 ++++++++-------------- lib/src/coap_constants.dart | 4 +- lib/src/coap_observe_client_relation.dart | 2 +- lib/src/coap_request.dart | 16 +-- lib/src/stack/layers/observe.dart | 2 +- 22 files changed, 164 insertions(+), 200 deletions(-) diff --git a/README.md b/README.md index 4f28e640..d010da37 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ The CoAP library is an implementation in Dart providing a CoAP client, the code ```dart FutureOr main() async { final conf = CoapConfig(); - final uri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); - final client = CoapClient(uri, conf); + final baseUri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); + final client = CoapClient(baseUri, conf); try { final response = diff --git a/example/cancel_request.dart b/example/cancel_request.dart index a7ba86e8..4e20f64c 100644 --- a/example/cancel_request.dart +++ b/example/cancel_request.dart @@ -15,17 +15,17 @@ import 'config/coap_config.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); - final client = CoapClient(uri, config: conf); + final baseUri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); + final client = CoapClient(baseUri, config: conf); - final cancelThisReq = CoapRequest.newGet(uri.replace(path: 'doesNotExist')); + final cancelThisReq = CoapRequest.get(Uri(path: 'doesNotExist')); try { // Ensure this request is not also cancelled - print('Sending async get /hello to ${uri.host}'); - final helloRespFuture = client.get('hello'); + print('Sending async get /hello to ${baseUri.host}'); + final helloRespFuture = client.get(Uri(path: 'hello')); - print('Sending async get /doesNotExist to ${uri.host}'); + print('Sending async get /doesNotExist to ${baseUri.host}'); final ignoreThisFuture = client.send(cancelThisReq); print('Cancelling get /doesNotExist retries'); diff --git a/example/delete_resource.dart b/example/delete_resource.dart index 4ece2981..da451232 100644 --- a/example/delete_resource.dart +++ b/example/delete_resource.dart @@ -15,16 +15,16 @@ import 'config/coap_config.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri( + final baseUri = Uri( scheme: 'coap', host: 'californium.eclipseprojects.io', port: conf.defaultPort, ); - final client = CoapClient(uri, config: conf); + final client = CoapClient(baseUri, config: conf); try { - print('Sending delete /test to ${uri.host}'); - final response = await client.delete('test'); + print('Sending delete /test to ${baseUri.host}'); + final response = await client.delete(Uri(path: 'test')); print('/test response status: ${response.statusCodeString}'); } on Exception catch (e) { diff --git a/example/discover_resources.dart b/example/discover_resources.dart index af273395..3df2a2ef 100644 --- a/example/discover_resources.dart +++ b/example/discover_resources.dart @@ -15,11 +15,11 @@ import 'config/coap_config.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); - final client = CoapClient(uri, config: conf); + final baseUri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); + final client = CoapClient(baseUri, config: conf); try { - print('Sending get /discover/.well-known/core to ${uri.host}'); + print('Sending get /discover/.well-known/core to ${baseUri.host}'); final links = await client.discover(); print('Discovered resources:'); diff --git a/example/get_blockwise.dart b/example/get_blockwise.dart index 2e0f478b..2ace3ae1 100644 --- a/example/get_blockwise.dart +++ b/example/get_blockwise.dart @@ -15,12 +15,12 @@ import 'config/coap_config.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); - final client = CoapClient(uri, config: conf); + final baseUri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); + final client = CoapClient(baseUri, config: conf); try { - print('Sending get /large to ${uri.host}'); - final response = await client.get('large'); + print('Sending get /large to ${baseUri.host}'); + final response = await client.get(Uri(path: 'large')); print('/large response: ${response.payloadString}'); } on Exception catch (e) { diff --git a/example/get_max_retransmit.dart b/example/get_max_retransmit.dart index f4503c1b..5a64e623 100644 --- a/example/get_max_retransmit.dart +++ b/example/get_max_retransmit.dart @@ -15,12 +15,13 @@ import './config/coap_config.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri(scheme: 'coap', host: 'google.com', port: conf.defaultPort); - final client = CoapClient(uri, config: conf); + final baseUri = + Uri(scheme: 'coap', host: 'google.com', port: conf.defaultPort); + final client = CoapClient(baseUri, config: conf); print('maxRetransmit config: ${conf.maxRetransmit}'); - final request = CoapRequest.newGet(uri.replace(path: 'doesNotExist')); + final request = CoapRequest.get(Uri(path: 'doesNotExist')); print('maxRetransmit request: ${request.maxRetransmit} (0=config default)'); try { @@ -28,7 +29,7 @@ FutureOr main() async { request.maxRetransmit = 2; print('maxRetransmit altered request: ${request.maxRetransmit}'); - print('Sending get /doesNotExist to ${uri.host}'); + print('Sending get /doesNotExist to ${baseUri.host}'); print('Waiting for timeout, this might take a while...'); final resp = await client.send(request); diff --git a/example/get_observe_async.dart b/example/get_observe_async.dart index b79c1b28..c6891b26 100644 --- a/example/get_observe_async.dart +++ b/example/get_observe_async.dart @@ -15,53 +15,53 @@ import 'config/coap_config.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri( + final baseUri = Uri( scheme: 'coap', host: 'californium.eclipseprojects.io', port: conf.defaultPort, ); - final client = CoapClient(uri, config: conf); + final client = CoapClient(baseUri, config: conf); // Create the request for the get request - final reqObs = CoapRequest.newGet(uri.replace(path: 'obs')); + final reqObs = CoapRequest.get(Uri(path: 'obs')); try { - print('Observing /obs on ${uri.host}'); + print('Observing /obs on ${baseUri.host}'); final obs = await client.observe(reqObs); obs.listen((final e) { print('/obs response: ${e.payloadString}'); }); final reqObsNon = CoapRequest( - uri.replace(path: 'obs-non'), + Uri(path: 'obs-non'), RequestMethod.get, confirmable: false, ); - print('Observing /obs-non on ${uri.host}'); + print('Observing /obs-non on ${baseUri.host}'); final obsNon = await client.observe(reqObsNon); obsNon.listen((final e) { print('/obs-non response: ${e.payloadString}'); }); final futures = >[]; - print('Sending get /large to ${uri.host}'); + print('Sending get /large to ${baseUri.host}'); futures.add( - client.get('large').then( + client.get(Uri(path: 'large')).then( (final resp) => print('/large response: ${resp.payloadString}'), ), ); - print('Sending get /test to ${uri.host}'); + print('Sending get /test to ${baseUri.host}'); futures.add( client - .get('test') + .get(Uri(path: 'test')) .then((final resp) => print('/test response: ${resp.payloadString}')), ); - print('Sending get /separate to ${uri.host}'); + print('Sending get /separate to ${baseUri.host}'); futures.add( - client.get('separate').then( + client.get(Uri(path: 'separate')).then( (final resp) => print('/separate response: ${resp.payloadString}'), ), ); diff --git a/example/get_resource.dart b/example/get_resource.dart index 54dff37d..848617a5 100644 --- a/example/get_resource.dart +++ b/example/get_resource.dart @@ -15,21 +15,23 @@ import 'config/coap_config.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); - final client = CoapClient(uri, config: conf); + final baseUri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); + final client = CoapClient(baseUri, config: conf); try { - print('Sending get /test to ${uri.host}'); - var response = await client.get('test'); + print('Sending get /test to ${baseUri.host}'); + var response = await client.get(Uri(path: 'test')); print('/test response: ${response.payloadString}'); - print('Sending get /multi-format (text) to ${uri.host}'); - response = await client.get('multi-format'); + print('Sending get /multi-format (text) to ${baseUri.host}'); + response = await client.get(Uri(path: 'multi-format')); print('/multi-format (text) response: ${response.payloadString}'); - print('Sending get /multi-format (xml) to ${uri.host}'); - response = - await client.get('multi-format', accept: CoapMediaType.applicationXml); + print('Sending get /multi-format (xml) to ${baseUri.host}'); + response = await client.get( + Uri(path: 'multi-format'), + accept: CoapMediaType.applicationXml, + ); print('/multi-format (xml) response: ${response.payloadString}'); } on Exception catch (e) { print('CoAP encountered an exception: $e'); diff --git a/example/get_resource_multicast.dart b/example/get_resource_multicast.dart index 2be9083d..9ad36b1c 100644 --- a/example/get_resource_multicast.dart +++ b/example/get_resource_multicast.dart @@ -21,7 +21,7 @@ FutureOr main() async { final client = CoapClient(uri); try { - final request = CoapRequest.newGet(uri.replace(path: '/.well-known/core')); + final request = CoapRequest.get(Uri(path: '/.well-known/core')); await for (final response in client.sendMulticast(request)) { print(response.payloadString); diff --git a/example/get_resource_secure.dart b/example/get_resource_secure.dart index 1a92bfdc..669fefd7 100644 --- a/example/get_resource_secure.dart +++ b/example/get_resource_secure.dart @@ -34,29 +34,31 @@ class DtlsConfig extends DefaultCoapConfig { FutureOr main() async { final conf = DtlsConfig(); - final uri = Uri( + final baseUri = Uri( scheme: 'coaps', host: 'californium.eclipseprojects.io', port: conf.defaultSecurePort, ); final client = CoapClient( - uri, + baseUri, config: conf, pskCredentialsCallback: pskCredentialsCallback, ); try { - print('Sending get /test to ${uri.host}'); - var response = await client.get('test'); + print('Sending get /test to ${baseUri.host}'); + var response = await client.get(Uri(path: 'test')); print('/test response: ${response.payloadString}'); - print('Sending get /multi-format (text) to ${uri.host}'); - response = await client.get('multi-format'); + print('Sending get /multi-format (text) to ${baseUri.host}'); + response = await client.get(Uri(path: 'multi-format')); print('/multi-format (text) response: ${response.payloadString}'); - print('Sending get /multi-format (xml) to ${uri.host}'); - response = - await client.get('multi-format', accept: CoapMediaType.applicationXml); + print('Sending get /multi-format (xml) to ${baseUri.host}'); + response = await client.get( + Uri(path: 'multi-format'), + accept: CoapMediaType.applicationXml, + ); print('/multi-format (xml) response: ${response.payloadString}'); } on Exception catch (e) { print('CoAP encountered an exception: $e'); diff --git a/example/log_events.dart b/example/log_events.dart index 64aa0d68..d3f10745 100644 --- a/example/log_events.dart +++ b/example/log_events.dart @@ -16,8 +16,8 @@ import 'utils.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); - final client = CoapClient(uri, config: conf); + final baseUri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); + final client = CoapClient(baseUri, config: conf); final opt = UriQueryOption( '${LinkFormatParameter.title.short}=This is an SJH Post request', @@ -30,8 +30,9 @@ FutureOr main() async { print('Listening to the internal request/response event stream'); client.events.on().listen(print); - print('Sending post /large-create to ${uri.host}'); - await client.post('large-create', payload: payload, options: [opt]); + print('Sending post /large-create to ${baseUri.host}'); + await client + .post(Uri(path: 'large-create'), payload: payload, options: [opt]); } on Exception catch (e) { print('CoAP encountered an exception: $e'); } diff --git a/example/multi_client.dart b/example/multi_client.dart index 74ec24e7..e44ab69f 100644 --- a/example/multi_client.dart +++ b/example/multi_client.dart @@ -28,11 +28,11 @@ FutureOr main() async { try { print('Sending get /hello to ${uri1.host}'); - var response = await client1.get('hello'); + var response = await client1.get(Uri(path: 'hello')); print('/hello response: ${response.payloadString}'); print('Sending get /test to ${uri2.host}'); - response = await client2.get('test'); + response = await client2.get(Uri(path: 'test')); print('/test response: ${response.payloadString}'); } on Exception catch (e) { print('CoAP encountered an exception: $e'); diff --git a/example/ping.dart b/example/ping.dart index e0619ceb..f47fceee 100644 --- a/example/ping.dart +++ b/example/ping.dart @@ -15,15 +15,15 @@ import 'config/coap_config.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri( + final baseUri = Uri( scheme: 'coap', host: 'californium.eclipseprojects.io', port: conf.defaultPort, ); - final client = CoapClient(uri, config: conf); + final client = CoapClient(baseUri, config: conf); try { - print('Pinging client on ${uri.host}'); + print('Pinging client on ${baseUri.host}'); final ok = await client.ping(); if (ok) { print('Ping successful'); diff --git a/example/post_blockwise.dart b/example/post_blockwise.dart index a75d17e5..a24c36a8 100644 --- a/example/post_blockwise.dart +++ b/example/post_blockwise.dart @@ -16,8 +16,8 @@ import 'utils.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); - final client = CoapClient(uri, config: conf); + final baseUri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); + final client = CoapClient(baseUri, config: conf); final opt = UriQueryOption( '${LinkFormatParameter.title.short}=This is an SJH Post request', @@ -27,13 +27,13 @@ FutureOr main() async { final payload = getRandomString(length: 2000); try { - print('Sending post /large-create to ${uri.host}'); - var response = - await client.post('large-create', payload: payload, options: [opt]); + print('Sending post /large-create to ${baseUri.host}'); + var response = await client + .post(Uri(path: 'large-create'), payload: payload, options: [opt]); print('/large-create response status: ${response.statusCodeString}'); - print('Sending get /large-create to ${uri.host}'); - response = await client.get('large-create'); + print('Sending get /large-create to ${baseUri.host}'); + response = await client.get(Uri(path: 'large-create')); print('/large-create response:\n${response.payloadString}'); print('E-Tags : ${response.etags.join(',')}'); } on Exception catch (e) { diff --git a/example/post_resource.dart b/example/post_resource.dart index c58beb58..3172c864 100644 --- a/example/post_resource.dart +++ b/example/post_resource.dart @@ -15,17 +15,17 @@ import 'config/coap_config.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); - final client = CoapClient(uri, config: conf); + final baseUri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); + final client = CoapClient(baseUri, config: conf); final opt = UriQueryOption( '${LinkFormatParameter.title.short}=This is an SJH Post request', ); try { - print('Sending post /large-create to ${uri.host}'); + print('Sending post /large-create to ${baseUri.host}'); var response = await client.post( - 'large-create', + Uri(path: 'large-create'), options: [opt], payload: 'SJHTestPost', ); @@ -33,8 +33,8 @@ FutureOr main() async { final resourceLocationPath = response.location.path; print('Resource created under $resourceLocationPath'); - print('Sending get $resourceLocationPath to ${uri.host}'); - response = await client.get(resourceLocationPath); + print('Sending get $resourceLocationPath to ${baseUri.host}'); + response = await client.get(Uri(path: resourceLocationPath)); print('$resourceLocationPath response: ${response.payloadString}'); print('E-Tags : ${response.etags.join(',')}'); } on Exception catch (e) { diff --git a/example/put_resource.dart b/example/put_resource.dart index da5272f9..1a023fe5 100644 --- a/example/put_resource.dart +++ b/example/put_resource.dart @@ -15,17 +15,20 @@ import 'config/coap_config.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); - final client = CoapClient(uri, config: conf); + final baseUri = Uri(scheme: 'coap', host: 'coap.me', port: conf.defaultPort); + final client = CoapClient(baseUri, config: conf); final opt = UriQueryOption( '${LinkFormatParameter.title.short}=This is an SJH Put request', ); try { - print('Sending put /create1 to ${uri.host}'); - final response = - await client.put('create1', options: [opt], payload: 'SJHTestPut'); + print('Sending put /create1 to ${baseUri.host}'); + final response = await client.put( + Uri(path: 'create1'), + options: [opt], + payload: 'SJHTestPut', + ); print('/create1 response status: ${response.statusCodeString}'); } on Exception catch (e) { print('CoAP encountered an exception: $e'); diff --git a/example/sync_vs_async.dart b/example/sync_vs_async.dart index b0b9f01c..b28b9259 100644 --- a/example/sync_vs_async.dart +++ b/example/sync_vs_async.dart @@ -15,16 +15,16 @@ import 'config/coap_config.dart'; FutureOr main() async { final conf = CoapConfig(); - final uri = Uri( + final baseUri = Uri( scheme: 'coap', host: 'californium.eclipseprojects.io', port: conf.defaultPort, ); - final client = CoapClient(uri, config: conf); + final client = CoapClient(baseUri, config: conf); try { // Warm up (create socket etc.) - await client.get('test'); + await client.get(Uri(path: 'test')); final stopwatch = Stopwatch()..start(); @@ -32,7 +32,7 @@ FutureOr main() async { final futures = >[]; for (var i = 0; i < 10; i++) { futures.add( - client.get('test').then((final resp) { + client.get(Uri(path: 'test')).then((final resp) { if (resp.responseCode != ResponseCode.content) { print('Request failed!'); } @@ -49,7 +49,7 @@ FutureOr main() async { print('Sending 10 sync requests...'); for (var i = 0; i < 10; i++) { - final resp = await client.get('test'); + final resp = await client.get(Uri(path: 'test')); if (resp.responseCode != ResponseCode.content) { print('Request failed!'); } diff --git a/lib/src/coap_client.dart b/lib/src/coap_client.dart index 554a703f..8c9eb64c 100644 --- a/lib/src/coap_client.dart +++ b/lib/src/coap_client.dart @@ -92,7 +92,7 @@ class CoapClient { /// If no [config] is provided, then an instance of the [CoapConfigDefault] /// class will be used instead. CoapClient( - this.uri, { + this.baseUri, { this.addressType = InternetAddressType.any, this.bindAddress, final PskCredentialsCallback? pskCredentialsCallback, @@ -110,7 +110,7 @@ class CoapClient { final InternetAddress? bindAddress; /// The client endpoint URI - final Uri uri; + final Uri baseUri; late final CoapEventBus _eventBus; @@ -127,7 +127,7 @@ class CoapClient { /// Performs a CoAP ping. Future ping() async { - final request = CoapRequest(uri, RequestMethod.empty) + final request = CoapRequest(baseUri, RequestMethod.empty) ..token = CoapConstants.emptyToken; await _prepare(request); _endpoint!.sendEpRequest(request); @@ -137,8 +137,7 @@ class CoapClient { /// Sends a GET request. Future get( - final String path, { - final String? query, + final Uri uri, { final CoapMediaType? accept, final bool confirmable = true, final List>? options, @@ -146,14 +145,8 @@ class CoapClient { final int maxRetransmit = 0, final CoapMulticastResponseHandler? onMulticastResponse, }) { - final request = CoapRequest.newGet( - uri.replace( - path: path, - query: query, - ), - confirmable: confirmable, - accept: accept, - ); + final request = + CoapRequest.get(uri, confirmable: confirmable, accept: accept); _build( request, options, @@ -165,9 +158,8 @@ class CoapClient { /// Sends a POST request. Future post( - final String path, { + final Uri uri, { required final String payload, - final String? query, final CoapMediaType? format, final CoapMediaType? accept, final bool confirmable = true, @@ -176,11 +168,8 @@ class CoapClient { final int maxRetransmit = 0, final CoapMulticastResponseHandler? onMulticastResponse, }) { - final request = CoapRequest.newPost( - uri.replace( - path: path, - query: query, - ), + final request = CoapRequest.post( + uri, confirmable: confirmable, accept: accept, contentFormat: format, @@ -197,9 +186,8 @@ class CoapClient { /// Sends a POST request with the specified byte payload. Future postBytes( - final String path, { + final Uri uri, { required final Iterable payload, - final String? query, final CoapMediaType? format, final CoapMediaType? accept, final bool confirmable = true, @@ -208,11 +196,8 @@ class CoapClient { final int maxRetransmit = 0, final CoapMulticastResponseHandler? onMulticastResponse, }) { - final request = CoapRequest.newPost( - uri.replace( - path: path, - query: query, - ), + final request = CoapRequest.post( + uri, confirmable: confirmable, accept: accept, contentFormat: format, @@ -229,9 +214,8 @@ class CoapClient { /// Sends a PUT request. Future put( - final String path, { + final Uri uri, { required final String payload, - final String? query, final CoapMediaType? format, final CoapMediaType? accept, final bool confirmable = true, @@ -242,11 +226,8 @@ class CoapClient { final int maxRetransmit = 0, final CoapMulticastResponseHandler? onMulticastResponse, }) { - final request = CoapRequest.newPut( - uri.replace( - path: path, - query: query, - ), + final request = CoapRequest.post( + uri, confirmable: confirmable, accept: accept, contentFormat: format, @@ -265,9 +246,8 @@ class CoapClient { /// Sends a PUT request with the specified byte payload. Future putBytes( - final String path, { + final Uri uri, { required final Iterable payload, - final String? query, final CoapMediaType? format, final MatchEtags matchEtags = MatchEtags.onMatch, final List? etags, @@ -278,11 +258,8 @@ class CoapClient { final int maxRetransmit = 0, final CoapMulticastResponseHandler? onMulticastResponse, }) { - final request = CoapRequest.newPut( - uri.replace( - path: path, - query: query, - ), + final request = CoapRequest.put( + uri, confirmable: confirmable, accept: accept, contentFormat: format, @@ -301,8 +278,7 @@ class CoapClient { /// Sends a DELETE request Future delete( - final String path, { - final String? query, + final Uri uri, { final CoapMediaType? accept, final bool confirmable = true, final List>? options, @@ -310,11 +286,8 @@ class CoapClient { final int maxRetransmit = 0, final CoapMulticastResponseHandler? onMulticastResponse, }) { - final request = CoapRequest.newDelete( - uri.replace( - path: path, - query: query, - ), + final request = CoapRequest.delete( + uri, confirmable: confirmable, accept: accept, ); @@ -333,9 +306,8 @@ class CoapClient { /// /// [RFC 8132, section 2]: https://www.rfc-editor.org/rfc/rfc8132.html#section-2 Future fetch( - final String path, { + final Uri uri, { required final String payload, - final String? query, final CoapMediaType? accept, final CoapMediaType? format, final bool confirmable = true, @@ -344,11 +316,8 @@ class CoapClient { final int maxRetransmit = 0, final CoapMulticastResponseHandler? onMulticastResponse, }) { - final request = CoapRequest.newFetch( - uri.replace( - path: path, - query: query, - ), + final request = CoapRequest.fetch( + uri, confirmable: confirmable, accept: accept, contentFormat: format, @@ -369,9 +338,8 @@ class CoapClient { /// /// [RFC 8132, section 2]: https://www.rfc-editor.org/rfc/rfc8132.html#section-2 Future fetchBytes( - final String path, { + final Uri uri, { required final Iterable payload, - final String? query, final CoapMediaType? accept, final CoapMediaType? format, final bool confirmable = true, @@ -380,11 +348,8 @@ class CoapClient { final int maxRetransmit = 0, final CoapMulticastResponseHandler? onMulticastResponse, }) { - final request = CoapRequest.newFetch( - uri.replace( - path: path, - query: query, - ), + final request = CoapRequest.fetch( + uri, confirmable: confirmable, accept: accept, contentFormat: format, @@ -405,9 +370,8 @@ class CoapClient { /// /// [RFC 8132, section 3]: https://www.rfc-editor.org/rfc/rfc8132.html#section-3 Future patch( - final String path, { + final Uri uri, { required final String payload, - final String? query, final CoapMediaType? format, final CoapMediaType? accept, final bool confirmable = true, @@ -418,11 +382,8 @@ class CoapClient { final int maxRetransmit = 0, final CoapMulticastResponseHandler? onMulticastResponse, }) { - final request = CoapRequest.newPatch( - uri.replace( - path: path, - query: query, - ), + final request = CoapRequest.patch( + uri, confirmable: confirmable, payload: utf8.encode(payload), accept: accept, @@ -445,9 +406,8 @@ class CoapClient { /// /// [RFC 8132, section 3]: https://www.rfc-editor.org/rfc/rfc8132.html#section-3 Future patchBytes( - final String path, { + final Uri uri, { required final Iterable payload, - final String? query, final CoapMediaType? format, final MatchEtags matchEtags = MatchEtags.onMatch, final List? etags, @@ -458,11 +418,8 @@ class CoapClient { final int maxRetransmit = 0, final CoapMulticastResponseHandler? onMulticastResponse, }) { - final request = CoapRequest.newPatch( - uri.replace( - path: path, - query: query, - ), + final request = CoapRequest.patch( + uri, confirmable: confirmable, accept: accept, payload: payload, @@ -485,9 +442,8 @@ class CoapClient { /// /// [RFC 8132, section 3]: https://www.rfc-editor.org/rfc/rfc8132.html#section-3 Future iPatch( - final String path, { + final Uri uri, { required final String payload, - final String? query, final CoapMediaType? format, final CoapMediaType? accept, final bool confirmable = true, @@ -498,11 +454,8 @@ class CoapClient { final int maxRetransmit = 0, final CoapMulticastResponseHandler? onMulticastResponse, }) { - final request = CoapRequest.newIPatch( - uri.replace( - path: path, - query: query, - ), + final request = CoapRequest.iPatch( + uri, confirmable: confirmable, accept: accept, payload: utf8.encode(payload), @@ -525,9 +478,8 @@ class CoapClient { /// /// [RFC 8132, section 3]: https://www.rfc-editor.org/rfc/rfc8132.html#section-3 Future iPatchBytes( - final String path, { + final Uri uri, { required final Iterable payload, - final String? query, final CoapMediaType? format, final MatchEtags matchEtags = MatchEtags.onMatch, final List? etags, @@ -538,11 +490,8 @@ class CoapClient { final int maxRetransmit = 0, final CoapMulticastResponseHandler? onMulticastResponse, }) { - final request = CoapRequest.newIPatch( - uri.replace( - path: path, - query: query, - ), + final request = CoapRequest.iPatch( + uri, confirmable: confirmable, accept: accept, payload: payload, @@ -578,15 +527,9 @@ class CoapClient { /// Discovers remote resources. Future?> discover({ - final String path = CoapConstants.defaultWellKnownURI, - final String? query, + final Uri? uri, }) async { - final discover = CoapRequest.newGet( - uri.replace( - path: path, - query: query, - ), - ); + final discover = CoapRequest.get(uri ?? CoapConstants.defaultWellKnownURI); final links = await send(discover); if (links.contentFormat != CoapMediaType.applicationLinkFormat) { return [CoapWebLink('')]; @@ -645,8 +588,7 @@ class CoapClient { Future cancelObserveProactive( final CoapObserveClientRelation relation, ) async { - final cancel = relation.newCancel(); - await send(cancel); + await send(relation.cancellation()); relation.isCancelled = true; } @@ -702,14 +644,15 @@ class CoapClient { Future _prepare(final CoapRequest request) async { request ..timestamp = DateTime.now() + ..uri = _buildUri(request.uri) ..eventBus = _eventBus; await _lock.synchronized(() async { // Set endpoint if missing if (_endpoint == null) { - final destination = await _lookupHost(uri.host, addressType); + final destination = await _lookupHost(baseUri.host, addressType); final socket = CoapINetwork.fromUri( - uri, + baseUri, address: destination, bindAddress: bindAddress, config: _config, @@ -725,6 +668,18 @@ class CoapClient { request.endpoint = _endpoint; } + Uri _buildUri(final Uri uri) => baseUri.replace( + scheme: uri.scheme.isEmpty ? null : uri.scheme, + userInfo: uri.userInfo.isEmpty ? null : uri.userInfo, + host: uri.host.isEmpty ? null : uri.host, + port: uri.port == 0 ? null : uri.port, + // pathSegments included in path + path: uri.path.isEmpty ? null : uri.path, + // queryParameters included in query + query: uri.query.isEmpty ? null : uri.query, + fragment: uri.fragment.isEmpty ? null : uri.fragment, + ); + Future _lookupHost( final String host, final InternetAddressType addressType, diff --git a/lib/src/coap_constants.dart b/lib/src/coap_constants.dart index a90f3a2a..f10d9649 100644 --- a/lib/src/coap_constants.dart +++ b/lib/src/coap_constants.dart @@ -56,7 +56,7 @@ class CoapConstants { /// /// Default URI for well known resource /// - static const String defaultWellKnownURI = '/.well-known/core'; + static final Uri defaultWellKnownURI = Uri(path: '/.well-known/core'); /// /// Token length @@ -71,5 +71,5 @@ class CoapConstants { /// /// Empty token /// - static Uint8Buffer emptyToken = Uint8Buffer(); + static final Uint8Buffer emptyToken = Uint8Buffer(); } diff --git a/lib/src/coap_observe_client_relation.dart b/lib/src/coap_observe_client_relation.dart index f9c7708f..0d1db0c7 100644 --- a/lib/src/coap_observe_client_relation.dart +++ b/lib/src/coap_observe_client_relation.dart @@ -67,7 +67,7 @@ class CoapObserveClientRelation extends Stream { /// Create a cancellation request @internal - CoapRequest newCancel() => CoapRequest.newGet(_request.uri) + CoapRequest cancellation() => CoapRequest.get(_request.uri) // Copy options, but set Observe to cancel ..setOptions(_request.getAllOptions()) ..observe = ObserveRegistration.deregister.value diff --git a/lib/src/coap_request.dart b/lib/src/coap_request.dart index 168d0be9..6638fb75 100644 --- a/lib/src/coap_request.dart +++ b/lib/src/coap_request.dart @@ -60,7 +60,7 @@ class CoapRequest extends CoapMessage { /// See [RFC 7252, Section 5.10.1] for more information. /// /// [RFC 7252, Section 5.10.1]: https://www.rfc-editor.org/rfc/rfc7252#section-5.10.1 - final Uri uri; + Uri uri; @override List> getAllOptions() => @@ -82,7 +82,7 @@ class CoapRequest extends CoapMessage { String toString() => '\n<<< Request Message >>>${super.toString()}'; /// Construct a GET request. - factory CoapRequest.newGet( + factory CoapRequest.get( final Uri uri, { final bool confirmable = true, final Iterable? payload, @@ -97,7 +97,7 @@ class CoapRequest extends CoapMessage { ); /// Construct a POST request. - factory CoapRequest.newPost( + factory CoapRequest.post( final Uri uri, { final bool confirmable = true, final Iterable? payload, @@ -114,7 +114,7 @@ class CoapRequest extends CoapMessage { ); /// Construct a PUT request. - factory CoapRequest.newPut( + factory CoapRequest.put( final Uri uri, { final bool confirmable = true, final Iterable? payload, @@ -131,7 +131,7 @@ class CoapRequest extends CoapMessage { ); /// Construct a DELETE request. - factory CoapRequest.newDelete( + factory CoapRequest.delete( final Uri uri, { final bool confirmable = true, final Iterable? payload, @@ -146,7 +146,7 @@ class CoapRequest extends CoapMessage { ); /// Construct a FETCH request. - factory CoapRequest.newFetch( + factory CoapRequest.fetch( final Uri uri, { final bool confirmable = true, final Iterable? payload, @@ -163,7 +163,7 @@ class CoapRequest extends CoapMessage { ); /// Construct a PATCH request. - factory CoapRequest.newPatch( + factory CoapRequest.patch( final Uri uri, { final bool confirmable = true, final Iterable? payload, @@ -180,7 +180,7 @@ class CoapRequest extends CoapMessage { ); /// Construct a iPATCH request. - factory CoapRequest.newIPatch( + factory CoapRequest.iPatch( final Uri uri, { final bool confirmable = true, final Iterable? payload, diff --git a/lib/src/stack/layers/observe.dart b/lib/src/stack/layers/observe.dart index 6d1a3ee7..596eb6cd 100644 --- a/lib/src/stack/layers/observe.dart +++ b/lib/src/stack/layers/observe.dart @@ -235,7 +235,7 @@ class _ReregistrationContext { void _timerElapsed() { final request = _exchange.request; if (!request.isCancelled) { - final refresh = CoapRequest.newGet(request.uri) + final refresh = CoapRequest.get(request.uri) ..setOptions(request.getAllOptions()) // Make sure Observe is set and zero ..observe = ObserveRegistration.register.value