Attach metadata to fetched streams from http

This commit is contained in:
Angel Bulfone 2025-03-02 18:18:12 -08:00
parent 8e1385417e
commit 15244b83df
No known key found for this signature in database
GPG Key ID: 23AC71B9B52809FB

View File

@ -6,7 +6,9 @@ use base64::{
}; };
use multipart_rs::MultipartWriter; use multipart_rs::MultipartWriter;
use nu_engine::command_prelude::*; use nu_engine::command_prelude::*;
use nu_protocol::{shell_error::io::IoError, ByteStream, LabeledError, Signals}; use nu_protocol::{
shell_error::io::IoError, ByteStream, DataSource, LabeledError, PipelineMetadata, Signals,
};
use serde_json::Value as JsonValue; use serde_json::Value as JsonValue;
use std::{ use std::{
collections::HashMap, collections::HashMap,
@ -711,7 +713,7 @@ fn transform_response_using_content_type(
.or_else(|_| mime::Mime::from_str("text/plain")) .or_else(|_| mime::Mime::from_str("text/plain"))
.expect("Failed to parse content type, and failed to default to text/plain"); .expect("Failed to parse content type, and failed to default to text/plain");
let ext = match (content_type.type_(), content_type.subtype()) { let (ext, known_mime) = match (content_type.type_(), content_type.subtype()) {
(mime::TEXT, mime::PLAIN) => { (mime::TEXT, mime::PLAIN) => {
let path_extension = url::Url::parse(requested_url) let path_extension = url::Url::parse(requested_url)
.map_err(|err| { .map_err(|err| {
@ -730,26 +732,30 @@ fn transform_response_using_content_type(
.extension() .extension()
.map(|name| name.to_string_lossy().to_string()) .map(|name| name.to_string_lossy().to_string())
}); });
path_extension (path_extension, false)
} }
_ => Some(content_type.subtype().to_string()), _ => (Some(content_type.subtype().to_string()), true),
}; };
let output = response_to_buffer(resp, engine_state, span); let output = response_to_buffer(resp, engine_state, span);
let metadata = PipelineMetadata {
data_source: DataSource::FilePath(requested_url.into()),
content_type: known_mime.then(|| content_type.essence_str().into()),
};
if flags.raw { if flags.raw {
Ok(output) Ok(output.set_metadata(Some(metadata)))
} else if let Some(ext) = ext { } else if let Some(ext) = ext {
match engine_state.find_decl(format!("from {ext}").as_bytes(), &[]) { match engine_state.find_decl(format!("from {ext}").as_bytes(), &[]) {
Some(converter_id) => engine_state.get_decl(converter_id).run( Some(converter_id) => engine_state.get_decl(converter_id).run(
engine_state, engine_state,
stack, stack,
&Call::new(span), &Call::new(span),
output, output.set_metadata(Some(metadata.with_content_type(None))),
), ),
None => Ok(output), None => Ok(output.set_metadata(Some(metadata))),
} }
} else { } else {
Ok(output) Ok(output.set_metadata(Some(metadata)))
} }
} }