1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
/*
* Copyright 2020 Google LLC All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
use crate::generated::quilkin::filters::concatenate::v1alpha1 as proto;
mod config;
use crate::filters::prelude::*;
pub use config::{Config, Strategy};
/// The `Concatenate` filter's job is to add a byte packet to either the
/// beginning or end of each UDP packet that passes through. This is commonly
/// used to provide an auth token to each packet, so they can be
/// routed appropriately.
pub struct Concatenate {
on_read: Strategy,
on_write: Strategy,
bytes: Vec<u8>,
}
impl Concatenate {
pub fn new(config: Config) -> Self {
Concatenate {
on_read: config.on_read,
on_write: config.on_write,
bytes: config.bytes,
}
}
}
#[async_trait::async_trait]
impl Filter for Concatenate {
async fn read(&self, ctx: &mut ReadContext) -> Result<(), FilterError> {
match self.on_read {
Strategy::Append => {
ctx.contents.extend_from_slice(&self.bytes);
}
Strategy::Prepend => {
ctx.contents.prepend_from_slice(&self.bytes);
}
Strategy::DoNothing => {}
}
Ok(())
}
async fn write(&self, ctx: &mut WriteContext) -> Result<(), FilterError> {
match self.on_write {
Strategy::Append => {
ctx.contents.extend_from_slice(&self.bytes);
}
Strategy::Prepend => {
ctx.contents.prepend_from_slice(&self.bytes);
}
Strategy::DoNothing => {}
}
Ok(())
}
}
impl StaticFilter for Concatenate {
const NAME: &'static str = "quilkin.filters.concatenate.v1alpha1.Concatenate";
type Configuration = Config;
type BinaryConfiguration = proto::Concatenate;
fn try_from_config(config: Option<Self::Configuration>) -> Result<Self, CreationError> {
Ok(Concatenate::new(Self::ensure_config_exists(config)?))
}
}