/// <summary> /// Retrieves the identified data from the server. /// </summary> /// <returns> /// Returns the content's MIME and the decompressed data as a stream (optionally that /// supplied as <c>output_file</c>), along with the length of the content in bytes. /// </returns> /// <param name='uid'> /// The UID of the record to be retrieved. /// </param> /// <param name='read_key'> /// A token that grants permission to read the record. /// </param> /// <param name='output_file'> /// An optional stream into which retrieved content may be written; if <c>null</c>, the /// default, an on-disk, self-cleaning tempfile, is used instead. /// </param> /// <param name='decompress_on_server'> /// Favours decompression of content on the server; defaults to <c>false</c>. /// </param> /// <param name='timeout'> /// The number of seconds to wait for a response; defaults to 5. /// </param> /// <exception cref="System.Exception"> /// Some unknown problem occurred. /// </exception> /// <exception cref="Exceptions.ProtocolError"> /// A problem occurred related to the transport protocol. /// </exception> /// <exception cref="Exceptions.UrlError"> /// A problem occurred related to the network environment. /// </exception> /// <exception cref="Exceptions.NotFoundError"> /// The requested record was not found. /// </exception> /// <exception cref="Exceptions.NotAuthorisedError"> /// The requested record was not accessible with the given credentials. /// </exception> public Structures.Internal.Content Get(string uid, string read_key, System.IO.Stream output_file=null, bool decompress_on_server=false, float timeout=5.0f) { Jayrock.Json.JsonObject get_json = new Jayrock.Json.JsonObject(); get_json.Add("uid", uid); Jayrock.Json.JsonObject keys = new Jayrock.Json.JsonObject(); keys.Add("read", read_key); get_json.Add("keys", keys); System.Collections.Generic.Dictionary<string, string> headers = new System.Collections.Generic.Dictionary<string, string>(); if(!decompress_on_server){ headers.Add(Libraries.Communication.HEADER_SUPPORTED_COMPRESSION, string.Join(Libraries.Communication.HEADER_SUPPORTED_COMPRESSION_DELIMITER.ToString(), Libraries.Compression.SupportedFormats)); } System.Net.HttpWebRequest request = Libraries.Communication.AssembleRequest(this.server.GetHost() + Libraries.Communication.SERVER_GET, get_json, headers:headers); System.IO.Stream output; if(output_file != null){ output = output_file; }else{ output = new Libraries.TempFileStream(); } Libraries.Communication.Response response = Libraries.Communication.SendRequest(request, output:output, timeout:timeout); Structures.Internal.Content content = new Structures.Internal.Content(); content.Data = response.Data; content.Mime = (string)response.Properties[Libraries.Communication.PROPERTY_CONTENT_TYPE]; content.Length = (long)response.Properties[Libraries.Communication.PROPERTY_CONTENT_LENGTH]; //Evaluate decompression requirements object applied_compression = response.Properties[Libraries.Communication.PROPERTY_APPLIED_COMPRESSION]; if(applied_compression != null){ System.IO.Stream decompressed_data = Libraries.Compression.GetDecompressor((COMPRESSION)applied_compression).Invoke(content.Data); if(output_file != null){ //Write to the given stream, since the caller might expect to use that output_file.Seek(0, System.IO.SeekOrigin.Begin); output_file.SetLength(0); //Truncate the file decompressed_data.CopyTo(output_file); output_file.Seek(0, System.IO.SeekOrigin.Begin); content.Data = output_file; content.Length = output_file.Length; } } return content; }
/// <summary> /// Retrieves the requested data from the cache. /// </summary> /// <returns> /// Returns the content's MIME and the decompressed data as a stream (optionally that /// supplied as <c>output_file</c>), along with the length of the content in bytes. /// </returns> /// <param name='uid'> /// The UID of the record to be retrieved. /// </param> /// <param name='read_key'> /// A token that grants permission to read the record. /// </param> /// <param name='output_file'> /// An optional stream into which retrieved content may be written; if <c>null</c>, the /// default, an on-disk, self-cleaning tempfile, is used instead. /// </param> /// <param name='decompress_on_server'> /// Ignored, since this decision is up to the proxy. /// </param> /// <param name='timeout'> /// The number of seconds to wait for a response; defaults to 5. /// </param> /// <exception cref="System.Exception"> /// Some unknown problem occurred. /// </exception> /// <exception cref="Exceptions.ProtocolError"> /// A problem occurred related to the transport protocol. /// </exception> /// <exception cref="Exceptions.UrlError"> /// A problem occurred related to the network environment. /// </exception> /// <exception cref="Exceptions.NotFoundError"> /// The requested record was not found. /// </exception> /// <exception cref="Exceptions.NotAuthorisedError"> /// The requested record was not accessible with the given credentials. /// </exception> public Structures.Internal.Content Get(string uid, string read_key, System.IO.Stream output_file=null, bool decompress_on_server=false, float timeout=5.0f) { Jayrock.Json.JsonObject get_json = new Jayrock.Json.JsonObject(); get_json.Add("uid", uid); Jayrock.Json.JsonObject keys = new Jayrock.Json.JsonObject(); keys.Add("read", read_key); get_json.Add("keys", keys); Jayrock.Json.JsonObject proxy = new Jayrock.Json.JsonObject(); proxy.Add("server", this.server.ToDictionary()); get_json.Add("proxy", proxy); System.Net.HttpWebRequest request = Libraries.Communication.AssembleRequest(this.proxy + Libraries.Communication.SERVER_GET, get_json); Libraries.Communication.Response response = Libraries.Communication.SendRequest(request, timeout:timeout); Structures.Internal.Content content = new Structures.Internal.Content(); if(output_file != null){ content.Data = output_file; }else{ content.Data = new Libraries.TempFileStream(); } response.Data.CopyTo(content.Data); content.Length = content.Data.Length; content.Data.Seek(0, System.IO.SeekOrigin.Begin); content.Mime = (string)response.Properties[Libraries.Communication.PROPERTY_CONTENT_TYPE]; return content; }