Skip to content

Commit

Permalink
support for utf16 files
Browse files Browse the repository at this point in the history
Signed-off-by: goenning <me@goenning.net>
  • Loading branch information
goenning committed Nov 30, 2024
1 parent 3ee4ae5 commit 6b48da8
Showing 1 changed file with 30 additions and 3 deletions.
33 changes: 30 additions & 3 deletions kube-client/src/config/file_config.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::{
collections::HashMap,
fs,
fs, io,
path::{Path, PathBuf},
};

Expand Down Expand Up @@ -351,8 +351,8 @@ const KUBECONFIG: &str = "KUBECONFIG";
impl Kubeconfig {
/// Read a Config from an arbitrary location
pub fn read_from<P: AsRef<Path>>(path: P) -> Result<Kubeconfig, KubeconfigError> {
let data = fs::read_to_string(&path)
.map_err(|source| KubeconfigError::ReadConfig(source, path.as_ref().into()))?;
let data =
read_path(&path).map_err(|source| KubeconfigError::ReadConfig(source, path.as_ref().into()))?;

// Remap all files we read to absolute paths.
let mut merged_docs = None;
Expand Down Expand Up @@ -497,6 +497,33 @@ where
});
}

fn read_path<P: AsRef<Path>>(path: P) -> io::Result<String> {
let bytes = fs::read(&path)?;
match bytes.as_slice() {
[0xFF, 0xFE, ..] => {
let utf16_data: Vec<u16> = bytes[2..]
.chunks(2)
.map(|chunk| u16::from_le_bytes([chunk[0], chunk[1]]))
.collect();
String::from_utf16(&utf16_data)
.map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid UTF-16 LE"))
}
[0xFE, 0xFF, ..] => {
let utf16_data: Vec<u16> = bytes[2..]
.chunks(2)
.map(|chunk| u16::from_be_bytes([chunk[0], chunk[1]]))
.collect();
String::from_utf16(&utf16_data)
.map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid UTF-16 BE"))
}
[0xEF, 0xBB, 0xBF, ..] => String::from_utf8(bytes[3..].to_vec())
.map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid UTF-8 BOM")),
_ => {
String::from_utf8(bytes).map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid UTF-8"))
}
}
}

fn to_absolute(dir: &Path, file: &str) -> Option<String> {
let path = Path::new(&file);
if path.is_relative() {
Expand Down

0 comments on commit 6b48da8

Please sign in to comment.