This is an automated email from the ASF dual-hosted git repository.

fgerlits pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git

commit 68991c705af21cc3f28de98a85295da36e3b15b3
Author: Adam Debreceni <[email protected]>
AuthorDate: Fri Jun 2 10:50:21 2023 +0200

    MINIFICPP-1755 - Use std::span instead of gsl::span
    
    Signed-off-by: Ferenc Gerlits <[email protected]>
    This closes #1584
---
 extensions/aws/processors/PutS3Object.h            |  2 +-
 extensions/azure/storage/AzureBlobStorage.cpp      |  2 +-
 extensions/azure/storage/AzureBlobStorage.h        |  2 +-
 .../azure/storage/AzureBlobStorageClient.cpp       |  7 ++--
 extensions/azure/storage/AzureBlobStorageClient.h  |  2 +-
 extensions/azure/storage/AzureDataLakeStorage.cpp  |  2 +-
 extensions/azure/storage/AzureDataLakeStorage.h    |  2 +-
 .../azure/storage/AzureDataLakeStorageClient.cpp   |  5 ++-
 .../azure/storage/AzureDataLakeStorageClient.h     |  7 ++--
 extensions/azure/storage/BlobStorageClient.h       |  2 +-
 extensions/azure/storage/DataLakeStorageClient.h   |  2 +-
 extensions/coap/controllerservice/CoapResponse.h   |  2 +-
 extensions/coap/protocols/CoapC2Protocol.cpp       |  3 +-
 extensions/gcp/processors/PutGCSObject.cpp         |  2 +-
 extensions/http-curl/client/HTTPCallback.h         |  2 +-
 extensions/http-curl/client/HTTPStream.cpp         |  2 +-
 extensions/http-curl/client/HTTPStream.h           |  2 +-
 extensions/http-curl/protocols/RESTSender.cpp      |  2 +-
 extensions/http-curl/tests/C2CompressTest.cpp      |  5 ++-
 extensions/http-curl/tests/C2DebugBundleTest.cpp   |  4 +-
 extensions/http-curl/tests/CivetStream.h           |  2 +-
 extensions/jni/jvm/JniReferenceObjects.h           |  2 +-
 extensions/libarchive/ReadArchiveStream.cpp        |  2 +-
 extensions/libarchive/ReadArchiveStream.h          |  4 +-
 extensions/librdkafka/rdkafka_utils.cpp            | 16 ++------
 extensions/librdkafka/rdkafka_utils.h              |  2 +-
 extensions/lua/LuaInputStream.cpp                  |  2 +-
 extensions/opencv/MotionDetector.cpp               |  2 +-
 extensions/rocksdb-repos/RocksDbRepository.cpp     |  3 +-
 extensions/rocksdb-repos/RocksDbStream.cpp         | 16 ++------
 extensions/rocksdb-repos/RocksDbStream.h           |  2 +-
 .../encryption/RocksDbEncryptionProvider.cpp       |  4 +-
 .../processors/ExecuteProcess.cpp                  |  2 +-
 .../processors/ExecuteProcess.h                    |  2 +-
 .../standard-processors/processors/ExtractText.cpp |  2 +-
 .../standard-processors/processors/PutTCP.cpp      |  5 ++-
 extensions/systemd/ConsumeJournald.cpp             |  4 +-
 extensions/systemd/ConsumeJournald.h               |  2 +-
 libminifi/include/FlowFileRecord.h                 |  2 +-
 libminifi/include/c2/C2Payload.h                   |  8 +++-
 libminifi/include/c2/protocols/RESTProtocol.h      |  2 +-
 libminifi/include/core/ConfigurableComponent.h     |  2 +-
 libminifi/include/core/Connectable.h               |  4 +-
 libminifi/include/core/ProcessSession.h            |  8 ++--
 libminifi/include/core/flow/Node.h                 |  2 +-
 .../include/core/repository/AtomicRepoEntries.h    | 13 +++---
 libminifi/include/io/AtomicEntryStream.h           |  4 +-
 libminifi/include/io/BufferStream.h                |  6 +--
 libminifi/include/io/CRCStream.h                   |  2 +-
 libminifi/include/io/ClientSocket.h                |  4 +-
 libminifi/include/io/DescriptorStream.h            |  2 +-
 libminifi/include/io/FileStream.h                  |  2 +-
 libminifi/include/io/InputStream.h                 |  2 +-
 libminifi/include/io/OutputStream.h                |  2 +-
 libminifi/include/io/Stream.h                      |  3 +-
 libminifi/include/io/StreamSlice.h                 |  4 +-
 libminifi/include/io/tls/SecureDescriptorStream.h  |  2 +-
 libminifi/include/io/tls/TLSSocket.h               |  4 +-
 libminifi/include/sitetosite/Peer.h                |  2 +-
 libminifi/include/utils/ByteArrayCallback.h        |  2 +-
 libminifi/include/utils/JsonCallback.h             |  2 +-
 libminifi/include/utils/StringUtils.h              | 17 ++++----
 libminifi/include/utils/crypto/ciphers/Aes256Ecb.h |  4 +-
 libminifi/include/utils/gsl.h                      | 18 +--------
 libminifi/include/utils/{gsl.h => span.h}          | 35 +++++++---------
 libminifi/src/c2/C2Agent.cpp                       |  2 +-
 libminifi/src/c2/C2Payload.cpp                     | 14 ++-----
 libminifi/src/c2/protocols/RESTProtocol.cpp        |  5 +--
 libminifi/src/core/ConfigurableComponent.cpp       |  2 +-
 libminifi/src/core/Connectable.cpp                 |  4 +-
 libminifi/src/core/ProcessSession.cpp              | 12 +++---
 libminifi/src/core/Repository.cpp                  |  2 +-
 .../src/core/repository/VolatileRepository.cpp     |  2 +-
 libminifi/src/io/BufferStream.cpp                  | 14 ++-----
 libminifi/src/io/ClientSocket.cpp                  |  2 +-
 libminifi/src/io/DescriptorStream.cpp              | 15 ++-----
 libminifi/src/io/FileStream.cpp                    |  2 +-
 libminifi/src/io/StreamSlice.cpp                   |  4 +-
 libminifi/src/io/tls/SecureDescriptorStream.cpp    |  2 +-
 libminifi/src/io/tls/TLSSocket.cpp                 |  4 +-
 libminifi/src/utils/BaseHTTPClient.cpp             |  4 +-
 .../utils/LineByLineInputOutputStreamCallback.cpp  |  3 +-
 libminifi/src/utils/StringUtils.cpp                | 10 ++---
 libminifi/src/utils/crypto/EncryptionUtils.cpp     | 19 +++------
 libminifi/src/utils/crypto/ciphers/Aes256Ecb.cpp   | 26 ++++--------
 libminifi/src/utils/file/FileUtils.cpp             |  4 +-
 libminifi/test/TestBase.cpp                        |  3 +-
 libminifi/test/Utils.h                             |  4 +-
 .../test/archive-tests/ArchiveStreamTests.cpp      |  2 +-
 .../test/archive-tests/CompressContentTests.cpp    |  2 +-
 libminifi/test/archive-tests/MergeFileTests.cpp    |  7 ++--
 libminifi/test/azure-tests/MockBlobStorage.h       |  5 ++-
 .../test/azure-tests/MockDataLakeStorageClient.h   |  6 ++-
 libminifi/test/rocksdb-tests/EncryptionTests.cpp   |  3 +-
 .../test/rocksdb-tests/RocksDBStreamTests.cpp      |  4 +-
 libminifi/test/rocksdb-tests/SwapTests.cpp         |  2 +-
 libminifi/test/unit/FileStreamTests.cpp            |  2 +-
 libminifi/test/unit/FileSystemRepositoryTests.cpp  |  4 +-
 libminifi/test/unit/FlowFileSerializationTests.cpp |  5 ++-
 .../LineByLineInputOutputStreamCallbackTests.cpp   |  5 ++-
 libminifi/test/unit/LoggerTests.cpp                |  3 +-
 libminifi/test/unit/ProvenanceTestHelper.h         |  3 +-
 libminifi/test/unit/SiteToSiteHelper.h             |  2 +-
 libminifi/test/unit/{GslTest.cpp => SpanTests.cpp} | 14 +++++--
 libminifi/test/unit/StreamTests.cpp                |  5 ++-
 libminifi/test/unit/StringUtilsTests.cpp           | 46 +++++++++-------------
 libminifi/test/unit/ZlibStreamTests.cpp            |  5 ++-
 nanofi/tests/CSite2SiteTests.cpp                   |  4 +-
 108 files changed, 259 insertions(+), 320 deletions(-)

diff --git a/extensions/aws/processors/PutS3Object.h 
b/extensions/aws/processors/PutS3Object.h
index 4763c6e2f..81c0faa0d 100644
--- a/extensions/aws/processors/PutS3Object.h
+++ b/extensions/aws/processors/PutS3Object.h
@@ -116,7 +116,7 @@ class PutS3Object : public S3Processor {
       read_size_ = 0;
       while (read_size_ < flow_size_) {
         const auto next_read_size = (std::min)(flow_size_ - read_size_, 
BUFFER_SIZE);
-        const auto read_ret = stream->read(gsl::make_span(buffer).subspan(0, 
next_read_size));
+        const auto read_ret = stream->read(std::span(buffer).subspan(0, 
next_read_size));
         if (io::isError(read_ret)) {
           return -1;
         }
diff --git a/extensions/azure/storage/AzureBlobStorage.cpp 
b/extensions/azure/storage/AzureBlobStorage.cpp
index a5d9ec5b7..a00f5481b 100644
--- a/extensions/azure/storage/AzureBlobStorage.cpp
+++ b/extensions/azure/storage/AzureBlobStorage.cpp
@@ -43,7 +43,7 @@ std::optional<bool> 
AzureBlobStorage::createContainerIfNotExists(const PutAzureB
   }
 }
 
-std::optional<UploadBlobResult> AzureBlobStorage::uploadBlob(const 
PutAzureBlobStorageParameters& params, gsl::span<const std::byte> buffer) {
+std::optional<UploadBlobResult> AzureBlobStorage::uploadBlob(const 
PutAzureBlobStorageParameters& params, std::span<const std::byte> buffer) {
   try {
     logger_->log_debug("Uploading Azure blob %s to container %s", 
params.blob_name, params.container_name);
     auto response = blob_storage_client_->uploadBlob(params, buffer);
diff --git a/extensions/azure/storage/AzureBlobStorage.h 
b/extensions/azure/storage/AzureBlobStorage.h
index 8b7f9b16e..305da5451 100644
--- a/extensions/azure/storage/AzureBlobStorage.h
+++ b/extensions/azure/storage/AzureBlobStorage.h
@@ -64,7 +64,7 @@ class AzureBlobStorage {
  public:
   explicit AzureBlobStorage(std::unique_ptr<BlobStorageClient> 
blob_storage_client = nullptr);
   std::optional<bool> createContainerIfNotExists(const 
PutAzureBlobStorageParameters& params);
-  std::optional<UploadBlobResult> uploadBlob(const 
PutAzureBlobStorageParameters& params, gsl::span<const std::byte> buffer);
+  std::optional<UploadBlobResult> uploadBlob(const 
PutAzureBlobStorageParameters& params, std::span<const std::byte> buffer);
   bool deleteBlob(const DeleteAzureBlobStorageParameters& params);
   std::optional<uint64_t> fetchBlob(const FetchAzureBlobStorageParameters& 
params, io::OutputStream& stream);
   std::optional<ListContainerResult> listContainer(const 
ListAzureBlobStorageParameters& params);
diff --git a/extensions/azure/storage/AzureBlobStorageClient.cpp 
b/extensions/azure/storage/AzureBlobStorageClient.cpp
index f83302ded..b64c1e367 100644
--- a/extensions/azure/storage/AzureBlobStorageClient.cpp
+++ b/extensions/azure/storage/AzureBlobStorageClient.cpp
@@ -26,6 +26,7 @@
 #include "azure/storage/blobs/blob_options.hpp"
 
 #include "utils/AzureSdkLogger.h"
+#include "utils/span.h"
 
 namespace org::apache::nifi::minifi::azure::storage {
 
@@ -40,8 +41,8 @@ class AzureBlobStorageInputStream : public io::InputStream {
     return result_.BodyStream->Length();
   }
 
-  size_t read(gsl::span<std::byte> buffer) override {
-    const auto uint8_t_view = buffer.as_span<uint8_t>();
+  size_t read(std::span<std::byte> buffer) override {
+    const auto uint8_t_view = minifi::utils::as_span<uint8_t>(buffer);
     return result_.BodyStream->Read(uint8_t_view.data(), uint8_t_view.size());
   }
 
@@ -71,7 +72,7 @@ bool AzureBlobStorageClient::createContainerIfNotExists(const 
PutAzureBlobStorag
   return container_client->CreateIfNotExists().Value.Created;
 }
 
-Azure::Storage::Blobs::Models::UploadBlockBlobResult 
AzureBlobStorageClient::uploadBlob(const PutAzureBlobStorageParameters& params, 
gsl::span<const std::byte> buffer) {
+Azure::Storage::Blobs::Models::UploadBlockBlobResult 
AzureBlobStorageClient::uploadBlob(const PutAzureBlobStorageParameters& params, 
std::span<const std::byte> buffer) {
   auto container_client = createClient(params.credentials, 
params.container_name);
   auto blob_client = container_client->GetBlockBlobClient(params.blob_name);
   return blob_client.UploadFrom(reinterpret_cast<const 
uint8_t*>(buffer.data()), buffer.size()).Value;
diff --git a/extensions/azure/storage/AzureBlobStorageClient.h 
b/extensions/azure/storage/AzureBlobStorageClient.h
index 325f4ef24..29455e888 100644
--- a/extensions/azure/storage/AzureBlobStorageClient.h
+++ b/extensions/azure/storage/AzureBlobStorageClient.h
@@ -36,7 +36,7 @@ class AzureBlobStorageClient : public BlobStorageClient {
  public:
   AzureBlobStorageClient();
   bool createContainerIfNotExists(const PutAzureBlobStorageParameters& params) 
override;
-  Azure::Storage::Blobs::Models::UploadBlockBlobResult uploadBlob(const 
PutAzureBlobStorageParameters& params, gsl::span<const std::byte> buffer) 
override;
+  Azure::Storage::Blobs::Models::UploadBlockBlobResult uploadBlob(const 
PutAzureBlobStorageParameters& params, std::span<const std::byte> buffer) 
override;
   std::string getUrl(const AzureBlobStorageParameters& params) override;
   bool deleteBlob(const DeleteAzureBlobStorageParameters& params) override;
   std::unique_ptr<io::InputStream> fetchBlob(const 
FetchAzureBlobStorageParameters& params) override;
diff --git a/extensions/azure/storage/AzureDataLakeStorage.cpp 
b/extensions/azure/storage/AzureDataLakeStorage.cpp
index 9f575428c..dde6f8255 100644
--- a/extensions/azure/storage/AzureDataLakeStorage.cpp
+++ b/extensions/azure/storage/AzureDataLakeStorage.cpp
@@ -59,7 +59,7 @@ 
AzureDataLakeStorage::AzureDataLakeStorage(std::unique_ptr<DataLakeStorageClient
   : data_lake_storage_client_(data_lake_storage_client ? 
std::move(data_lake_storage_client) : 
std::make_unique<AzureDataLakeStorageClient>()) {
 }
 
-UploadDataLakeStorageResult AzureDataLakeStorage::uploadFile(const 
PutAzureDataLakeStorageParameters& params, gsl::span<const std::byte> buffer) {
+UploadDataLakeStorageResult AzureDataLakeStorage::uploadFile(const 
PutAzureDataLakeStorageParameters& params, std::span<const std::byte> buffer) {
   UploadDataLakeStorageResult result;
   logger_->log_debug("Uploading file '%s/%s' to Azure Data Lake Storage 
filesystem '%s'", params.directory_name, params.filename, 
params.file_system_name);
   try {
diff --git a/extensions/azure/storage/AzureDataLakeStorage.h 
b/extensions/azure/storage/AzureDataLakeStorage.h
index 6e1756c0f..587ec5f0d 100644
--- a/extensions/azure/storage/AzureDataLakeStorage.h
+++ b/extensions/azure/storage/AzureDataLakeStorage.h
@@ -67,7 +67,7 @@ class AzureDataLakeStorage {
  public:
   explicit AzureDataLakeStorage(std::unique_ptr<DataLakeStorageClient> 
data_lake_storage_client = nullptr);
 
-  storage::UploadDataLakeStorageResult uploadFile(const 
storage::PutAzureDataLakeStorageParameters& params, gsl::span<const std::byte> 
buffer);
+  storage::UploadDataLakeStorageResult uploadFile(const 
storage::PutAzureDataLakeStorageParameters& params, std::span<const std::byte> 
buffer);
   bool deleteFile(const storage::DeleteAzureDataLakeStorageParameters& params);
   std::optional<uint64_t> fetchFile(const FetchAzureDataLakeStorageParameters& 
params, io::OutputStream& stream);
   std::optional<ListDataLakeStorageResult> listDirectory(const 
ListAzureDataLakeStorageParameters& params);
diff --git a/extensions/azure/storage/AzureDataLakeStorageClient.cpp 
b/extensions/azure/storage/AzureDataLakeStorageClient.cpp
index d64ba296b..0b5e97079 100644
--- a/extensions/azure/storage/AzureDataLakeStorageClient.cpp
+++ b/extensions/azure/storage/AzureDataLakeStorageClient.cpp
@@ -27,6 +27,7 @@
 #include "azure/identity.hpp"
 
 #include "utils/AzureSdkLogger.h"
+#include "utils/span.h"
 
 namespace org::apache::nifi::minifi::azure::storage {
 
@@ -70,9 +71,9 @@ bool AzureDataLakeStorageClient::createFile(const 
PutAzureDataLakeStorageParamet
   return response.Value.Created;
 }
 
-std::string AzureDataLakeStorageClient::uploadFile(const 
PutAzureDataLakeStorageParameters& params, gsl::span<const std::byte> buffer) {
+std::string AzureDataLakeStorageClient::uploadFile(const 
PutAzureDataLakeStorageParameters& params, std::span<const std::byte> buffer) {
   auto file_client = getFileClient(params);
-  file_client.UploadFrom(buffer.as_span<const uint8_t>().data(), 
buffer.size());
+  file_client.UploadFrom(minifi::utils::as_span<const uint8_t>(buffer).data(), 
buffer.size());
   return file_client.GetUrl();
 }
 
diff --git a/extensions/azure/storage/AzureDataLakeStorageClient.h 
b/extensions/azure/storage/AzureDataLakeStorageClient.h
index 2e9fd98ac..c8eecf0a2 100644
--- a/extensions/azure/storage/AzureDataLakeStorageClient.h
+++ b/extensions/azure/storage/AzureDataLakeStorageClient.h
@@ -29,6 +29,7 @@
 #include "DataLakeStorageClient.h"
 #include "core/logging/Logger.h"
 #include "core/logging/LoggerConfiguration.h"
+#include "utils/span.h"
 
 namespace org::apache::nifi::minifi::azure::storage {
 
@@ -49,7 +50,7 @@ class AzureDataLakeStorageClient : public 
DataLakeStorageClient {
    * @param buffer Buffer containing the data to be uploaded
    * @return URI of the file uploaded
    */
-  std::string uploadFile(const PutAzureDataLakeStorageParameters& params, 
gsl::span<const std::byte> buffer) override;
+  std::string uploadFile(const PutAzureDataLakeStorageParameters& params, 
std::span<const std::byte> buffer) override;
 
   /**
    * Deletes a file on the Azure Data Lake Storage
@@ -83,8 +84,8 @@ class AzureDataLakeStorageClient : public 
DataLakeStorageClient {
       return result_.Body->Length();
     }
 
-    size_t read(gsl::span<std::byte> out_buffer) override {
-      return result_.Body->Read(out_buffer.as_span<uint8_t>().data(), 
out_buffer.size());
+    size_t read(std::span<std::byte> out_buffer) override {
+      return result_.Body->Read(utils::as_span<uint8_t>(out_buffer).data(), 
out_buffer.size());
     }
 
    private:
diff --git a/extensions/azure/storage/BlobStorageClient.h 
b/extensions/azure/storage/BlobStorageClient.h
index efa2f8dfc..ddbc9bf33 100644
--- a/extensions/azure/storage/BlobStorageClient.h
+++ b/extensions/azure/storage/BlobStorageClient.h
@@ -66,7 +66,7 @@ struct ListAzureBlobStorageParameters : public 
AzureBlobStorageParameters {
 class BlobStorageClient {
  public:
   virtual bool createContainerIfNotExists(const PutAzureBlobStorageParameters& 
params) = 0;
-  virtual Azure::Storage::Blobs::Models::UploadBlockBlobResult 
uploadBlob(const PutAzureBlobStorageParameters& params, gsl::span<const 
std::byte> buffer) = 0;
+  virtual Azure::Storage::Blobs::Models::UploadBlockBlobResult 
uploadBlob(const PutAzureBlobStorageParameters& params, std::span<const 
std::byte> buffer) = 0;
   virtual std::string getUrl(const AzureBlobStorageParameters& params) = 0;
   virtual bool deleteBlob(const DeleteAzureBlobStorageParameters& params) = 0;
   virtual std::unique_ptr<io::InputStream> fetchBlob(const 
FetchAzureBlobStorageParameters& params) = 0;
diff --git a/extensions/azure/storage/DataLakeStorageClient.h 
b/extensions/azure/storage/DataLakeStorageClient.h
index 17d43c0bb..4fd653daf 100644
--- a/extensions/azure/storage/DataLakeStorageClient.h
+++ b/extensions/azure/storage/DataLakeStorageClient.h
@@ -65,7 +65,7 @@ struct ListAzureDataLakeStorageParameters : public 
AzureDataLakeStorageParameter
 class DataLakeStorageClient {
  public:
   virtual bool createFile(const PutAzureDataLakeStorageParameters& params) = 0;
-  virtual std::string uploadFile(const PutAzureDataLakeStorageParameters& 
params, gsl::span<const std::byte> buffer) = 0;
+  virtual std::string uploadFile(const PutAzureDataLakeStorageParameters& 
params, std::span<const std::byte> buffer) = 0;
   virtual bool deleteFile(const DeleteAzureDataLakeStorageParameters& params) 
= 0;
   virtual std::unique_ptr<io::InputStream> fetchFile(const 
FetchAzureDataLakeStorageParameters& params) = 0;
   virtual std::vector<Azure::Storage::Files::DataLake::Models::PathItem> 
listDirectory(const ListAzureDataLakeStorageParameters& params) = 0;
diff --git a/extensions/coap/controllerservice/CoapResponse.h 
b/extensions/coap/controllerservice/CoapResponse.h
index 53145c645..f7d3f0ba0 100644
--- a/extensions/coap/controllerservice/CoapResponse.h
+++ b/extensions/coap/controllerservice/CoapResponse.h
@@ -54,7 +54,7 @@ class CoapResponse {
   CoapResponse(CoapResponse &&other) = default;
   ~CoapResponse() = default;
 
-  [[nodiscard]] gsl::span<const std::byte> getData() const noexcept {
+  [[nodiscard]] std::span<const std::byte> getData() const noexcept {
     return data_;
   }
 
diff --git a/extensions/coap/protocols/CoapC2Protocol.cpp 
b/extensions/coap/protocols/CoapC2Protocol.cpp
index 7e7968ac1..733065533 100644
--- a/extensions/coap/protocols/CoapC2Protocol.cpp
+++ b/extensions/coap/protocols/CoapC2Protocol.cpp
@@ -22,6 +22,7 @@
 #include "io/OutputStream.h"
 #include "core/Resource.h"
 #include "utils/gsl.h"
+#include "utils/span.h"
 
 namespace org::apache::nifi::minifi::coap::c2 {
 
@@ -242,7 +243,7 @@ minifi::c2::C2Payload CoapProtocol::serialize(const 
minifi::c2::C2Payload &paylo
   size_t bsize = stream.size();
 
   CoapMessage msg;
-  msg.data_ = const_cast<uint8_t *>(stream.getBuffer().as_span<const 
uint8_t>().data());
+  msg.data_ = const_cast<uint8_t *>(utils::as_span<const 
uint8_t>(stream.getBuffer()).data());
   msg.size_ = bsize;
 
   coap::controllers::CoapResponse message = 
coap_service_->sendPayload(COAP_REQUEST_POST, endpoint, &msg);
diff --git a/extensions/gcp/processors/PutGCSObject.cpp 
b/extensions/gcp/processors/PutGCSObject.cpp
index 52a3c433f..563661474 100644
--- a/extensions/gcp/processors/PutGCSObject.cpp
+++ b/extensions/gcp/processors/PutGCSObject.cpp
@@ -40,7 +40,7 @@ class UploadToGCSCallback {
   int64_t operator()(const std::shared_ptr<io::InputStream>& stream) {
     std::string content;
     content.resize(stream->size());
-    const auto read_ret = 
stream->read(gsl::make_span(content).as_span<std::byte>());
+    const auto read_ret = stream->read(as_writable_bytes(std::span(content)));
     if (io::isError(read_ret)) {
       return -1;
     }
diff --git a/extensions/http-curl/client/HTTPCallback.h 
b/extensions/http-curl/client/HTTPCallback.h
index 1a9281727..55751e468 100644
--- a/extensions/http-curl/client/HTTPCallback.h
+++ b/extensions/http-curl/client/HTTPCallback.h
@@ -85,7 +85,7 @@ class HttpStreamingCallback final : public 
utils::HTTPUploadByteArrayInputCallba
   }
 
   void write(std::string content) override {
-    (void) 
processInner(utils::span_to<std::vector>(gsl::make_span(content).as_span<std::byte>()));
+    (void) 
processInner(utils::span_to<std::vector>(as_bytes(std::span(content))));
   }
 
   std::byte* getBuffer(size_t pos) override {
diff --git a/extensions/http-curl/client/HTTPStream.cpp 
b/extensions/http-curl/client/HTTPStream.cpp
index 48ad3ad27..ca8b53b10 100644
--- a/extensions/http-curl/client/HTTPStream.cpp
+++ b/extensions/http-curl/client/HTTPStream.cpp
@@ -72,7 +72,7 @@ size_t HttpStream::write(const uint8_t* value, size_t size) {
   return size;
 }
 
-size_t HttpStream::read(gsl::span<std::byte> buf) {
+size_t HttpStream::read(std::span<std::byte> buf) {
   if (buf.empty()) { return 0; }
   if (!IsNullOrEmpty(buf)) {
     if (!started_) {
diff --git a/extensions/http-curl/client/HTTPStream.h 
b/extensions/http-curl/client/HTTPStream.h
index ada04beae..ed910cdf8 100644
--- a/extensions/http-curl/client/HTTPStream.h
+++ b/extensions/http-curl/client/HTTPStream.h
@@ -89,7 +89,7 @@ class HttpStream : public io::BaseStream {
    * @param buf buffer in which we extract data
    * @param buflen
    */
-  size_t read(gsl::span<std::byte> buf) override;
+  size_t read(std::span<std::byte> buf) override;
 
   /**
    * writes value to stream
diff --git a/extensions/http-curl/protocols/RESTSender.cpp 
b/extensions/http-curl/protocols/RESTSender.cpp
index 0d188af84..382d311f2 100644
--- a/extensions/http-curl/protocols/RESTSender.cpp
+++ b/extensions/http-curl/protocols/RESTSender.cpp
@@ -140,7 +140,7 @@ C2Payload RESTSender::sendPayload(const std::string& url, 
const Direction direct
         io::BufferStream compressed_payload;
         bool compression_success = [&] {
           io::ZlibCompressStream 
compressor(gsl::make_not_null(&compressed_payload), 
io::ZlibCompressionFormat::GZIP, Z_BEST_COMPRESSION);
-          auto ret = compressor.write(gsl::span<const 
char>(data.value()).as_span<const std::byte>());
+          auto ret = compressor.write(as_bytes(std::span(data.value())));
           if (ret != data->length()) {
             return false;
           }
diff --git a/extensions/http-curl/tests/C2CompressTest.cpp 
b/extensions/http-curl/tests/C2CompressTest.cpp
index 673cdd55e..e0ea8974d 100644
--- a/extensions/http-curl/tests/C2CompressTest.cpp
+++ b/extensions/http-curl/tests/C2CompressTest.cpp
@@ -35,6 +35,7 @@
 #include "range/v3/view/transform.hpp"
 #include "utils/IntegrationTestUtils.h"
 #include "utils/StringUtils.h"
+#include "utils/span.h"
 #include "properties/Configuration.h"
 #include "io/ZlibStream.h"
 
@@ -50,10 +51,10 @@ class CompressedHeartbeatHandler : public HeartbeatHandler {
     minifi::io::BufferStream output;
     {
       minifi::io::ZlibDecompressStream 
decompressor(gsl::make_not_null(&output));
-      auto ret = decompressor.write(gsl::span<const 
char>(payload).as_span<const std::byte>());
+      auto ret = decompressor.write(as_bytes(std::span(payload)));
       assert(ret == payload.size());
     }
-    auto str_span = output.getBuffer().as_span<const char>();
+    auto str_span = utils::as_span<const char>(output.getBuffer());
     return {str_span.data(), str_span.size()};
   }
 
diff --git a/extensions/http-curl/tests/C2DebugBundleTest.cpp 
b/extensions/http-curl/tests/C2DebugBundleTest.cpp
index 6001b3f99..b4d531255 100644
--- a/extensions/http-curl/tests/C2DebugBundleTest.cpp
+++ b/extensions/http-curl/tests/C2DebugBundleTest.cpp
@@ -168,7 +168,7 @@ int main() {
     while (auto info = decompressor->nextEntry()) {
       std::string file_content;
       file_content.resize(info->size);
-      
assert(decompressor->read(gsl::make_span(file_content).as_span<std::byte>()) ==
+      assert(decompressor->read(as_writable_bytes(std::span(file_content))) ==
               file_content.length());
       archive_content[info->filename] = std::move(file_content);
     }
@@ -182,7 +182,7 @@ int main() {
     }
     std::string log_text;
     log_text.resize(log_stream->size());
-    log_stream->read(gsl::make_span(log_text).as_span<std::byte>());
+    log_stream->read(as_writable_bytes(std::span(log_text)));
     assert(log_text.find("Tis but a scratch") != std::string::npos);
     return true;
   });
diff --git a/extensions/http-curl/tests/CivetStream.h 
b/extensions/http-curl/tests/CivetStream.h
index a963503ee..94acdd71a 100644
--- a/extensions/http-curl/tests/CivetStream.h
+++ b/extensions/http-curl/tests/CivetStream.h
@@ -43,7 +43,7 @@ class CivetStream : public io::InputStream {
    * @param buf buffer in which we extract data
    * @param buflen
    */
-  size_t read(gsl::span<std::byte> buf) override {
+  size_t read(std::span<std::byte> buf) override {
     const auto ret = mg_read(conn, buf.data(), buf.size());
     if (ret < 0) return STREAM_ERROR;
     return gsl::narrow<size_t>(ret);
diff --git a/extensions/jni/jvm/JniReferenceObjects.h 
b/extensions/jni/jvm/JniReferenceObjects.h
index 028089863..407555e7d 100644
--- a/extensions/jni/jvm/JniReferenceObjects.h
+++ b/extensions/jni/jvm/JniReferenceObjects.h
@@ -109,7 +109,7 @@ class JniByteInputStream {
     int read = 0;
     do {
       // JNI takes size as int, there's not much we can do here to support 
2GB+ sizes
-      int actual = 
static_cast<int>(stream_->read(gsl::make_span(buffer_).subspan(0, 
std::min(remaining, buffer_.size()))));
+      int actual = 
static_cast<int>(stream_->read(std::span(buffer_).subspan(0, 
std::min(remaining, buffer_.size()))));
       if (actual <= 0) {
         if (read == 0) {
           stream_ = nullptr;
diff --git a/extensions/libarchive/ReadArchiveStream.cpp 
b/extensions/libarchive/ReadArchiveStream.cpp
index 556658403..afd3ac01d 100644
--- a/extensions/libarchive/ReadArchiveStream.cpp
+++ b/extensions/libarchive/ReadArchiveStream.cpp
@@ -65,7 +65,7 @@ std::optional<EntryInfo> ReadArchiveStreamImpl::nextEntry() {
   return EntryInfo{archive_entry_pathname(entry), entry_size_.value()};
 }
 
-size_t ReadArchiveStreamImpl::read(const gsl::span<std::byte> out_buffer) {
+size_t ReadArchiveStreamImpl::read(const std::span<std::byte> out_buffer) {
   if (!arch_ || !entry_size_) {
     return STREAM_ERROR;
   }
diff --git a/extensions/libarchive/ReadArchiveStream.h 
b/extensions/libarchive/ReadArchiveStream.h
index 566a4c862..155463c44 100644
--- a/extensions/libarchive/ReadArchiveStream.h
+++ b/extensions/libarchive/ReadArchiveStream.h
@@ -42,7 +42,7 @@ class ReadArchiveStreamImpl : public ReadArchiveStream {
    public:
     explicit BufferedReader(std::shared_ptr<InputStream> input) : 
input_(std::move(input)) {}
 
-    std::optional<gsl::span<const std::byte>> readChunk() {
+    std::optional<std::span<const std::byte>> readChunk() {
       size_t result = input_->read(buffer_);
       if (io::isError(result)) {
         return std::nullopt;
@@ -66,7 +66,7 @@ class ReadArchiveStreamImpl : public ReadArchiveStream {
 
   using InputStream::read;
 
-  size_t read(gsl::span<std::byte> out_buffer) override;
+  size_t read(std::span<std::byte> out_buffer) override;
 
  private:
   static la_ssize_t archive_read(struct archive* archive, void *context, const 
void **buff) {
diff --git a/extensions/librdkafka/rdkafka_utils.cpp 
b/extensions/librdkafka/rdkafka_utils.cpp
index 3532ab566..58b68ce58 100644
--- a/extensions/librdkafka/rdkafka_utils.cpp
+++ b/extensions/librdkafka/rdkafka_utils.cpp
@@ -22,11 +22,7 @@
 #include "Exception.h"
 #include "utils/StringUtils.h"
 
-namespace org {
-namespace apache {
-namespace nifi {
-namespace minifi {
-namespace utils {
+namespace org::apache::nifi::minifi::utils {
 
 void setKafkaConfigurationField(rd_kafka_conf_t& configuration, const 
std::string& field_name, const std::string& value) {
   static std::array<char, 512U> errstr{};
@@ -55,7 +51,7 @@ std::string get_human_readable_kafka_message_timestamp(const 
rd_kafka_message_t&
   } else if (tstype == RD_KAFKA_TIMESTAMP_LOG_APPEND_TIME) {
     tsname = "log append time";
   }
-  const int64_t seconds_since_timestamp = timestamp == -1 ? 0 : 
static_cast<int64_t>(time(NULL)) - static_cast<int64_t>(timestamp / 1000);
+  const int64_t seconds_since_timestamp = timestamp == -1 ? 0 : 
static_cast<int64_t>(time(nullptr)) - static_cast<int64_t>(timestamp / 1000);
   return {"[Timestamp](" + std::string(tsname) + " " + 
std::to_string(timestamp) + " (" + std::to_string(seconds_since_timestamp) + " 
s ago)"};
 }
 
@@ -64,7 +60,7 @@ std::string get_human_readable_kafka_message_headers(const 
rd_kafka_message_t& r
   const rd_kafka_resp_err_t get_header_response = 
rd_kafka_message_headers(&rkmessage, &hdrs);
   if (RD_KAFKA_RESP_ERR_NO_ERROR == get_header_response) {
     std::vector<std::string> header_list;
-    kafka_headers_for_each(*hdrs, [&] (const std::string& key, gsl::span<const 
char> val) { header_list.emplace_back(key + ": " + std::string{ val.data(), 
val.size() }); });
+    kafka_headers_for_each(*hdrs, [&] (const std::string& key, std::span<const 
char> val) { header_list.emplace_back(key + ": " + std::string{ val.data(), 
val.size() }); });
     return StringUtils::join(", ", header_list);
   }
   if (RD_KAFKA_RESP_ERR__NOENT == get_header_response) {
@@ -114,8 +110,4 @@ std::optional<std::string> get_encoded_message_key(const 
rd_kafka_message_t& mes
   return get_encoded_string({reinterpret_cast<const char*>(message.key), 
message.key_len}, encoding);
 }
 
-}  // namespace utils
-}  // namespace minifi
-}  // namespace nifi
-}  // namespace apache
-}  // namespace org
+}  // namespace org::apache::nifi::minifi::utils
diff --git a/extensions/librdkafka/rdkafka_utils.h 
b/extensions/librdkafka/rdkafka_utils.h
index 7c2e1bfb6..8f89605ab 100644
--- a/extensions/librdkafka/rdkafka_utils.h
+++ b/extensions/librdkafka/rdkafka_utils.h
@@ -89,7 +89,7 @@ void kafka_headers_for_each(const rd_kafka_headers_t& 
headers, T key_value_handl
   const void *value;
   std::size_t size;
   for (std::size_t i = 0; RD_KAFKA_RESP_ERR_NO_ERROR == 
rd_kafka_header_get_all(&headers, i, &key, &value, &size); ++i) {
-    key_value_handle(std::string(key), gsl::span<const char>(static_cast<const 
char*>(value), size));
+    key_value_handle(std::string(key), std::span<const char>(static_cast<const 
char*>(value), size));
   }
 }
 
diff --git a/extensions/lua/LuaInputStream.cpp 
b/extensions/lua/LuaInputStream.cpp
index 050a7f355..9a6a9cb20 100644
--- a/extensions/lua/LuaInputStream.cpp
+++ b/extensions/lua/LuaInputStream.cpp
@@ -48,7 +48,7 @@ std::string LuaInputStream::read(size_t len) {
   //     0 <= n < s.size()."
   //
   // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
-  const auto read = stream_->read(gsl::make_span(buffer).as_span<std::byte>());
+  const auto read = stream_->read(as_writable_bytes(std::span(buffer)));
   if (!io::isError(read) && read != len) {
     buffer.resize(read);
   }
diff --git a/extensions/opencv/MotionDetector.cpp 
b/extensions/opencv/MotionDetector.cpp
index 75c7cf5be..ee46840d8 100644
--- a/extensions/opencv/MotionDetector.cpp
+++ b/extensions/opencv/MotionDetector.cpp
@@ -155,7 +155,7 @@ void MotionDetector::onTrigger(const 
std::shared_ptr<core::ProcessContext> &cont
   session->read(flow_file, [&frame](const std::shared_ptr<io::InputStream>& 
input_stream) -> int64_t {
     std::vector<uchar> image_buf;
     image_buf.resize(input_stream->size());
-    const auto ret = 
input_stream->read(gsl::make_span(image_buf).as_span<std::byte>());
+    const auto ret = 
input_stream->read(as_writable_bytes(std::span(image_buf)));
     if (io::isError(ret) || ret != input_stream->size()) {
       throw std::runtime_error("ImageReadCallback failed to fully read flow 
file input stream");
     }
diff --git a/extensions/rocksdb-repos/RocksDbRepository.cpp 
b/extensions/rocksdb-repos/RocksDbRepository.cpp
index 02a735395..7fda56f8e 100644
--- a/extensions/rocksdb-repos/RocksDbRepository.cpp
+++ b/extensions/rocksdb-repos/RocksDbRepository.cpp
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 #include "RocksDbRepository.h"
+#include "utils/span.h"
 
 using namespace std::literals::chrono_literals;
 
@@ -71,7 +72,7 @@ bool RocksDbRepository::MultiPut(const 
std::vector<std::pair<std::string, std::u
   }
   auto batch = opendb->createWriteBatch();
   for (const auto &item : data) {
-    const auto buf = item.second->getBuffer().as_span<const char>();
+    const auto buf = utils::as_span<const char>(item.second->getBuffer());
     rocksdb::Slice value(buf.data(), buf.size());
     if (!batch.Put(item.first, value).ok()) {
       logger_->log_error("Failed to add item to batch operation");
diff --git a/extensions/rocksdb-repos/RocksDbStream.cpp 
b/extensions/rocksdb-repos/RocksDbStream.cpp
index fdfe7e0bb..856132535 100644
--- a/extensions/rocksdb-repos/RocksDbStream.cpp
+++ b/extensions/rocksdb-repos/RocksDbStream.cpp
@@ -25,11 +25,8 @@
 #include <string>
 #include <Exception.h>
 #include "io/validation.h"
-namespace org {
-namespace apache {
-namespace nifi {
-namespace minifi {
-namespace io {
+
+namespace org::apache::nifi::minifi::io {
 
 RocksDbStream::RocksDbStream(std::string path, 
gsl::not_null<minifi::internal::RocksDatabase*> db, bool write_enable, 
minifi::internal::WriteBatch* batch)
     : BaseStream(),
@@ -78,7 +75,7 @@ size_t RocksDbStream::write(const uint8_t *value, size_t 
size) {
   }
 }
 
-size_t RocksDbStream::read(gsl::span<std::byte> buf) {
+size_t RocksDbStream::read(std::span<std::byte> buf) {
   // The check have to be in this order for RocksDBStreamTest "Read zero 
bytes" to succeed
   if (!exists_) return STREAM_ERROR;
   if (buf.empty()) return 0;
@@ -90,9 +87,4 @@ size_t RocksDbStream::read(gsl::span<std::byte> buf) {
   return amtToRead;
 }
 
-} /* namespace io */
-} /* namespace minifi */
-} /* namespace nifi */
-} /* namespace apache */
-} /* namespace org */
-
+}  // namespace org::apache::nifi::minifi::io
diff --git a/extensions/rocksdb-repos/RocksDbStream.h 
b/extensions/rocksdb-repos/RocksDbStream.h
index d75493d1e..e8fbe7ff3 100644
--- a/extensions/rocksdb-repos/RocksDbStream.h
+++ b/extensions/rocksdb-repos/RocksDbStream.h
@@ -71,7 +71,7 @@ class RocksDbStream : public io::BaseStream {
    * @param buf buffer in which we extract data
    * @param buflen
    */
-  size_t read(gsl::span<std::byte> buf) override;
+  size_t read(std::span<std::byte> buf) override;
 
   /**
    * writes value to stream
diff --git a/extensions/rocksdb-repos/encryption/RocksDbEncryptionProvider.cpp 
b/extensions/rocksdb-repos/encryption/RocksDbEncryptionProvider.cpp
index f1a85ac82..ffeead877 100644
--- a/extensions/rocksdb-repos/encryption/RocksDbEncryptionProvider.cpp
+++ b/extensions/rocksdb-repos/encryption/RocksDbEncryptionProvider.cpp
@@ -88,7 +88,7 @@ std::shared_ptr<rocksdb::Env> createEncryptingEnv(const 
utils::crypto::Encryptio
 
 rocksdb::Status AES256BlockCipher::Encrypt(char *data) {
   try {
-    cipher_impl_.encrypt({reinterpret_cast<unsigned char*>(data), 
Aes256EcbCipher::BLOCK_SIZE});
+    cipher_impl_.encrypt(std::span<unsigned char, 
Aes256EcbCipher::BLOCK_SIZE>{reinterpret_cast<unsigned char*>(data), 
Aes256EcbCipher::BLOCK_SIZE});
     return rocksdb::Status::OK();
   } catch (const utils::crypto::CipherError& error) {
     logger_->log_error("Error while encrypting in database '%s': %s", 
database_, error.what());
@@ -98,7 +98,7 @@ rocksdb::Status AES256BlockCipher::Encrypt(char *data) {
 
 rocksdb::Status AES256BlockCipher::Decrypt(char *data) {
   try {
-    cipher_impl_.decrypt({reinterpret_cast<unsigned char*>(data), 
Aes256EcbCipher::BLOCK_SIZE});
+    cipher_impl_.decrypt(std::span<unsigned char, 
Aes256EcbCipher::BLOCK_SIZE>{reinterpret_cast<unsigned char*>(data), 
Aes256EcbCipher::BLOCK_SIZE});
     return rocksdb::Status::OK();
   } catch (const utils::crypto::CipherError& error) {
     logger_->log_error("Error while decrypting in database '%s': %s", 
database_, error.what());
diff --git a/extensions/standard-processors/processors/ExecuteProcess.cpp 
b/extensions/standard-processors/processors/ExecuteProcess.cpp
index a643f9be9..942f3ff1c 100644
--- a/extensions/standard-processors/processors/ExecuteProcess.cpp
+++ b/extensions/standard-processors/processors/ExecuteProcess.cpp
@@ -162,7 +162,7 @@ void 
ExecuteProcess::readOutputInBatches(core::ProcessSession& session) {
   }
 }
 
-bool ExecuteProcess::writeToFlowFile(core::ProcessSession& session, 
std::shared_ptr<core::FlowFile>& flow_file, gsl::span<const char> buffer) const 
{
+bool ExecuteProcess::writeToFlowFile(core::ProcessSession& session, 
std::shared_ptr<core::FlowFile>& flow_file, std::span<const char> buffer) const 
{
   if (!flow_file) {
     flow_file = session.create();
     if (!flow_file) {
diff --git a/extensions/standard-processors/processors/ExecuteProcess.h 
b/extensions/standard-processors/processors/ExecuteProcess.h
index 38c0b06d6..2ca16b893 100644
--- a/extensions/standard-processors/processors/ExecuteProcess.h
+++ b/extensions/standard-processors/processors/ExecuteProcess.h
@@ -95,7 +95,7 @@ class ExecuteProcess : public core::Processor {
   void collectChildProcessOutput(core::ProcessSession& session);
   void readOutputInBatches(core::ProcessSession& session);
   void readOutput(core::ProcessSession& session);
-  bool writeToFlowFile(core::ProcessSession& session, 
std::shared_ptr<core::FlowFile>& flow_file, gsl::span<const char> buffer) const;
+  bool writeToFlowFile(core::ProcessSession& session, 
std::shared_ptr<core::FlowFile>& flow_file, std::span<const char> buffer) const;
 
   std::shared_ptr<core::logging::Logger> logger_ = 
core::logging::LoggerFactory<ExecuteProcess>::getLogger(uuid_);
   std::string command_;
diff --git a/extensions/standard-processors/processors/ExtractText.cpp 
b/extensions/standard-processors/processors/ExtractText.cpp
index bb5d8a46b..f21748fe6 100644
--- a/extensions/standard-processors/processors/ExtractText.cpp
+++ b/extensions/standard-processors/processors/ExtractText.cpp
@@ -117,7 +117,7 @@ int64_t ExtractText::ReadCallback::operator()(const 
std::shared_ptr<io::InputStr
   while (read_size < size_limit) {
     // Don't read more than config limit or the size of the buffer
     const auto length = std::min(size_limit - read_size, buffer.size());
-    const auto ret = stream->read(gsl::make_span(buffer).subspan(0, length));
+    const auto ret = stream->read(std::span(buffer).subspan(0, length));
 
     if (io::isError(ret)) {
       return -1;  // Stream error
diff --git a/extensions/standard-processors/processors/PutTCP.cpp 
b/extensions/standard-processors/processors/PutTCP.cpp
index c5c2d7717..19144d8fb 100644
--- a/extensions/standard-processors/processors/PutTCP.cpp
+++ b/extensions/standard-processors/processors/PutTCP.cpp
@@ -167,7 +167,8 @@ void PutTCP::onSchedule(core::ProcessContext* const 
context, core::ProcessSessio
     }
   }
 
-  delimiter_ = 
utils::span_to<std::vector>(gsl::make_span(context->getProperty(OutgoingMessageDelimiter).value_or(std::string{})).as_span<const
 std::byte>());
+  const auto delimiter_str = 
context->getProperty(OutgoingMessageDelimiter).value_or(std::string{});
+  delimiter_ = utils::span_to<std::vector>(as_bytes(std::span(delimiter_str)));
 
   if (auto max_size_of_socket_send_buffer = 
context->getProperty<core::DataSizeValue>(MaxSizeOfSocketSendBuffer))
     max_size_of_socket_send_buffer_ = 
max_size_of_socket_send_buffer->getValue();
@@ -301,7 +302,7 @@ asio::awaitable<std::error_code> 
ConnectionHandler<SocketType>::send(const std::
 
   std::vector<std::byte> data_chunk;
   data_chunk.resize(chunk_size);
-  gsl::span<std::byte> buffer{data_chunk};
+  std::span<std::byte> buffer{data_chunk};
   while (stream_to_send->tell() < stream_to_send->size()) {
     size_t num_read = stream_to_send->read(buffer);
     if (io::isError(num_read))
diff --git a/extensions/systemd/ConsumeJournald.cpp 
b/extensions/systemd/ConsumeJournald.cpp
index b63ac1d2f..a617b2383 100644
--- a/extensions/systemd/ConsumeJournald.cpp
+++ b/extensions/systemd/ConsumeJournald.cpp
@@ -177,7 +177,7 @@ void ConsumeJournald::onTrigger(core::ProcessContext* const 
context, core::Proce
   state_manager_->set({{"cursor", std::move(cursor_and_messages.first)}});
 }
 
-std::optional<gsl::span<const char>> 
ConsumeJournald::enumerateJournalEntry(libwrapper::Journal& journal) {
+std::optional<std::span<const char>> 
ConsumeJournald::enumerateJournalEntry(libwrapper::Journal& journal) {
   const void* data_ptr{};
   size_t data_length{};
   const auto status_code = journal.enumerateData(&data_ptr, &data_length);
@@ -190,7 +190,7 @@ std::optional<gsl::span<const char>> 
ConsumeJournald::enumerateJournalEntry(libw
 }
 
 std::optional<ConsumeJournald::journal_field> 
ConsumeJournald::getNextField(libwrapper::Journal& journal) {
-  return enumerateJournalEntry(journal) | utils::map([](gsl::span<const char> 
field) {
+  return enumerateJournalEntry(journal) | utils::map([](std::span<const char> 
field) {
     const auto eq_pos = std::find(std::begin(field), std::end(field), '=');
     gsl_Ensures(eq_pos != std::end(field) && "field string must contain an 
equals sign");
     const auto eq_idx = gsl::narrow<size_t>(eq_pos - std::begin(field));
diff --git a/extensions/systemd/ConsumeJournald.h 
b/extensions/systemd/ConsumeJournald.h
index bf037e7dc..482d6c6bd 100644
--- a/extensions/systemd/ConsumeJournald.h
+++ b/extensions/systemd/ConsumeJournald.h
@@ -104,7 +104,7 @@ class ConsumeJournald final : public core::Processor {
     std::chrono::system_clock::time_point timestamp;
   };
 
-  static std::optional<gsl::span<const char>> 
enumerateJournalEntry(libwrapper::Journal&);
+  static std::optional<std::span<const char>> 
enumerateJournalEntry(libwrapper::Journal&);
   static std::optional<journal_field> getNextField(libwrapper::Journal&);
   std::future<std::pair<std::string, std::vector<journal_message>>> 
getCursorAndMessageBatch();
   std::string formatSyslogMessage(const journal_message&) const;
diff --git a/libminifi/include/FlowFileRecord.h 
b/libminifi/include/FlowFileRecord.h
index 141f3b4ba..928407e45 100644
--- a/libminifi/include/FlowFileRecord.h
+++ b/libminifi/include/FlowFileRecord.h
@@ -58,7 +58,7 @@ class FlowFileRecord : public core::FlowFile {
   //! Serialize and Persistent to the repository
   bool Persist(const std::shared_ptr<core::Repository>& flowRepository);
 
-  static std::shared_ptr<FlowFileRecord> DeSerialize(gsl::span<const 
std::byte> buffer, const std::shared_ptr<core::ContentRepository> 
&content_repo, utils::Identifier &container) {
+  static std::shared_ptr<FlowFileRecord> DeSerialize(std::span<const 
std::byte> buffer, const std::shared_ptr<core::ContentRepository> 
&content_repo, utils::Identifier &container) {
     io::BufferStream inStream{buffer};
     return DeSerialize(inStream, content_repo, container);
   }
diff --git a/libminifi/include/c2/C2Payload.h b/libminifi/include/c2/C2Payload.h
index de8790a3a..decf9af46 100644
--- a/libminifi/include/c2/C2Payload.h
+++ b/libminifi/include/c2/C2Payload.h
@@ -29,6 +29,7 @@
 #include "core/state/UpdateController.h"
 #include "utils/Enum.h"
 #include "utils/gsl.h"
+#include "utils/span.h"
 
 namespace org {
 namespace apache {
@@ -200,13 +201,16 @@ class C2Payload : public state::Update {
    */
   void setRawData(const std::string&);
   void setRawData(const std::vector<char>&);
-  void setRawData(gsl::span<const std::byte>);
+  void setRawData(std::span<const std::byte>);
 
   /**
    * Returns raw data.
    */
   [[nodiscard]] std::vector<std::byte> getRawData() const noexcept { return 
raw_data_; }
-  [[nodiscard]] std::string getRawDataAsString() const { return 
utils::span_to<std::string>(gsl::make_span(getRawData()).as_span<const 
char>()); }
+  [[nodiscard]] std::string getRawDataAsString() const {
+    const auto raw_data = getRawData();
+    return utils::span_to<std::string>(utils::as_span<const 
char>(std::span(raw_data)));
+  }
   [[nodiscard]] std::vector<std::byte> moveRawData() && {return 
std::move(raw_data_);}
 
   /**
diff --git a/libminifi/include/c2/protocols/RESTProtocol.h 
b/libminifi/include/c2/protocols/RESTProtocol.h
index ebbeb9e4e..36c741278 100644
--- a/libminifi/include/c2/protocols/RESTProtocol.h
+++ b/libminifi/include/c2/protocols/RESTProtocol.h
@@ -43,7 +43,7 @@ class RESTProtocol : public HeartbeatJsonSerializer {
  protected:
   void initialize(core::controller::ControllerServiceProvider* controller, 
const std::shared_ptr<Configure> &configure);
   void serializeNestedPayload(rapidjson::Value& target, const C2Payload& 
payload, rapidjson::Document::AllocatorType& alloc) override;
-  static C2Payload parseJsonResponse(const C2Payload &payload, gsl::span<const 
std::byte> response);
+  static C2Payload parseJsonResponse(const C2Payload &payload, std::span<const 
std::byte> response);
 
  private:
   bool containsPayload(const C2Payload &o);
diff --git a/libminifi/include/core/ConfigurableComponent.h 
b/libminifi/include/core/ConfigurableComponent.h
index 895b6f49b..f92ac469c 100644
--- a/libminifi/include/core/ConfigurableComponent.h
+++ b/libminifi/include/core/ConfigurableComponent.h
@@ -104,7 +104,7 @@ class ConfigurableComponent {
      */
   bool setProperty(const Property& prop, PropertyValue &value);
 
-  void setSupportedProperties(gsl::span<const core::Property> properties);
+  void setSupportedProperties(std::span<const core::Property> properties);
 
   /**
    * Gets whether or not this processor supports dynamic properties.
diff --git a/libminifi/include/core/Connectable.h 
b/libminifi/include/core/Connectable.h
index f4a3e305a..aa91f2893 100644
--- a/libminifi/include/core/Connectable.h
+++ b/libminifi/include/core/Connectable.h
@@ -54,13 +54,13 @@ class Connectable : public CoreComponent {
   Connectable& operator=(const Connectable &other) = delete;
   Connectable& operator=(Connectable&& other) = delete;
 
-  void setSupportedRelationships(gsl::span<const core::Relationship> 
relationships);
+  void setSupportedRelationships(std::span<const core::Relationship> 
relationships);
 
   bool isSupportedRelationship(const Relationship &relationship);
 
   std::vector<Relationship> getSupportedRelationships() const;
 
-  void setAutoTerminatedRelationships(gsl::span<const core::Relationship> 
relationships);
+  void setAutoTerminatedRelationships(std::span<const core::Relationship> 
relationships);
 
   bool isAutoTerminated(const Relationship &relationship);
 
diff --git a/libminifi/include/core/ProcessSession.h 
b/libminifi/include/core/ProcessSession.h
index 49d8efee7..2ba5f9cda 100644
--- a/libminifi/include/core/ProcessSession.h
+++ b/libminifi/include/core/ProcessSession.h
@@ -103,13 +103,13 @@ class ProcessSession : public ReferenceContainer {
   // Read and write the flow file at the same time (eg. for processing it line 
by line)
   int64_t readWrite(const std::shared_ptr<core::FlowFile> &flow, const 
io::InputOutputStreamCallback& callback);
   // Replace content with buffer
-  void writeBuffer(const std::shared_ptr<core::FlowFile>& flow_file, 
gsl::span<const char> buffer);
-  void writeBuffer(const std::shared_ptr<core::FlowFile>& flow_file, 
gsl::span<const std::byte> buffer);
+  void writeBuffer(const std::shared_ptr<core::FlowFile>& flow_file, 
std::span<const char> buffer);
+  void writeBuffer(const std::shared_ptr<core::FlowFile>& flow_file, 
std::span<const std::byte> buffer);
   // Execute the given write/append callback against the content
   void append(const std::shared_ptr<core::FlowFile> &flow, const 
io::OutputStreamCallback& callback);
   // Append buffer to content
-  void appendBuffer(const std::shared_ptr<core::FlowFile>& flow, 
gsl::span<const char> buffer);
-  void appendBuffer(const std::shared_ptr<core::FlowFile>& flow, 
gsl::span<const std::byte> buffer);
+  void appendBuffer(const std::shared_ptr<core::FlowFile>& flow, 
std::span<const char> buffer);
+  void appendBuffer(const std::shared_ptr<core::FlowFile>& flow, 
std::span<const std::byte> buffer);
   // Penalize the flow
   void penalize(const std::shared_ptr<core::FlowFile> &flow);
 
diff --git a/libminifi/include/core/flow/Node.h 
b/libminifi/include/core/flow/Node.h
index 1bd3ad7e2..12a9314b1 100644
--- a/libminifi/include/core/flow/Node.h
+++ b/libminifi/include/core/flow/Node.h
@@ -166,7 +166,7 @@ class Node {
   }
 
   // considers @keys to be a set of viable access paths, the first viable is 
returned
-  Node operator[](gsl::span<const std::string> keys) const {
+  Node operator[](std::span<const std::string> keys) const {
     for (auto& key : keys) {
       if (Node result = (*this)[key]) {
         return result;
diff --git a/libminifi/include/core/repository/AtomicRepoEntries.h 
b/libminifi/include/core/repository/AtomicRepoEntries.h
index 1c2437dd8..b81314c91 100644
--- a/libminifi/include/core/repository/AtomicRepoEntries.h
+++ b/libminifi/include/core/repository/AtomicRepoEntries.h
@@ -15,9 +15,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#ifndef LIBMINIFI_INCLUDE_CORE_REPOSITORY_ATOMICREPOENTRIES_H_
-#define LIBMINIFI_INCLUDE_CORE_REPOSITORY_ATOMICREPOENTRIES_H_
 
+#pragma once
+
+#include <span>
 #include <atomic>
 #include <chrono>
 #include <cstddef>
@@ -115,7 +116,7 @@ noexcept      : key_(std::move(other.key_)),
 
       [[nodiscard]] size_t size() const noexcept { return buffer_.size(); }
 
-      [[nodiscard]] gsl::span<const std::byte> getBuffer() const {
+      [[nodiscard]] std::span<const std::byte> getBuffer() const {
         return buffer_;
       }
 
@@ -131,7 +132,7 @@ noexcept      : key_(std::move(other.key_)),
        * Appends data to the end of buffer.
        * @param data data to add to buffer_
        */
-      void append(gsl::span<const std::byte> data) {
+      void append(std::span<const std::byte> data) {
         buffer_.insert(buffer_.end(), std::begin(data), std::end(data));
       }
 
@@ -390,7 +391,7 @@ class AtomicEntry {
    * Appends buffer onto this atomic entry if key matches
    * the current RepoValue's key.
    */
-  bool insert(const T key, gsl::span<const std::byte> buffer) {
+  bool insert(const T key, std::span<const std::byte> buffer) {
     try_lock();
 
     if (!has_value_) {
@@ -453,5 +454,3 @@ class AtomicEntry {
 };
 
 }  // namespace org::apache::nifi::minifi::core::repository
-
-#endif  // LIBMINIFI_INCLUDE_CORE_REPOSITORY_ATOMICREPOENTRIES_H_
diff --git a/libminifi/include/io/AtomicEntryStream.h 
b/libminifi/include/io/AtomicEntryStream.h
index dc3dc0581..ecb5a2b26 100644
--- a/libminifi/include/io/AtomicEntryStream.h
+++ b/libminifi/include/io/AtomicEntryStream.h
@@ -80,7 +80,7 @@ class AtomicEntryStream : public BaseStream {
    * @param buf buffer in which we extract data
    * @param buflen
    */
-  size_t read(gsl::span<std::byte> buf) override;
+  size_t read(std::span<std::byte> buf) override;
 
   /**
    * writes value to stream
@@ -132,7 +132,7 @@ size_t AtomicEntryStream<T>::write(const uint8_t *value, 
size_t size) {
 }
 
 template<typename T>
-size_t AtomicEntryStream<T>::read(gsl::span<std::byte> buf) {
+size_t AtomicEntryStream<T>::read(std::span<std::byte> buf) {
   if (buf.empty()) {
     return 0;
   }
diff --git a/libminifi/include/io/BufferStream.h 
b/libminifi/include/io/BufferStream.h
index 987cdcaf9..eb00c5dc8 100644
--- a/libminifi/include/io/BufferStream.h
+++ b/libminifi/include/io/BufferStream.h
@@ -35,7 +35,7 @@ class BufferStream : public BaseStream {
  public:
   BufferStream() = default;
 
-  explicit BufferStream(gsl::span<const std::byte> buf) {
+  explicit BufferStream(std::span<const std::byte> buf) {
     write(buf);
   }
 
@@ -56,7 +56,7 @@ class BufferStream : public BaseStream {
 
   size_t write(const uint8_t* value, size_t size) final;
 
-  size_t read(gsl::span<std::byte> buffer) override;
+  size_t read(std::span<std::byte> buffer) override;
 
   int initialize() override {
     buffer_.clear();
@@ -78,7 +78,7 @@ class BufferStream : public BaseStream {
    * Returns the underlying buffer
    * @return vector's array
    **/
-  [[nodiscard]] gsl::span<const std::byte> getBuffer() const override {
+  [[nodiscard]] std::span<const std::byte> getBuffer() const override {
     return buffer_;
   }
 
diff --git a/libminifi/include/io/CRCStream.h b/libminifi/include/io/CRCStream.h
index 606f69275..7a0a41730 100644
--- a/libminifi/include/io/CRCStream.h
+++ b/libminifi/include/io/CRCStream.h
@@ -85,7 +85,7 @@ class InputCRCStream : public virtual 
CRCStreamBase<StreamType>, public InputStr
  public:
   using InputStream::read;
 
-  size_t read(gsl::span<std::byte> buf) override {
+  size_t read(std::span<std::byte> buf) override {
     const auto ret = child_stream_->read(buf);
     if (ret > 0 && !io::isError(ret)) {
       crc_ = crc32(crc_, reinterpret_cast<const unsigned char*>(buf.data()), 
gsl::narrow<uInt>(ret));
diff --git a/libminifi/include/io/ClientSocket.h 
b/libminifi/include/io/ClientSocket.h
index 5838159e1..4c8e8b528 100644
--- a/libminifi/include/io/ClientSocket.h
+++ b/libminifi/include/io/ClientSocket.h
@@ -137,7 +137,7 @@ class Socket : public BaseStream {
    * @param buflen
    * @param retrieve_all_bytes determines if we should read all bytes before 
returning
    */
-  size_t read(gsl::span<std::byte> buf) override {
+  size_t read(std::span<std::byte> buf) override {
     return read(buf, true);
   }
 
@@ -147,7 +147,7 @@ class Socket : public BaseStream {
    * @param buflen
    * @param retrieve_all_bytes determines if we should read all bytes before 
returning
    */
-  virtual size_t read(gsl::span<std::byte> buf, bool retrieve_all_bytes);
+  virtual size_t read(std::span<std::byte> buf, bool retrieve_all_bytes);
 
  protected:
   /**
diff --git a/libminifi/include/io/DescriptorStream.h 
b/libminifi/include/io/DescriptorStream.h
index e0e9bb224..cc12b0e2e 100644
--- a/libminifi/include/io/DescriptorStream.h
+++ b/libminifi/include/io/DescriptorStream.h
@@ -62,7 +62,7 @@ class DescriptorStream : public io::BaseStream {
    * @param buf buffer in which we extract data
    * @param buflen
    */
-  size_t read(gsl::span<std::byte> buf) override;
+  size_t read(std::span<std::byte> buf) override;
 
   /**
    * writes value to stream
diff --git a/libminifi/include/io/FileStream.h 
b/libminifi/include/io/FileStream.h
index e30ee0836..b2cf40e14 100644
--- a/libminifi/include/io/FileStream.h
+++ b/libminifi/include/io/FileStream.h
@@ -74,7 +74,7 @@ class FileStream : public io::BaseStream {
    * @param buf buffer in which we extract data
    * @param buflen
    */
-  size_t read(gsl::span<std::byte> buf) override;
+  size_t read(std::span<std::byte> buf) override;
 
   /**
    * writes value to stream
diff --git a/libminifi/include/io/InputStream.h 
b/libminifi/include/io/InputStream.h
index 2a9e89d05..f18c5655e 100644
--- a/libminifi/include/io/InputStream.h
+++ b/libminifi/include/io/InputStream.h
@@ -39,7 +39,7 @@ class InputStream : public virtual Stream {
    * @param len length to read
    * @return resulting read size or STREAM_ERROR on error or 
static_cast<size_t>(-2) on EAGAIN
    **/
-  virtual size_t read(gsl::span<std::byte> out_buffer) = 0;
+  virtual size_t read(std::span<std::byte> out_buffer) = 0;
 
   /**
    * Read string from stream. Use isError (Stream.h) to check for errors.
diff --git a/libminifi/include/io/OutputStream.h 
b/libminifi/include/io/OutputStream.h
index 24d34e1b8..c180b3684 100644
--- a/libminifi/include/io/OutputStream.h
+++ b/libminifi/include/io/OutputStream.h
@@ -47,7 +47,7 @@ class OutputStream : public virtual Stream {
    **/
   virtual size_t write(const uint8_t *value, size_t len) = 0;
 
-  size_t write(const gsl::span<const std::byte> buffer) {
+  size_t write(const std::span<const std::byte> buffer) {
     return write(reinterpret_cast<const uint8_t*>(buffer.data()), 
buffer.size());
   }
 
diff --git a/libminifi/include/io/Stream.h b/libminifi/include/io/Stream.h
index 31547a3ea..048a475ca 100644
--- a/libminifi/include/io/Stream.h
+++ b/libminifi/include/io/Stream.h
@@ -18,6 +18,7 @@
 
 #pragma once
 
+#include <span>
 #include "utils/gsl.h"
 
 namespace org::apache::nifi::minifi::io {
@@ -48,7 +49,7 @@ class Stream {
     return 1;
   }
 
-  [[nodiscard]] virtual gsl::span<const std::byte> getBuffer() const {
+  [[nodiscard]] virtual std::span<const std::byte> getBuffer() const {
     throw std::runtime_error("Not a buffered stream");
   }
 
diff --git a/libminifi/include/io/StreamSlice.h 
b/libminifi/include/io/StreamSlice.h
index cb6976290..dbce76a8f 100644
--- a/libminifi/include/io/StreamSlice.h
+++ b/libminifi/include/io/StreamSlice.h
@@ -35,7 +35,7 @@ class StreamSlice : public InputStream {
 
   // from InputStream
   size_t size() const override { return slice_size_; }
-  size_t read(gsl::span<std::byte> out_buffer) override;
+  size_t read(std::span<std::byte> out_buffer) override;
 
   // from Stream
   void close() override { stream_->close(); }
@@ -43,7 +43,7 @@ class StreamSlice : public InputStream {
 
   void seek(size_t offset) override;
   [[nodiscard]] size_t tell() const override;
-  [[nodiscard]] gsl::span<const std::byte> getBuffer() const override;
+  [[nodiscard]] std::span<const std::byte> getBuffer() const override;
 
  private:
   std::shared_ptr<io::InputStream> stream_;
diff --git a/libminifi/include/io/tls/SecureDescriptorStream.h 
b/libminifi/include/io/tls/SecureDescriptorStream.h
index d2a2416e1..66177d83b 100644
--- a/libminifi/include/io/tls/SecureDescriptorStream.h
+++ b/libminifi/include/io/tls/SecureDescriptorStream.h
@@ -71,7 +71,7 @@ class SecureDescriptorStream : public io::BaseStream {
    * @param buf buffer in which we extract data
    * @param buflen
    */
-  size_t read(gsl::span<std::byte> buf) override;
+  size_t read(std::span<std::byte> buf) override;
 
   /**
    * writes value to stream
diff --git a/libminifi/include/io/tls/TLSSocket.h 
b/libminifi/include/io/tls/TLSSocket.h
index 2ed107b7f..9f648a789 100644
--- a/libminifi/include/io/tls/TLSSocket.h
+++ b/libminifi/include/io/tls/TLSSocket.h
@@ -131,14 +131,14 @@ class TLSSocket : public Socket {
   using Socket::read;
   using Socket::write;
 
-  size_t read(gsl::span<std::byte> buf, bool retrieve_all_bytes) override;
+  size_t read(std::span<std::byte> buf, bool retrieve_all_bytes) override;
 
   /**
    * Reads data and places it into buf
    * @param buf buffer in which we extract data
    * @param buflen
    */
-  size_t read(gsl::span<std::byte> buf) override;
+  size_t read(std::span<std::byte> buf) override;
 
   /**
    * Write value to the stream using uint8_t ptr
diff --git a/libminifi/include/sitetosite/Peer.h 
b/libminifi/include/sitetosite/Peer.h
index 543dd52f2..860bd590d 100644
--- a/libminifi/include/sitetosite/Peer.h
+++ b/libminifi/include/sitetosite/Peer.h
@@ -289,7 +289,7 @@ class SiteToSitePeer : public 
org::apache::nifi::minifi::io::BaseStream {
     return stream_->write(data, len);
   }
 
-  size_t read(gsl::span<std::byte> data) override {
+  size_t read(std::span<std::byte> data) override {
     return stream_->read(data);
   }
 
diff --git a/libminifi/include/utils/ByteArrayCallback.h 
b/libminifi/include/utils/ByteArrayCallback.h
index 9d1fb4c85..12daf1526 100644
--- a/libminifi/include/utils/ByteArrayCallback.h
+++ b/libminifi/include/utils/ByteArrayCallback.h
@@ -51,7 +51,7 @@ class ByteInputCallback {
   virtual void seek(size_t) { }
 
   virtual void write(std::string content) {
-    vec = 
utils::span_to<std::vector>(gsl::make_span(content).as_span<std::byte>());
+    vec = utils::span_to<std::vector>(as_bytes(std::span(content)));
   }
 
   void setBuffer(std::vector<std::byte> data) {
diff --git a/libminifi/include/utils/JsonCallback.h 
b/libminifi/include/utils/JsonCallback.h
index 4c37afce0..c455e6c34 100644
--- a/libminifi/include/utils/JsonCallback.h
+++ b/libminifi/include/utils/JsonCallback.h
@@ -39,7 +39,7 @@ class JsonInputCallback {
   int64_t operator()(const std::shared_ptr<io::InputStream>& stream) {
     std::string content;
     content.resize(stream->size());
-    const auto read_ret = 
stream->read(gsl::make_span(content).as_span<std::byte>());
+    const auto read_ret = stream->read(as_writable_bytes(std::span(content)));
     if (io::isError(read_ret)) {
       return -1;
     }
diff --git a/libminifi/include/utils/StringUtils.h 
b/libminifi/include/utils/StringUtils.h
index 2e6f7285c..9effff8ea 100644
--- a/libminifi/include/utils/StringUtils.h
+++ b/libminifi/include/utils/StringUtils.h
@@ -34,6 +34,7 @@
 #endif
 #include "utils/FailurePolicy.h"
 #include "utils/gsl.h"
+#include "utils/span.h"
 #include "utils/meta/detected.h"
 #include "range/v3/view/transform.hpp"
 #include "range/v3/range/conversion.hpp"
@@ -361,7 +362,8 @@ class StringUtils {
    */
   static std::vector<std::byte> from_hex(std::string_view hex);
   static std::string from_hex(std::string_view hex, as_string_tag_t) {
-    return 
utils::span_to<std::string>(gsl::make_span(from_hex(hex)).as_span<const 
char>());
+    const auto decoded = from_hex(hex);
+    return utils::span_to<std::string>(utils::as_span<const 
char>(std::span(decoded)));
   }
 
 
@@ -373,7 +375,7 @@ class StringUtils {
    * @param uppercase whether the hexencoded string should be upper case
    * @return the size of hexencoded bytes
    */
-  static size_t to_hex(char* hex, gsl::span<const std::byte> 
data_to_be_transformed, bool uppercase);
+  static size_t to_hex(char* hex, std::span<const std::byte> 
data_to_be_transformed, bool uppercase);
 
   /**
    * Creates a hexencoded string from data
@@ -382,7 +384,7 @@ class StringUtils {
    * @param uppercase whether the hexencoded string should be upper case
    * @return the hexencoded string
    */
-  static std::string to_hex(gsl::span<const std::byte> data_to_be_transformed, 
bool uppercase = false);
+  static std::string to_hex(std::span<const std::byte> data_to_be_transformed, 
bool uppercase = false);
 
   /**
    * Hexencodes a string
@@ -413,7 +415,8 @@ class StringUtils {
    */
   static std::vector<std::byte> from_base64(std::string_view base64);
   static std::string from_base64(std::string_view base64, as_string_tag_t) {
-    return 
utils::span_to<std::string>(gsl::make_span(from_base64(base64)).as_span<const 
char>());
+    const auto decoded = from_base64(base64);
+    return utils::span_to<std::string>(utils::as_span<const 
char>(std::span(decoded)));
   }
 
   /**
@@ -424,7 +427,7 @@ class StringUtils {
    * @param padded if true, padding is added to the Base64 encoded string
    * @return the size of Base64 encoded bytes
    */
-  static size_t to_base64(char* base64, gsl::span<const std::byte> raw_data, 
bool url, bool padded);
+  static size_t to_base64(char* base64, std::span<const std::byte> raw_data, 
bool url, bool padded);
 
   /**
    * Creates a Base64 encoded string from data
@@ -433,7 +436,7 @@ class StringUtils {
    * @param padded if true, padding is added to the Base64 encoded string
    * @return the Base64 encoded string
    */
-  static std::string to_base64(gsl::span<const std::byte> raw_data, bool url = 
false, bool padded = true);
+  static std::string to_base64(std::span<const std::byte> raw_data, bool url = 
false, bool padded = true);
 
   /**
    * Base64 encodes a string
@@ -478,7 +481,7 @@ class StringUtils {
     return str;
   }
 
-  static std::string escapeUnprintableBytes(gsl::span<const std::byte> data);
+  static std::string escapeUnprintableBytes(std::span<const std::byte> data);
 
   /**
    * Returns whether sequence of patterns are found in given string in their 
incoming order
diff --git a/libminifi/include/utils/crypto/ciphers/Aes256Ecb.h 
b/libminifi/include/utils/crypto/ciphers/Aes256Ecb.h
index ebd201d2c..688cb2863 100644
--- a/libminifi/include/utils/crypto/ciphers/Aes256Ecb.h
+++ b/libminifi/include/utils/crypto/ciphers/Aes256Ecb.h
@@ -50,8 +50,8 @@ class Aes256EcbCipher {
   static constexpr size_t KEY_SIZE = 32;
 
   explicit Aes256EcbCipher(Bytes encryption_key);
-  void encrypt(gsl::span<unsigned char /*, BLOCK_SIZE*/> data) const;
-  void decrypt(gsl::span<unsigned char /*, BLOCK_SIZE*/> data) const;
+  void encrypt(std::span<unsigned char, BLOCK_SIZE> data) const;
+  void decrypt(std::span<unsigned char, BLOCK_SIZE> data) const;
 
   static Bytes generateKey();
 
diff --git a/libminifi/include/utils/gsl.h b/libminifi/include/utils/gsl.h
index efbf47645..9954eb357 100644
--- a/libminifi/include/utils/gsl.h
+++ b/libminifi/include/utils/gsl.h
@@ -26,23 +26,6 @@ namespace org::apache::nifi::minifi {
 namespace gsl = ::gsl_lite;
 
 namespace utils {
-namespace detail {
-template<typename T>
-using remove_cvref_t = typename std::remove_cv<typename 
std::remove_reference<T>::type>::type;
-}  // namespace detail
-
-template<typename Container, typename T>
-Container span_to(gsl::span<T> span) {
-  static_assert(std::is_constructible<Container, typename 
gsl::span<T>::iterator, typename gsl::span<T>::iterator>::value,
-      "The destination container must have an iterator (pointer) range 
constructor");
-  return Container(std::begin(span), std::end(span));
-}
-template<template<typename...> class Container, typename T>
-Container<detail::remove_cvref_t<T>> span_to(gsl::span<T> span) {
-  static_assert(std::is_constructible<Container<detail::remove_cvref_t<T>>, 
typename gsl::span<T>::iterator, typename gsl::span<T>::iterator>::value,
-      "The destination container must have an iterator (pointer) range 
constructor");
-  return span_to<Container<detail::remove_cvref_t<T>>>(span);
-}
 
 template<typename T>
 struct is_not_null : std::false_type {};
@@ -50,6 +33,7 @@ template<typename T>
 struct is_not_null<gsl::not_null<T>> : std::true_type {};
 template<typename T>
 inline constexpr bool is_not_null_v = is_not_null<T>::value;
+
 }  // namespace utils
 
 }  // namespace org::apache::nifi::minifi
diff --git a/libminifi/include/utils/gsl.h b/libminifi/include/utils/span.h
similarity index 59%
copy from libminifi/include/utils/gsl.h
copy to libminifi/include/utils/span.h
index efbf47645..ef2b4932c 100644
--- a/libminifi/include/utils/gsl.h
+++ b/libminifi/include/utils/span.h
@@ -17,39 +17,32 @@
 
 #pragma once
 
-#include <type_traits>
+#include <span>
 
-#include <gsl-lite/gsl-lite.hpp>
+namespace org::apache::nifi::minifi::utils {
 
-namespace org::apache::nifi::minifi {
-
-namespace gsl = ::gsl_lite;
-
-namespace utils {
 namespace detail {
 template<typename T>
 using remove_cvref_t = typename std::remove_cv<typename 
std::remove_reference<T>::type>::type;
 }  // namespace detail
 
 template<typename Container, typename T>
-Container span_to(gsl::span<T> span) {
-  static_assert(std::is_constructible<Container, typename 
gsl::span<T>::iterator, typename gsl::span<T>::iterator>::value,
-      "The destination container must have an iterator (pointer) range 
constructor");
+Container span_to(std::span<T> span) {
+  static_assert(std::is_constructible<Container, typename 
std::span<T>::iterator, typename std::span<T>::iterator>::value,
+                "The destination container must have an iterator (pointer) 
range constructor");
   return Container(std::begin(span), std::end(span));
 }
 template<template<typename...> class Container, typename T>
-Container<detail::remove_cvref_t<T>> span_to(gsl::span<T> span) {
-  static_assert(std::is_constructible<Container<detail::remove_cvref_t<T>>, 
typename gsl::span<T>::iterator, typename gsl::span<T>::iterator>::value,
-      "The destination container must have an iterator (pointer) range 
constructor");
+Container<detail::remove_cvref_t<T>> span_to(std::span<T> span) {
+  static_assert(std::is_constructible<Container<detail::remove_cvref_t<T>>, 
typename std::span<T>::iterator, typename std::span<T>::iterator>::value,
+                "The destination container must have an iterator (pointer) 
range constructor");
   return span_to<Container<detail::remove_cvref_t<T>>>(span);
 }
 
-template<typename T>
-struct is_not_null : std::false_type {};
-template<typename T>
-struct is_not_null<gsl::not_null<T>> : std::true_type {};
-template<typename T>
-inline constexpr bool is_not_null_v = is_not_null<T>::value;
-}  // namespace utils
+// WARNING! check type aliasing rules for safe usage
+template<typename T, typename U>
+std::span<T> as_span(std::span<U> value) {
+  return std::span{reinterpret_cast<T*>(value.data()), value.size_bytes() / 
sizeof(T)};
+}
 
-}  // namespace org::apache::nifi::minifi
+}  // namespace org::apache::nifi::minifi::utils
diff --git a/libminifi/src/c2/C2Agent.cpp b/libminifi/src/c2/C2Agent.cpp
index 434faf16b..8a7986242 100644
--- a/libminifi/src/c2/C2Agent.cpp
+++ b/libminifi/src/c2/C2Agent.cpp
@@ -943,7 +943,7 @@ void C2Agent::handleAssetUpdate(const C2ContentResponse& 
resp) {
   auto send_error = [&] (std::string_view error) {
     logger_->log_error("%s", std::string(error));
     C2Payload response(Operation::ACKNOWLEDGE, state::UpdateState::SET_ERROR, 
resp.ident, true);
-    response.setRawData(gsl::span<const char>(error).as_span<const 
std::byte>());
+    response.setRawData(as_bytes(std::span(error.begin(), error.end())));
     enqueue_c2_response(std::move(response));
   };
   std::filesystem::path asset_dir = 
std::filesystem::path(configuration_->getHome()) / "asset";
diff --git a/libminifi/src/c2/C2Payload.cpp b/libminifi/src/c2/C2Payload.cpp
index a6bae275e..3e5c2c462 100644
--- a/libminifi/src/c2/C2Payload.cpp
+++ b/libminifi/src/c2/C2Payload.cpp
@@ -22,11 +22,7 @@
 #include <string>
 #include "utils/StringUtils.h"
 
-namespace org {
-namespace apache {
-namespace nifi {
-namespace minifi {
-namespace c2 {
+namespace org::apache::nifi::minifi::c2 {
 
 C2Payload::C2Payload(Operation op, std::string identifier, bool isRaw)
     : C2Payload(op, state::UpdateState::FULLY_APPLIED, std::move(identifier), 
isRaw) {
@@ -72,7 +68,7 @@ void C2Payload::setRawData(const std::vector<char> &data) {
   setRawData(gsl::make_span(data).as_span<const std::byte>());
 }
 
-void C2Payload::setRawData(gsl::span<const std::byte> data) {
+void C2Payload::setRawData(std::span<const std::byte> data) {
   raw_data_.reserve(raw_data_.size() + data.size());
   raw_data_.insert(std::end(raw_data_), std::begin(data), std::end(data));
 }
@@ -147,8 +143,4 @@ std::ostream& operator<<(std::ostream& out, const 
AnnotatedValue& val) {
   return out;
 }
 
-} /* namespace c2 */
-} /* namespace minifi */
-} /* namespace nifi */
-} /* namespace apache */
-} /* namespace org */
+}  // namespace org::apache::nifi::minifi::c2
diff --git a/libminifi/src/c2/protocols/RESTProtocol.cpp 
b/libminifi/src/c2/protocols/RESTProtocol.cpp
index 1e573eb58..ef3b6d35e 100644
--- a/libminifi/src/c2/protocols/RESTProtocol.cpp
+++ b/libminifi/src/c2/protocols/RESTProtocol.cpp
@@ -55,12 +55,11 @@ AnnotatedValue parseAnnotatedValue(const rapidjson::Value& 
jsonValue) {
   return result;
 }
 
-C2Payload RESTProtocol::parseJsonResponse(const C2Payload &payload, 
gsl::span<const std::byte> response) {
+C2Payload RESTProtocol::parseJsonResponse(const C2Payload &payload, 
std::span<const std::byte> response) {
   rapidjson::Document root;
-  const auto char_span = response.as_span<const char>();
 
   try {
-    rapidjson::ParseResult ok = root.Parse(char_span.data(), char_span.size());
+    rapidjson::ParseResult ok = root.Parse(reinterpret_cast<const 
char*>(response.data()), response.size());
     if (ok) {
       std::string identifier;
       for (auto key : {"operationid", "operationId", "identifier"}) {
diff --git a/libminifi/src/core/ConfigurableComponent.cpp 
b/libminifi/src/core/ConfigurableComponent.cpp
index 135e9229b..4fd3f84ad 100644
--- a/libminifi/src/core/ConfigurableComponent.cpp
+++ b/libminifi/src/core/ConfigurableComponent.cpp
@@ -168,7 +168,7 @@ bool ConfigurableComponent::setProperty(const Property& 
prop, PropertyValue &val
   }
 }
 
-void ConfigurableComponent::setSupportedProperties(gsl::span<const 
core::Property> properties) {
+void ConfigurableComponent::setSupportedProperties(std::span<const 
core::Property> properties) {
   if (!canEdit()) {
     return;
   }
diff --git a/libminifi/src/core/Connectable.cpp 
b/libminifi/src/core/Connectable.cpp
index c3bc0803b..f97188c4d 100644
--- a/libminifi/src/core/Connectable.cpp
+++ b/libminifi/src/core/Connectable.cpp
@@ -41,7 +41,7 @@ Connectable::Connectable(std::string name)
 
 Connectable::~Connectable() = default;
 
-void Connectable::setSupportedRelationships(gsl::span<const 
core::Relationship> relationships) {
+void Connectable::setSupportedRelationships(std::span<const 
core::Relationship> relationships) {
   if (isRunning()) {
     logger_->log_warn("Can not set processor supported relationship while the 
process %s is running", name_);
     return;
@@ -74,7 +74,7 @@ bool Connectable::isSupportedRelationship(const 
core::Relationship &relationship
   return relationships_.contains(relationship.getName());
 }
 
-void Connectable::setAutoTerminatedRelationships(gsl::span<const 
core::Relationship> relationships) {
+void Connectable::setAutoTerminatedRelationships(std::span<const 
core::Relationship> relationships) {
   if (isRunning()) {
     logger_->log_warn("Can not set processor auto terminated relationship 
while the process %s is running", name_);
     return;
diff --git a/libminifi/src/core/ProcessSession.cpp 
b/libminifi/src/core/ProcessSession.cpp
index 8bf30dc1c..5bd15cd4b 100644
--- a/libminifi/src/core/ProcessSession.cpp
+++ b/libminifi/src/core/ProcessSession.cpp
@@ -268,10 +268,10 @@ void ProcessSession::write(const 
std::shared_ptr<core::FlowFile> &flow, const io
   }
 }
 
-void ProcessSession::writeBuffer(const std::shared_ptr<core::FlowFile>& 
flow_file, gsl::span<const char> buffer) {
-  writeBuffer(flow_file, buffer.as_span<const std::byte>());
+void ProcessSession::writeBuffer(const std::shared_ptr<core::FlowFile>& 
flow_file, std::span<const char> buffer) {
+  writeBuffer(flow_file, as_bytes(buffer));
 }
-void ProcessSession::writeBuffer(const std::shared_ptr<core::FlowFile>& 
flow_file, gsl::span<const std::byte> buffer) {
+void ProcessSession::writeBuffer(const std::shared_ptr<core::FlowFile>& 
flow_file, std::span<const std::byte> buffer) {
   write(flow_file, [buffer](const std::shared_ptr<io::OutputStream>& 
output_stream) {
     const auto write_status = output_stream->write(buffer);
     return io::isError(write_status) ? -1 : gsl::narrow<int64_t>(write_status);
@@ -319,10 +319,10 @@ void ProcessSession::append(const 
std::shared_ptr<core::FlowFile> &flow, const i
     throw;
   }
 }
-void ProcessSession::appendBuffer(const std::shared_ptr<core::FlowFile>& 
flow_file, gsl::span<const char> buffer) {
-  appendBuffer(flow_file, buffer.as_span<const std::byte>());
+void ProcessSession::appendBuffer(const std::shared_ptr<core::FlowFile>& 
flow_file, std::span<const char> buffer) {
+  appendBuffer(flow_file, as_bytes(buffer));
 }
-void ProcessSession::appendBuffer(const std::shared_ptr<core::FlowFile>& 
flow_file, gsl::span<const std::byte> buffer) {
+void ProcessSession::appendBuffer(const std::shared_ptr<core::FlowFile>& 
flow_file, std::span<const std::byte> buffer) {
   append(flow_file, [buffer](const std::shared_ptr<io::OutputStream>& 
output_stream) {
     const auto write_status = output_stream->write(buffer);
     return io::isError(write_status) ? -1 : gsl::narrow<int64_t>(write_status);
diff --git a/libminifi/src/core/Repository.cpp 
b/libminifi/src/core/Repository.cpp
index 2cf596108..c9f9d4f22 100644
--- a/libminifi/src/core/Repository.cpp
+++ b/libminifi/src/core/Repository.cpp
@@ -36,7 +36,7 @@ bool Repository::storeElement(const 
std::shared_ptr<core::SerializableComponent>
 
   element->serialize(stream);
 
-  if (!Put(element->getUUIDStr(), 
const_cast<uint8_t*>(stream.getBuffer().as_span<const uint8_t>().data()), 
stream.size())) {
+  if (!Put(element->getUUIDStr(), reinterpret_cast<const 
uint8_t*>(stream.getBuffer().data()), stream.size())) {
     logger_->log_error("NiFi Provenance Store event %s size %llu fail", 
element->getUUIDStr(), stream.size());
     return false;
   }
diff --git a/libminifi/src/core/repository/VolatileRepository.cpp 
b/libminifi/src/core/repository/VolatileRepository.cpp
index 161f9f357..8201f7190 100644
--- a/libminifi/src/core/repository/VolatileRepository.cpp
+++ b/libminifi/src/core/repository/VolatileRepository.cpp
@@ -81,7 +81,7 @@ bool VolatileRepository::Put(const std::string& key, const 
uint8_t *buf, size_t
 
 bool VolatileRepository::MultiPut(const std::vector<std::pair<std::string, 
std::unique_ptr<io::BufferStream>>>& data) {
   for (const auto& item : data) {
-    if (!Put(item.first, item.second->getBuffer().template as_span<const 
uint8_t>().data(), item.second->size())) {
+    if (!Put(item.first, reinterpret_cast<const 
uint8_t*>(item.second->getBuffer().data()), item.second->size())) {
       return false;
     }
   }
diff --git a/libminifi/src/io/BufferStream.cpp 
b/libminifi/src/io/BufferStream.cpp
index b853f7b16..de52a5115 100644
--- a/libminifi/src/io/BufferStream.cpp
+++ b/libminifi/src/io/BufferStream.cpp
@@ -22,11 +22,7 @@
 #include "io/BufferStream.h"
 #include "utils/gsl.h"
 
-namespace org {
-namespace apache {
-namespace nifi {
-namespace minifi {
-namespace io {
+namespace org::apache::nifi::minifi::io {
 
 size_t BufferStream::write(const uint8_t *value, size_t size) {
   size_t originalSize = buffer_.size();
@@ -35,7 +31,7 @@ size_t BufferStream::write(const uint8_t *value, size_t size) 
{
   return size;
 }
 
-size_t BufferStream::read(gsl::span<std::byte> buf) {
+size_t BufferStream::read(std::span<std::byte> buf) {
   const auto bytes_available_in_buffer = buffer_.size() - readOffset_;
   const auto readlen = std::min(buf.size(), 
gsl::narrow<size_t>(bytes_available_in_buffer));
   const auto begin = buffer_.begin() + 
gsl::narrow<decltype(buffer_)::difference_type>(readOffset_);
@@ -47,8 +43,4 @@ size_t BufferStream::read(gsl::span<std::byte> buf) {
   return readlen;
 }
 
-} /* namespace io */
-} /* namespace minifi */
-} /* namespace nifi */
-} /* namespace apache */
-} /* namespace org */
+}  // namespace org::apache::nifi::minifi::io
diff --git a/libminifi/src/io/ClientSocket.cpp 
b/libminifi/src/io/ClientSocket.cpp
index 0fe3fa411..c5fe134aa 100644
--- a/libminifi/src/io/ClientSocket.cpp
+++ b/libminifi/src/io/ClientSocket.cpp
@@ -468,7 +468,7 @@ size_t Socket::write(const uint8_t *value, size_t size) {
   return bytes;
 }
 
-size_t Socket::read(gsl::span<std::byte> buf, bool retrieve_all_bytes) {
+size_t Socket::read(std::span<std::byte> buf, bool retrieve_all_bytes) {
   size_t total_read = 0;
   while (!buf.empty()) {
     int16_t fd = select_descriptor(1000);
diff --git a/libminifi/src/io/DescriptorStream.cpp 
b/libminifi/src/io/DescriptorStream.cpp
index 041741cdd..be00e26cb 100644
--- a/libminifi/src/io/DescriptorStream.cpp
+++ b/libminifi/src/io/DescriptorStream.cpp
@@ -29,11 +29,7 @@
 #include <unistd.h>
 #endif
 
-namespace org {
-namespace apache {
-namespace nifi {
-namespace minifi {
-namespace io {
+namespace org::apache::nifi::minifi::io {
 
 DescriptorStream::DescriptorStream(int fd)
     : fd_(fd) {
@@ -72,7 +68,7 @@ size_t DescriptorStream::write(const uint8_t *value, size_t 
size) {
   }
 }
 
-size_t DescriptorStream::read(gsl::span<std::byte> buf) {
+size_t DescriptorStream::read(std::span<std::byte> buf) {
   if (buf.empty()) return 0;
 #ifdef WIN32
   const auto size_read = _read(fd_, buf.data(), buf.size());
@@ -86,9 +82,4 @@ size_t DescriptorStream::read(gsl::span<std::byte> buf) {
   return gsl::narrow<size_t>(size_read);
 }
 
-} /* namespace io */
-} /* namespace minifi */
-} /* namespace nifi */
-} /* namespace apache */
-} /* namespace org */
-
+}  // namespace org::apache::nifi::minifi::io
diff --git a/libminifi/src/io/FileStream.cpp b/libminifi/src/io/FileStream.cpp
index 0d128c942..302c25c9f 100644
--- a/libminifi/src/io/FileStream.cpp
+++ b/libminifi/src/io/FileStream.cpp
@@ -135,7 +135,7 @@ size_t FileStream::write(const uint8_t *value, size_t size) 
{
   return size;
 }
 
-size_t FileStream::read(gsl::span<std::byte> buf) {
+size_t FileStream::read(std::span<std::byte> buf) {
   if (buf.empty()) { return 0; }
   std::lock_guard<std::mutex> lock(file_lock_);
   if (file_stream_ == nullptr || !file_stream_->is_open()) {
diff --git a/libminifi/src/io/StreamSlice.cpp b/libminifi/src/io/StreamSlice.cpp
index a585cbafe..50fa91c37 100644
--- a/libminifi/src/io/StreamSlice.cpp
+++ b/libminifi/src/io/StreamSlice.cpp
@@ -26,7 +26,7 @@ StreamSlice::StreamSlice(std::shared_ptr<io::InputStream> 
stream, size_t offset,
     throw std::invalid_argument("StreamSlice is bigger than the Stream");
 }
 
-size_t StreamSlice::read(gsl::span<std::byte> out_buffer) {
+size_t StreamSlice::read(std::span<std::byte> out_buffer) {
   const size_t max_size = std::min(out_buffer.size(), size() - tell());
   return stream_->read(out_buffer.subspan(0, max_size));
 }
@@ -39,7 +39,7 @@ size_t StreamSlice::tell() const {
   return stream_->tell() - slice_offset_;
 }
 
-gsl::span<const std::byte> StreamSlice::getBuffer() const {
+std::span<const std::byte> StreamSlice::getBuffer() const {
   return stream_->getBuffer().subspan(slice_offset_, slice_size_);
 }
 
diff --git a/libminifi/src/io/tls/SecureDescriptorStream.cpp 
b/libminifi/src/io/tls/SecureDescriptorStream.cpp
index 5c32b7702..94cd26380 100644
--- a/libminifi/src/io/tls/SecureDescriptorStream.cpp
+++ b/libminifi/src/io/tls/SecureDescriptorStream.cpp
@@ -71,7 +71,7 @@ size_t SecureDescriptorStream::write(const uint8_t *value, 
size_t size) {
   return size;
 }
 
-size_t SecureDescriptorStream::read(gsl::span<std::byte> buf) {
+size_t SecureDescriptorStream::read(std::span<std::byte> buf) {
   if (buf.empty()) { return 0; }
   size_t total_read = 0;
   std::byte* writepos = buf.data();
diff --git a/libminifi/src/io/tls/TLSSocket.cpp 
b/libminifi/src/io/tls/TLSSocket.cpp
index 9ac1cab5f..4019cc15c 100644
--- a/libminifi/src/io/tls/TLSSocket.cpp
+++ b/libminifi/src/io/tls/TLSSocket.cpp
@@ -347,7 +347,7 @@ int16_t TLSSocket::select_descriptor(const uint16_t msec) {
   return -1;
 }
 
-size_t TLSSocket::read(gsl::span<std::byte> buffer, bool) {
+size_t TLSSocket::read(std::span<std::byte> buffer, bool) {
   size_t total_read = 0;
   int status = 0;
   int loc = 0;
@@ -416,7 +416,7 @@ size_t TLSSocket::write(const uint8_t *value, size_t size) {
   return writeData(value, size, fd);
 }
 
-size_t TLSSocket::read(gsl::span<std::byte> buffer) {
+size_t TLSSocket::read(std::span<std::byte> buffer) {
   size_t total_read = 0;
   int status = 0;
   auto* buf = buffer.data();
diff --git a/libminifi/src/utils/BaseHTTPClient.cpp 
b/libminifi/src/utils/BaseHTTPClient.cpp
index 2124e285d..7f802efb5 100644
--- a/libminifi/src/utils/BaseHTTPClient.cpp
+++ b/libminifi/src/utils/BaseHTTPClient.cpp
@@ -250,8 +250,8 @@ size_t 
HTTPUploadByteArrayInputCallback::setPosition(int64_t offset) {
 size_t HTTPUploadStreamContentsCallback::getDataChunk(char *data, size_t size) 
{
   logger_->log_trace("HTTPUploadStreamContentsCallback is asked for up to %zu 
bytes", size);
 
-  gsl::span<char> buffer{data, size};
-  size_t num_read = input_stream_->read(buffer.as_span<std::byte>());
+  std::span<char> buffer{data, size};
+  size_t num_read = input_stream_->read(as_writable_bytes(buffer));
 
   if (io::isError(num_read)) {
     logger_->log_error("Error reading the input stream in 
HTTPUploadStreamContentsCallback");
diff --git a/libminifi/src/utils/LineByLineInputOutputStreamCallback.cpp 
b/libminifi/src/utils/LineByLineInputOutputStreamCallback.cpp
index 9f11131d5..af2307e5c 100644
--- a/libminifi/src/utils/LineByLineInputOutputStreamCallback.cpp
+++ b/libminifi/src/utils/LineByLineInputOutputStreamCallback.cpp
@@ -18,6 +18,7 @@
 #include "utils/LineByLineInputOutputStreamCallback.h"
 
 #include "utils/gsl.h"
+#include "utils/span.h"
 
 namespace org::apache::nifi::minifi::utils {
 
@@ -67,7 +68,7 @@ void LineByLineInputOutputStreamCallback::readLine() {
   if (end_of_line != input_.end()) { ++end_of_line; }
 
   current_line_ = next_line_;
-  next_line_ = utils::span_to<std::string>(gsl::make_span(&*current_pos_, 
&*end_of_line).as_span<char>());
+  next_line_ = 
utils::span_to<std::string>(utils::as_span<char>(std::span(std::to_address(current_pos_),
 std::to_address(end_of_line))));
   current_pos_ = end_of_line;
 }
 
diff --git a/libminifi/src/utils/StringUtils.cpp 
b/libminifi/src/utils/StringUtils.cpp
index 84b7a531b..0b0217569 100644
--- a/libminifi/src/utils/StringUtils.cpp
+++ b/libminifi/src/utils/StringUtils.cpp
@@ -318,7 +318,7 @@ std::vector<std::byte> 
StringUtils::from_hex(std::string_view hex) {
   return decoded;
 }
 
-size_t StringUtils::to_hex(char* hex, gsl::span<const std::byte> 
data_to_be_transformed, bool uppercase) {
+size_t StringUtils::to_hex(char* hex, std::span<const std::byte> 
data_to_be_transformed, bool uppercase) {
   if (data_to_be_transformed.size() > std::numeric_limits<size_t>::max() / 2) {
     throw std::length_error("Data is too large to be hexencoded");
   }
@@ -329,7 +329,7 @@ size_t StringUtils::to_hex(char* hex, gsl::span<const 
std::byte> data_to_be_tran
   return data_to_be_transformed.size() * 2;
 }
 
-std::string StringUtils::to_hex(gsl::span<const std::byte> 
data_to_be_transformed, bool uppercase /*= false*/) {
+std::string StringUtils::to_hex(std::span<const std::byte> 
data_to_be_transformed, bool uppercase /*= false*/) {
   if (data_to_be_transformed.size() > (std::numeric_limits<size_t>::max() / 2 
- 1)) {
     throw std::length_error("Data is too large to be hexencoded");
   }
@@ -418,7 +418,7 @@ std::vector<std::byte> StringUtils::from_base64(const 
std::string_view base64) {
   return decoded;
 }
 
-size_t StringUtils::to_base64(char* base64, const gsl::span<const std::byte> 
raw_data, bool url, bool padded) {
+size_t StringUtils::to_base64(char* base64, const std::span<const std::byte> 
raw_data, bool url, bool padded) {
   gsl_Expects(base64);
   if (raw_data.size() > std::numeric_limits<size_t>::max() * 3 / 4 - 3) {
     throw std::length_error("Data is too large to be base64 encoded");
@@ -452,7 +452,7 @@ size_t StringUtils::to_base64(char* base64, const 
gsl::span<const std::byte> raw
   return base64_length;
 }
 
-std::string StringUtils::to_base64(const gsl::span<const std::byte> raw_data, 
bool url /*= false*/, bool padded /*= true*/) {
+std::string StringUtils::to_base64(const std::span<const std::byte> raw_data, 
bool url /*= false*/, bool padded /*= true*/) {
   std::string buf;
   buf.resize((raw_data.size() / 3 + 1) * 4);
   size_t base64_length = to_base64(buf.data(), raw_data, url, padded);
@@ -461,7 +461,7 @@ std::string StringUtils::to_base64(const gsl::span<const 
std::byte> raw_data, bo
   return buf;
 }
 
-std::string StringUtils::escapeUnprintableBytes(gsl::span<const std::byte> 
data) {
+std::string StringUtils::escapeUnprintableBytes(std::span<const std::byte> 
data) {
   constexpr const char* hex_digits = "0123456789abcdef";
   std::string result;
   for (auto byte : data) {
diff --git a/libminifi/src/utils/crypto/EncryptionUtils.cpp 
b/libminifi/src/utils/crypto/EncryptionUtils.cpp
index 2d0ceaf33..d04acc5ff 100644
--- a/libminifi/src/utils/crypto/EncryptionUtils.cpp
+++ b/libminifi/src/utils/crypto/EncryptionUtils.cpp
@@ -23,20 +23,16 @@
 #include <string>
 
 #include "utils/StringUtils.h"
+#include "utils/span.h"
 
-namespace org {
-namespace apache {
-namespace nifi {
-namespace minifi {
-namespace utils {
-namespace crypto {
+namespace org::apache::nifi::minifi::utils::crypto {
 
 Bytes stringToBytes(const std::string& text) {
-  return utils::span_to<std::vector>(gsl::make_span(text).as_span<const 
Bytes::value_type>());
+  return utils::span_to<std::vector>(utils::as_span<const 
Bytes::value_type>(std::span(text)));
 }
 
 std::string bytesToString(const Bytes& bytes) {
-  return utils::span_to<std::string>(gsl::make_span(bytes).as_span<const 
char>());
+  return utils::span_to<std::string>(utils::as_span<const 
char>(std::span(bytes)));
 }
 
 Bytes generateKey() {
@@ -135,9 +131,4 @@ bool isEncrypted(const std::string& input) {
   }
 }
 
-}  // namespace crypto
-}  // namespace utils
-}  // namespace minifi
-}  // namespace nifi
-}  // namespace apache
-}  // namespace org
+}  // namespace org::apache::nifi::minifi::utils::crypto
diff --git a/libminifi/src/utils/crypto/ciphers/Aes256Ecb.cpp 
b/libminifi/src/utils/crypto/ciphers/Aes256Ecb.cpp
index 0c11307f9..ccc8571b4 100644
--- a/libminifi/src/utils/crypto/ciphers/Aes256Ecb.cpp
+++ b/libminifi/src/utils/crypto/ciphers/Aes256Ecb.cpp
@@ -23,12 +23,7 @@
 #include "openssl/rand.h"
 #include "core/logging/LoggerConfiguration.h"
 
-namespace org {
-namespace apache {
-namespace nifi {
-namespace minifi {
-namespace utils {
-namespace crypto {
+namespace org::apache::nifi::minifi::utils::crypto {
 
 using EVP_CIPHER_CTX_ptr = std::unique_ptr<EVP_CIPHER_CTX, 
decltype(&EVP_CIPHER_CTX_free)>;
 
@@ -54,7 +49,7 @@ Bytes Aes256EcbCipher::generateKey() {
   return utils::crypto::randomBytes(KEY_SIZE);
 }
 
-void Aes256EcbCipher::encrypt(gsl::span<unsigned char /*, BLOCK_SIZE*/> data) 
const {
+void Aes256EcbCipher::encrypt(std::span<unsigned char, BLOCK_SIZE> data) const 
{
   gsl_Expects(data.size() == BLOCK_SIZE);
   EVP_CIPHER_CTX_ptr ctx(EVP_CIPHER_CTX_new(), EVP_CIPHER_CTX_free);
   if (!ctx) {
@@ -74,12 +69,12 @@ void Aes256EcbCipher::encrypt(gsl::span<unsigned char /*, 
BLOCK_SIZE*/> data) co
   int ciphertext_len = 0;
   int len;
 
-  if (1 != EVP_EncryptUpdate(ctx.get(), data.begin(), &len, data.begin(), 
data.size())) {
+  if (1 != EVP_EncryptUpdate(ctx.get(), data.data(), &len, data.data(), 
data.size())) {
     handleOpenSSLError("Could not update cipher content");
   }
   ciphertext_len += len;
 
-  if (1 != EVP_EncryptFinal_ex(ctx.get(), data.begin() + len, &len)) {
+  if (1 != EVP_EncryptFinal_ex(ctx.get(), data.data() + len, &len)) {
     handleOpenSSLError("Could not finalize encryption");
   }
   ciphertext_len += len;
@@ -87,7 +82,7 @@ void Aes256EcbCipher::encrypt(gsl::span<unsigned char /*, 
BLOCK_SIZE*/> data) co
   gsl_Expects(ciphertext_len == BLOCK_SIZE);
 }
 
-void Aes256EcbCipher::decrypt(gsl::span<unsigned char /*, BLOCK_SIZE*/> data) 
const {
+void Aes256EcbCipher::decrypt(std::span<unsigned char, BLOCK_SIZE> data) const 
{
   gsl_Expects(data.size() == BLOCK_SIZE);
   EVP_CIPHER_CTX_ptr ctx(EVP_CIPHER_CTX_new(), EVP_CIPHER_CTX_free);
   if (!ctx) {
@@ -106,12 +101,12 @@ void Aes256EcbCipher::decrypt(gsl::span<unsigned char /*, 
BLOCK_SIZE*/> data) co
   int plaintext_len = 0;
   int len;
 
-  if (1 != EVP_DecryptUpdate(ctx.get(), data.begin(), &len, data.begin(), 
data.size())) {
+  if (1 != EVP_DecryptUpdate(ctx.get(), data.data(), &len, data.data(), 
data.size())) {
     handleOpenSSLError("Could not update cipher content");
   }
   plaintext_len += len;
 
-  if (1 != EVP_DecryptFinal_ex(ctx.get(), data.begin() + len, &len)) {
+  if (1 != EVP_DecryptFinal_ex(ctx.get(), data.data() + len, &len)) {
     handleOpenSSLError("Could not finalize decryption");
   }
   plaintext_len += len;
@@ -125,9 +120,4 @@ bool Aes256EcbCipher::operator==(const Aes256EcbCipher 
&other) const {
   return CRYPTO_memcmp(encryption_key_.data(), other.encryption_key_.data(), 
KEY_SIZE) == 0;
 }
 
-}  // namespace crypto
-}  // namespace utils
-}  // namespace minifi
-}  // namespace nifi
-}  // namespace apache
-}  // namespace org
+}  // namespace org::apache::nifi::minifi::utils::crypto
diff --git a/libminifi/src/utils/file/FileUtils.cpp 
b/libminifi/src/utils/file/FileUtils.cpp
index 0a8635a00..79f8df9a6 100644
--- a/libminifi/src/utils/file/FileUtils.cpp
+++ b/libminifi/src/utils/file/FileUtils.cpp
@@ -50,7 +50,7 @@ bool contains(const std::filesystem::path& file_path, 
std::string_view text_to_s
   gsl_Expects(text_to_search.size() <= 8_KiB);
   gsl_ExpectsAudit(std::filesystem::exists(file_path));
   std::array<char, 16_KiB> buf{};
-  gsl::span<char> view;
+  std::span<char> view;
 
   Searcher searcher(text_to_search.begin(), text_to_search.end());
 
@@ -58,7 +58,7 @@ bool contains(const std::filesystem::path& file_path, 
std::string_view text_to_s
   do {
     std::copy(buf.end() - text_to_search.size(), buf.end(), buf.begin());
     ifs.read(buf.data() + text_to_search.size(), buf.size() - 
text_to_search.size());
-    view = gsl::span<char>(buf.data(), text_to_search.size() + 
gsl::narrow<size_t>(ifs.gcount()));
+    view = std::span<char>(buf.data(), text_to_search.size() + 
gsl::narrow<size_t>(ifs.gcount()));
     if (std::search(view.begin(), view.end(), searcher) != view.end()) {
       return true;
     }
diff --git a/libminifi/test/TestBase.cpp b/libminifi/test/TestBase.cpp
index cb61f540f..79632ce98 100644
--- a/libminifi/test/TestBase.cpp
+++ b/libminifi/test/TestBase.cpp
@@ -35,6 +35,7 @@
 #include "core/extension/ExtensionManager.h"
 #include "utils/Id.h"
 #include "utils/StringUtils.h"
+#include "utils/span.h"
 #include "LogUtils.h"
 
 #include "spdlog/spdlog.h"
@@ -645,7 +646,7 @@ std::string TestPlan::getContent(const 
minifi::core::FlowFile& file) const {
   auto content_stream = content_repo_->read(*content_claim);
   auto output_stream = std::make_shared<minifi::io::BufferStream>();
   minifi::InputStreamPipe{*output_stream}(content_stream);
-  return utils::span_to<std::string>(output_stream->getBuffer().as_span<const 
char>());
+  return utils::span_to<std::string>(utils::as_span<const 
char>(output_stream->getBuffer()));
 }
 
 TestController::TestController()
diff --git a/libminifi/test/Utils.h b/libminifi/test/Utils.h
index 4f37b399e..4e3145c1f 100644
--- a/libminifi/test/Utils.h
+++ b/libminifi/test/Utils.h
@@ -141,8 +141,8 @@ std::error_code sendUdpDatagram(const asio::const_buffer 
content, const asio::ip
   return err;
 }
 
-std::error_code sendUdpDatagram(const gsl::span<std::byte const> content, 
const asio::ip::udp::endpoint& remote_endpoint) {
-  return sendUdpDatagram(asio::const_buffer(content.begin(), content.size()), 
remote_endpoint);
+std::error_code sendUdpDatagram(const std::span<std::byte const> content, 
const asio::ip::udp::endpoint& remote_endpoint) {
+  return sendUdpDatagram(asio::const_buffer(content.data(), content.size()), 
remote_endpoint);
 }
 
 std::error_code sendUdpDatagram(const std::string_view content, const 
asio::ip::udp::endpoint& remote_endpoint) {
diff --git a/libminifi/test/archive-tests/ArchiveStreamTests.cpp 
b/libminifi/test/archive-tests/ArchiveStreamTests.cpp
index 42513335c..cbb13ac10 100644
--- a/libminifi/test/archive-tests/ArchiveStreamTests.cpp
+++ b/libminifi/test/archive-tests/ArchiveStreamTests.cpp
@@ -48,7 +48,7 @@ TEST_CASE("Create and read archive") {
       ++extracted_entries;
       std::string file_content;
       file_content.resize(info->size);
-      
REQUIRE(decompressor.read(minifi::gsl::make_span(file_content).as_span<std::byte>())
 == file_content.length());
+      REQUIRE(decompressor.read(as_writable_bytes(std::span(file_content))) == 
file_content.length());
       REQUIRE(files[info->filename] == file_content);
     }
     REQUIRE(extracted_entries == files.size());
diff --git a/libminifi/test/archive-tests/CompressContentTests.cpp 
b/libminifi/test/archive-tests/CompressContentTests.cpp
index f33955905..086c51168 100644
--- a/libminifi/test/archive-tests/CompressContentTests.cpp
+++ b/libminifi/test/archive-tests/CompressContentTests.cpp
@@ -57,7 +57,7 @@ class ReadCallback {
   int64_t operator()(const std::shared_ptr<minifi::io::InputStream>& stream) {
     int64_t total_read = 0;
     do {
-      const auto ret = 
stream->read(gsl::make_span(buffer_).subspan(read_size_));
+      const auto ret = stream->read(std::span(buffer_).subspan(read_size_));
       if (ret == 0) break;
       if (minifi::io::isError(ret)) return -1;
       read_size_ += gsl::narrow<size_t>(ret);
diff --git a/libminifi/test/archive-tests/MergeFileTests.cpp 
b/libminifi/test/archive-tests/MergeFileTests.cpp
index 19718465f..d0a2b7df1 100644
--- a/libminifi/test/archive-tests/MergeFileTests.cpp
+++ b/libminifi/test/archive-tests/MergeFileTests.cpp
@@ -41,6 +41,7 @@
 #include "serialization/PayloadSerializer.h"
 #include "../Utils.h"
 #include "utils/gsl.h"
+#include "utils/span.h"
 
 std::string FLOW_FILE;
 std::string EXPECT_MERGE_CONTENT_FIRST;
@@ -88,7 +89,7 @@ class FixedBuffer {
     REQUIRE(size_ + len <= capacity_);
     int total_read = 0;
     do {
-      const size_t ret{input.read(gsl::make_span(end(), 
len).as_span<std::byte>())};
+      const size_t ret{input.read(as_writable_bytes(std::span(end(), len)))};
       if (ret == 0) break;
       if (minifi::io::isError(ret)) return -1;
       size_ += ret;
@@ -111,7 +112,7 @@ std::vector<FixedBuffer> read_archives(const FixedBuffer& 
input) {
   class ArchiveEntryReader {
    public:
     explicit ArchiveEntryReader(archive* arch) : arch(arch) {}
-    size_t read(gsl::span<std::byte> out_buffer) {
+    size_t read(std::span<std::byte> out_buffer) {
       const auto ret = archive_read_data(arch, out_buffer.data(), 
out_buffer.size());
       return ret < 0 ? minifi::io::STREAM_ERROR : gsl::narrow<size_t>(ret);
     }
@@ -752,7 +753,7 @@ TEST_CASE("FlowFile serialization", 
"[testFlowFileSerialization]") {
   }
   writeString(footer, result);
 
-  const auto expected = 
utils::span_to<std::string>(result->getBuffer().as_span<const char>());
+  const auto expected = utils::span_to<std::string>(utils::as_span<const 
char>(result->getBuffer()));
 
   auto factory = std::make_shared<core::ProcessSessionFactory>(context);
   merge_content_processor->onSchedule(context, factory);
diff --git a/libminifi/test/azure-tests/MockBlobStorage.h 
b/libminifi/test/azure-tests/MockBlobStorage.h
index 996fef1c8..fb7e8ec54 100644
--- a/libminifi/test/azure-tests/MockBlobStorage.h
+++ b/libminifi/test/azure-tests/MockBlobStorage.h
@@ -25,6 +25,7 @@
 
 #include "storage/BlobStorageClient.h"
 #include "azure/core/io/body_stream.hpp"
+#include "utils/span.h"
 
 class MockBlobStorage : public minifi::azure::storage::BlobStorageClient {
  public:
@@ -41,13 +42,13 @@ class MockBlobStorage : public 
minifi::azure::storage::BlobStorageClient {
     return true;
   }
 
-  Azure::Storage::Blobs::Models::UploadBlockBlobResult uploadBlob(const 
minifi::azure::storage::PutAzureBlobStorageParameters& params, gsl::span<const 
std::byte> buffer) override {
+  Azure::Storage::Blobs::Models::UploadBlockBlobResult uploadBlob(const 
minifi::azure::storage::PutAzureBlobStorageParameters& params, std::span<const 
std::byte> buffer) override {
     put_params_ = params;
     if (upload_fails_) {
       throw std::runtime_error("error");
     }
 
-    input_data_ = utils::span_to<std::string>(buffer.as_span<const char>());
+    input_data_ = utils::span_to<std::string>(utils::as_span<const 
char>(buffer));
 
     Azure::Storage::Blobs::Models::UploadBlockBlobResult result;
     result.ETag = Azure::ETag{ETAG};
diff --git a/libminifi/test/azure-tests/MockDataLakeStorageClient.h 
b/libminifi/test/azure-tests/MockDataLakeStorageClient.h
index 5d6c42c3d..03a5f46b1 100644
--- a/libminifi/test/azure-tests/MockDataLakeStorageClient.h
+++ b/libminifi/test/azure-tests/MockDataLakeStorageClient.h
@@ -26,6 +26,7 @@
 
 #include "storage/DataLakeStorageClient.h"
 #include "io/BufferStream.h"
+#include "utils/span.h"
 
 class MockDataLakeStorageClient : public 
org::apache::nifi::minifi::azure::storage::DataLakeStorageClient {
  public:
@@ -41,8 +42,9 @@ class MockDataLakeStorageClient : public 
org::apache::nifi::minifi::azure::stora
     return create_file_;
   }
 
-  std::string uploadFile(const 
org::apache::nifi::minifi::azure::storage::PutAzureDataLakeStorageParameters& 
params, gsl::span<const std::byte> buffer) override {
-    input_data_ = 
org::apache::nifi::minifi::utils::span_to<std::string>(buffer.as_span<const 
char>());
+  std::string uploadFile(const 
org::apache::nifi::minifi::azure::storage::PutAzureDataLakeStorageParameters& 
params, std::span<const std::byte> buffer) override {
+    namespace utils = org::apache::nifi::minifi::utils;
+    input_data_ = utils::span_to<std::string>(utils::as_span<const 
char>(buffer));
     put_params_ = params;
 
     if (upload_fails_) {
diff --git a/libminifi/test/rocksdb-tests/EncryptionTests.cpp 
b/libminifi/test/rocksdb-tests/EncryptionTests.cpp
index b544d7016..9dd6577f3 100644
--- a/libminifi/test/rocksdb-tests/EncryptionTests.cpp
+++ b/libminifi/test/rocksdb-tests/EncryptionTests.cpp
@@ -22,6 +22,7 @@
 #include "utils/IntegrationTestUtils.h"
 #include "repository/VolatileContentRepository.h"
 #include "FlowFileRecord.h"
+#include "utils/span.h"
 
 using core::repository::FlowFileRepository;
 
@@ -43,7 +44,7 @@ class FFRepoFixture : public TestController {
   static void putFlowFile(const std::shared_ptr<minifi::FlowFileRecord>& 
flowfile, const std::shared_ptr<core::repository::FlowFileRepository>& repo) {
     minifi::io::BufferStream buffer;
     flowfile->Serialize(buffer);
-    const auto buf = buffer.getBuffer().as_span<const uint8_t>();
+    const auto buf = utils::as_span<const uint8_t>(buffer.getBuffer());
     REQUIRE(repo->Put(flowfile->getUUIDStr(), buf.data(), buf.size()));
   }
 
diff --git a/libminifi/test/rocksdb-tests/RocksDBStreamTests.cpp 
b/libminifi/test/rocksdb-tests/RocksDBStreamTests.cpp
index e6c8d01ec..63830b23a 100644
--- a/libminifi/test/rocksdb-tests/RocksDBStreamTests.cpp
+++ b/libminifi/test/rocksdb-tests/RocksDBStreamTests.cpp
@@ -75,9 +75,9 @@ TEST_CASE_METHOD(RocksDBStreamTest, "Read zero bytes") {
   minifi::io::RocksDbStream stream("one", gsl::make_not_null(db.get()));
 
   std::byte fake_buffer[1];
-  REQUIRE(stream.read(gsl::make_span(fake_buffer).subspan(0, 0)) == 0);
+  REQUIRE(stream.read(std::span(fake_buffer).subspan(0, 0)) == 0);
 
   minifi::io::RocksDbStream nonExistingStream("two", 
gsl::make_not_null(db.get()));
 
-  
REQUIRE(minifi::io::isError(nonExistingStream.read(gsl::make_span(fake_buffer).subspan(0,
 0))));
+  
REQUIRE(minifi::io::isError(nonExistingStream.read(std::span(fake_buffer).subspan(0,
 0))));
 }
diff --git a/libminifi/test/rocksdb-tests/SwapTests.cpp 
b/libminifi/test/rocksdb-tests/SwapTests.cpp
index 07d0219df..3bfa19542 100644
--- a/libminifi/test/rocksdb-tests/SwapTests.cpp
+++ b/libminifi/test/rocksdb-tests/SwapTests.cpp
@@ -57,7 +57,7 @@ class OutputProcessor : public core::Processor {
     auto ff = session->create();
     ff->addAttribute("index", id);
     session->write(ff, [&] (const std::shared_ptr<minifi::io::OutputStream>& 
output) -> int64_t {
-      auto ret = output->write(gsl::span<const char>(id.data(), 
id.size()).as_span<const std::byte>());
+      auto ret = output->write(as_bytes(std::span(id)));
       if (minifi::io::isError(ret)) {
         return -1;
       }
diff --git a/libminifi/test/unit/FileStreamTests.cpp 
b/libminifi/test/unit/FileStreamTests.cpp
index 7032be269..314f2ba8e 100644
--- a/libminifi/test/unit/FileStreamTests.cpp
+++ b/libminifi/test/unit/FileStreamTests.cpp
@@ -228,7 +228,7 @@ TEST_CASE("Read zero bytes") {
   auto dir = testController.createTempDirectory();
   minifi::io::FileStream stream(dir / "test.txt", 0, true);
   std::byte fake_buffer[1];
-  REQUIRE(stream.read(gsl::make_span(fake_buffer).subspan(0, 0)) == 0);
+  REQUIRE(stream.read(std::span(fake_buffer).subspan(0, 0)) == 0);
 }
 
 TEST_CASE("Non-existing file read/write test") {
diff --git a/libminifi/test/unit/FileSystemRepositoryTests.cpp 
b/libminifi/test/unit/FileSystemRepositoryTests.cpp
index 5aa652e54..f21dafd1b 100644
--- a/libminifi/test/unit/FileSystemRepositoryTests.cpp
+++ b/libminifi/test/unit/FileSystemRepositoryTests.cpp
@@ -61,9 +61,9 @@ TEST_CASE("Test Physical memory usage", 
"[testphysicalmemoryusage]") {
   auto resource_id = content_session->create();
   auto stream = content_session->write(resource_id);
   size_t file_size = 20_MB;
-  gsl::span<const char> fragment = "well, hello there";
+  std::span<const char> fragment = "well, hello there";
   for (size_t i = 0; i < file_size / fragment.size() + 1; ++i) {
-    stream->write(fragment.as_span<const std::byte>());
+    stream->write(as_bytes(fragment));
   }
 
   using org::apache::nifi::minifi::utils::verifyEventHappenedInPollTime;
diff --git a/libminifi/test/unit/FlowFileSerializationTests.cpp 
b/libminifi/test/unit/FlowFileSerializationTests.cpp
index b623f4887..04c58bd19 100644
--- a/libminifi/test/unit/FlowFileSerializationTests.cpp
+++ b/libminifi/test/unit/FlowFileSerializationTests.cpp
@@ -25,6 +25,7 @@
 #include "../TestBase.h"
 #include "../Catch.h"
 #include "utils/gsl.h"
+#include "utils/span.h"
 #include "FlowFile.h"
 #include "FlowFileRecord.h"
 
@@ -50,7 +51,7 @@ TEST_CASE("Payload Serializer", "[testPayload]") {
     return cb(contentStream);
   });
   serializer.serialize(flowFile, result);
-  const auto serialized = 
utils::span_to<std::string>(result->getBuffer().as_span<const char>());
+  const auto serialized = utils::span_to<std::string>(utils::as_span<const 
char>(result->getBuffer()));
   REQUIRE(serialized == content);
 }
 
@@ -70,7 +71,7 @@ TEST_CASE("FFv3 Serializer", "[testFFv3]") {
     return cb(contentStream);
   });
   serializer.serialize(flowFile, result);
-  const auto serialized = 
utils::span_to<std::string>(result->getBuffer().as_span<const char>());
+  const auto serialized = utils::span_to<std::string>(utils::as_span<const 
char>(result->getBuffer()));
 
   std::string expected = "NiFiFF3";
   expected += std::string("\x00\x02", 2);  // number of attributes
diff --git a/libminifi/test/unit/LineByLineInputOutputStreamCallbackTests.cpp 
b/libminifi/test/unit/LineByLineInputOutputStreamCallbackTests.cpp
index 74e59f1c6..1e1abd80e 100644
--- a/libminifi/test/unit/LineByLineInputOutputStreamCallbackTests.cpp
+++ b/libminifi/test/unit/LineByLineInputOutputStreamCallbackTests.cpp
@@ -21,6 +21,7 @@
 #include "core/logging/LoggerConfiguration.h"
 #include "io/BufferStream.h"
 #include "spdlog/spdlog.h"
+#include "utils/span.h"
 
 using minifi::utils::LineByLineInputOutputStreamCallback;
 
@@ -71,7 +72,7 @@ TEST_CASE("LineByLineInputOutputStreamCallback can process a 
stream line by line
 
   LineByLineInputOutputStreamCallback 
line_by_line_input_output_stream_callback{line_processor};
   line_by_line_input_output_stream_callback(input_stream, output_stream);
-  const auto output_data = 
utils::span_to<std::string>(output_stream->getBuffer().as_span<const char>());
+  const auto output_data = utils::span_to<std::string>(utils::as_span<const 
char>(output_stream->getBuffer()));
   CHECK(output_data == expected_output);
 }
 
@@ -92,7 +93,7 @@ TEST_CASE("LineByLineInputOutputStreamCallback can handle 
Windows line endings",
 
   LineByLineInputOutputStreamCallback 
line_by_line_input_output_stream_callback{line_processor};
   line_by_line_input_output_stream_callback(input_stream, output_stream);
-  const auto output_data = 
utils::span_to<std::string>(output_stream->getBuffer().as_span<const char>());
+  const auto output_data = utils::span_to<std::string>(utils::as_span<const 
char>(output_stream->getBuffer()));
   CHECK(output_data == expected_output);
 }
 
diff --git a/libminifi/test/unit/LoggerTests.cpp 
b/libminifi/test/unit/LoggerTests.cpp
index 1fef27fa1..7a2e2ec65 100644
--- a/libminifi/test/unit/LoggerTests.cpp
+++ b/libminifi/test/unit/LoggerTests.cpp
@@ -26,6 +26,7 @@
 #include "io/ZlibStream.h"
 #include "StreamPipe.h"
 #include "utils/IntegrationTestUtils.h"
+#include "utils/span.h"
 
 using namespace std::literals::chrono_literals;
 
@@ -193,7 +194,7 @@ std::string decompress(const std::shared_ptr<InputStream>& 
input) {
   auto decompressor = 
std::make_shared<ZlibDecompressStream>(gsl::make_not_null(output.get()));
   minifi::internal::pipe(*input, *decompressor);
   decompressor->close();
-  return utils::span_to<std::string>(output->getBuffer().as_span<const 
char>());
+  return utils::span_to<std::string>(utils::as_span<const 
char>(output->getBuffer()));
 }
 
 TEST_CASE("Test Compression", "[ttl9]") {
diff --git a/libminifi/test/unit/ProvenanceTestHelper.h 
b/libminifi/test/unit/ProvenanceTestHelper.h
index 3f5a16c72..ec979e172 100644
--- a/libminifi/test/unit/ProvenanceTestHelper.h
+++ b/libminifi/test/unit/ProvenanceTestHelper.h
@@ -65,8 +65,7 @@ class TestRepositoryBase : public T_BaseRepository {
 
   bool MultiPut(const std::vector<std::pair<std::string, 
std::unique_ptr<org::apache::nifi::minifi::io::BufferStream>>>& data) override {
     for (const auto& item : data) {
-      const auto buf = item.second->getBuffer().as_span<const uint8_t>();
-      if (!Put(item.first, buf.data(), buf.size())) {
+      if (!Put(item.first, reinterpret_cast<const 
uint8_t*>(item.second->getBuffer().data()), item.second->size())) {
         return false;
       }
     }
diff --git a/libminifi/test/unit/SiteToSiteHelper.h 
b/libminifi/test/unit/SiteToSiteHelper.h
index ed98ba76e..1a8c52423 100644
--- a/libminifi/test/unit/SiteToSiteHelper.h
+++ b/libminifi/test/unit/SiteToSiteHelper.h
@@ -62,7 +62,7 @@ class SiteToSiteResponder : public minifi::io::BaseStream {
    * @param len length to read
    * @return resulting read size
    **/
-  size_t read(gsl::span<std::byte> out_buffer) override {
+  size_t read(std::span<std::byte> out_buffer) override {
     return server_responses_.read(out_buffer);
   }
 };
diff --git a/libminifi/test/unit/GslTest.cpp b/libminifi/test/unit/SpanTests.cpp
similarity index 77%
rename from libminifi/test/unit/GslTest.cpp
rename to libminifi/test/unit/SpanTests.cpp
index b85255486..4b648c8e4 100644
--- a/libminifi/test/unit/GslTest.cpp
+++ b/libminifi/test/unit/SpanTests.cpp
@@ -20,12 +20,12 @@
 #include <string>
 #include "../TestBase.h"
 #include "../Catch.h"
-#include "utils/gsl.h"
+#include "utils/span.h"
 
 namespace utils = org::apache::nifi::minifi::utils;
 
-TEST_CASE("span to", "[span to]") {
-  const auto test_span = gsl::make_span("test text", 9);
+TEST_CASE("span_to") {
+  const auto test_span = std::span("test text", 9);
   const auto string = utils::span_to<std::string>(test_span);
   const auto vector = utils::span_to<std::vector>(test_span);
 
@@ -33,3 +33,11 @@ TEST_CASE("span to", "[span to]") {
   REQUIRE('t' == vector[0]);
   REQUIRE(9 == vector.size());
 }
+
+TEST_CASE("as_span") {
+  const auto test_span = as_bytes(std::span("test text", 9));
+  const auto char_span = utils::as_span<const char>(test_span);
+
+  REQUIRE(char_span.size() == test_span.size());
+  REQUIRE(char_span[0] == 't');
+}
diff --git a/libminifi/test/unit/StreamTests.cpp 
b/libminifi/test/unit/StreamTests.cpp
index dc77c5438..a104ac74c 100644
--- a/libminifi/test/unit/StreamTests.cpp
+++ b/libminifi/test/unit/StreamTests.cpp
@@ -27,6 +27,7 @@
 #include "../Catch.h"
 #include "io/BaseStream.h"
 #include "io/StreamSlice.h"
+#include "utils/span.h"
 
 TEST_CASE("TestReadData", "[testread]") {
   auto base = std::make_shared<minifi::io::BufferStream>();
@@ -76,7 +77,7 @@ TEST_CASE("TestWrite1", "[testwrite]") {
   auto base = std::make_shared<minifi::io::BufferStream>();
   base->write((uint64_t)0x0102030405060708);
   std::string bytes(8, '\0');
-  REQUIRE(8 == base->read(gsl::make_span(bytes).as_span<std::byte>()));
+  REQUIRE(8 == base->read(as_writable_bytes(std::span(bytes))));
   REQUIRE(bytes == "\x01\x02\x03\x04\x05\x06\x07\x08");
 }
 
@@ -102,5 +103,5 @@ TEST_CASE("StreamSliceTest1", "[teststreamslice]") {
   REQUIRE(stream_slice->read(buffer2) == 4);
   buffer2.resize(4);
   REQUIRE(buffer == buffer2);
-  
REQUIRE(utils::span_to<std::vector>(gsl::make_span(buffer).as_span<uint8_t>()) 
== std::vector<uint8_t>({3, 4, 5, 6}));
+  
REQUIRE(utils::span_to<std::vector>(utils::as_span<uint8_t>(std::span(buffer))) 
== std::vector<uint8_t>({3, 4, 5, 6}));
 }
diff --git a/libminifi/test/unit/StringUtilsTests.cpp 
b/libminifi/test/unit/StringUtilsTests.cpp
index 2b64b5af5..a63c963fb 100644
--- a/libminifi/test/unit/StringUtilsTests.cpp
+++ b/libminifi/test/unit/StringUtilsTests.cpp
@@ -369,34 +369,24 @@ TEST_CASE("TestStringUtils::testBase64Encode", "[test 
base64 encode]") {
   REQUIRE("b29vb28" == StringUtils::to_base64("ooooo", false /*url*/, false 
/*padded*/));
   REQUIRE("b29vb29v" == StringUtils::to_base64("oooooo", false /*url*/, false 
/*padded*/));
 
+  std::vector<uint8_t> message{
+      0x00, 0x10, 0x83, 0x10,
+      0x51, 0x87, 0x20, 0x92,
+      0x8b, 0x30, 0xd3, 0x8f,
+      0x41, 0x14, 0x93, 0x51,
+      0x55, 0x97, 0x61, 0x96,
+      0x9b, 0x71, 0xd7, 0x9f,
+      0x82, 0x18, 0xa3, 0x92,
+      0x59, 0xa7, 0xa2, 0x9a,
+      0xab, 0xb2, 0xdb, 0xaf,
+      0xc3, 0x1c, 0xb3, 0xd3,
+      0x5d, 0xb7, 0xe3, 0x9e,
+      0xbb, 0xf3, 0xdf, 0xbf};
+
   REQUIRE("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ==
-      StringUtils::to_base64(gsl::make_span(std::vector<uint8_t>{
-          0x00, 0x10, 0x83, 0x10,
-          0x51, 0x87, 0x20, 0x92,
-          0x8b, 0x30, 0xd3, 0x8f,
-          0x41, 0x14, 0x93, 0x51,
-          0x55, 0x97, 0x61, 0x96,
-          0x9b, 0x71, 0xd7, 0x9f,
-          0x82, 0x18, 0xa3, 0x92,
-          0x59, 0xa7, 0xa2, 0x9a,
-          0xab, 0xb2, 0xdb, 0xaf,
-          0xc3, 0x1c, 0xb3, 0xd3,
-          0x5d, 0xb7, 0xe3, 0x9e,
-          0xbb, 0xf3, 0xdf, 0xbf}).as_span<const std::byte>()));
+      StringUtils::to_base64(as_bytes(std::span(message))));
   REQUIRE("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" ==
-      StringUtils::to_base64(gsl::make_span(std::vector<uint8_t>{
-          0x00, 0x10, 0x83, 0x10,
-          0x51, 0x87, 0x20, 0x92,
-          0x8b, 0x30, 0xd3, 0x8f,
-          0x41, 0x14, 0x93, 0x51,
-          0x55, 0x97, 0x61, 0x96,
-          0x9b, 0x71, 0xd7, 0x9f,
-          0x82, 0x18, 0xa3, 0x92,
-          0x59, 0xa7, 0xa2, 0x9a,
-          0xab, 0xb2, 0xdb, 0xaf,
-          0xc3, 0x1c, 0xb3, 0xd3,
-          0x5d, 0xb7, 0xe3, 0x9e,
-          0xbb, 0xf3, 0xdf, 0xbf}).as_span<const std::byte>(), true /*url*/));
+      StringUtils::to_base64(as_bytes(std::span(message)), true /*url*/));
 }
 
 TEST_CASE("TestStringUtils::testBase64Decode", "[test base64 decode]") {
@@ -536,8 +526,8 @@ TEST_CASE("StringUtils::removeFramingCharacters works 
correctly", "[removeFramin
 
 // ignore terminating \0 character
 template<size_t N>
-gsl::span<const std::byte> from_cstring(const char (&str)[N]) {
-  return gsl::span<const char>(str, N-1).as_span<const std::byte>();
+std::span<const std::byte> from_cstring(const char (&str)[N]) {
+  return as_bytes(std::span<const char>(str, N-1));
 }
 
 TEST_CASE("StringUtils::escapeUnprintableBytes", "[escapeUnprintableBytes]") {
diff --git a/libminifi/test/unit/ZlibStreamTests.cpp 
b/libminifi/test/unit/ZlibStreamTests.cpp
index 9d5cfcbce..c69db9871 100644
--- a/libminifi/test/unit/ZlibStreamTests.cpp
+++ b/libminifi/test/unit/ZlibStreamTests.cpp
@@ -24,6 +24,7 @@
 #include "io/ZlibStream.h"
 #include "utils/gsl.h"
 #include "utils/StringUtils.h"
+#include "utils/span.h"
 
 namespace io = org::apache::nifi::minifi::io;
 
@@ -75,7 +76,7 @@ TEST_CASE("gzip compression and decompression", "[basic]") {
   decompressStream.write(compressBuffer.getBuffer());
 
   REQUIRE(decompressStream.isFinished());
-  REQUIRE(original == 
utils::span_to<std::string>(decompressBuffer.getBuffer().as_span<const 
char>()));
+  REQUIRE(original == utils::span_to<std::string>(utils::as_span<const 
char>(decompressBuffer.getBuffer())));
 }
 
 TEST_CASE("gzip compression and decompression pipeline", "[basic]") {
@@ -114,5 +115,5 @@ TEST_CASE("gzip compression and decompression pipeline", 
"[basic]") {
   compressStream.close();
 
   REQUIRE(decompressStream.isFinished());
-  REQUIRE(original == 
utils::span_to<std::string>(output.getBuffer().as_span<const char>()));
+  REQUIRE(original == utils::span_to<std::string>(utils::as_span<const 
char>(output.getBuffer())));
 }
diff --git a/nanofi/tests/CSite2SiteTests.cpp b/nanofi/tests/CSite2SiteTests.cpp
index 5a6d6df87..2aabc0881 100644
--- a/nanofi/tests/CSite2SiteTests.cpp
+++ b/nanofi/tests/CSite2SiteTests.cpp
@@ -134,7 +134,7 @@ void accept_transfer(minifi::io::BaseStream* stream, const 
std::string& crcstr,
 void sunny_path_bootstrap(minifi::io::BaseStream* stream, TransferState& 
transfer_state, S2SReceivedData& s2s_data) {
   // Verify the magic string
   s2s_data.magic_string.resize(4);
-  stream->read(gsl::make_span(s2s_data.magic_string).as_span<std::byte>());
+  stream->read(as_writable_bytes(std::span(s2s_data.magic_string)));
   uint8_t success = 0x14;
   stream->write(&success, 1);
   send_response_code(stream, 0x1);
@@ -145,7 +145,7 @@ void sunny_path_bootstrap(minifi::io::BaseStream* stream, 
TransferState& transfe
   size_t read_len = 0;
   std::array<std::byte, 1000> handshake_data{};
   while (!found_codec) {
-    const auto actual_len = 
stream->read(gsl::make_span(handshake_data).subspan(read_len));
+    const auto actual_len = 
stream->read(std::span(handshake_data).subspan(read_len));
     if(actual_len == 0 || minifi::io::isError(actual_len)) {
       continue;
     }

Reply via email to