/// <summary>LoadContent /// </summary> public override void LoadContent(FastDFSOption option, byte[] data) { MetaData = new Dictionary <string, string>(); int startIndex = 0; int itemSeparaterIndex; do { int keyValueSeparaterIndex = Array.IndexOf <byte>(data, Consts.METADATA_KEY_VALUE_SEPARATOR, startIndex); if (keyValueSeparaterIndex < 0) { throw new ArgumentException("invalid metadata buffer format"); } string key = ByteUtil.ByteToString(data, startIndex, keyValueSeparaterIndex - startIndex, option.Charset); startIndex = keyValueSeparaterIndex + 1; itemSeparaterIndex = Array.IndexOf <byte>(data, Consts.METADATA_PAIR_SEPARATER, startIndex); string value; if (itemSeparaterIndex < 0) { value = ByteUtil.ByteToString(data, startIndex, (data.Length - 1) - startIndex, option.Charset); } else { value = ByteUtil.ByteToString(data, startIndex, itemSeparaterIndex - startIndex, option.Charset); } startIndex = itemSeparaterIndex + 1; MetaData.Add(key, value); } while (itemSeparaterIndex >= 0); }
/// <summary>EncodeBody /// </summary> public override byte[] EncodeBody(FastDFSOption option) { //Header = new FDFSHeader(0, Consts.TRACKER_PROTO_CMD_SERVER_LIST_ALL_GROUPS, 0); var bodyBuffer = new byte[0]; return(bodyBuffer); }
/// <summary>EncodeBody /// </summary> public override byte[] EncodeBody(FastDFSOption option) { var bodyBuffer = EndecodeUtil.EncodeGroupName(GroupName, option.Charset); //Header = new FDFSHeader(Consts.FDFS_GROUP_NAME_MAX_LEN, Consts.TRACKER_PROTO_CMD_SERVER_LIST_STORAGE, 0); return(bodyBuffer); }
/// <summary>LoadContent /// </summary> public override void LoadContent(FastDFSOption option, byte[] data) { int bytesRead = 0; byte[] groupNameBuffer = new byte[Consts.FDFS_GROUP_NAME_MAX_LEN]; Array.Copy(data, bytesRead, groupNameBuffer, 0, Consts.FDFS_GROUP_NAME_MAX_LEN); GroupName = EndecodeUtil.DecodeString(groupNameBuffer, option.Charset); //Util.ByteToString(option.Charset, groupNameBuffer).TrimEnd('\0'); bytesRead += Consts.FDFS_GROUP_NAME_MAX_LEN; byte[] ipAddressBuffer = new byte[Consts.IP_ADDRESS_SIZE - 1]; Array.Copy(data, bytesRead, ipAddressBuffer, 0, Consts.IP_ADDRESS_SIZE - 1); IPAddresses.Add(EndecodeUtil.DecodeString(ipAddressBuffer, option.Charset)); //IPAddresses.Add(new string(option.Charset.GetChars(ipAddressBuffer)).TrimEnd('\0')); bytesRead += Consts.IP_ADDRESS_SIZE - 1; byte[] portBuffer = new byte[Consts.FDFS_PROTO_PKG_LEN_SIZE]; Array.Copy(data, bytesRead, portBuffer, 0, Consts.FDFS_PROTO_PKG_LEN_SIZE); Port = (int)ByteUtil.BufferToLong(portBuffer, 0); bytesRead += Consts.FDFS_PROTO_PKG_LEN_SIZE; while (data.Length - bytesRead >= Consts.IP_ADDRESS_SIZE - 1) { ipAddressBuffer = new byte[Consts.IP_ADDRESS_SIZE - 1]; Array.Copy(data, bytesRead, ipAddressBuffer, 0, Consts.IP_ADDRESS_SIZE - 1); IPAddresses.Add(EndecodeUtil.DecodeString(ipAddressBuffer, option.Charset)); // IPAddresses.Add(new string(option.Charset.GetChars(ipAddressBuffer)).TrimEnd('\0')); bytesRead += Consts.IP_ADDRESS_SIZE - 1; } }
public void ClusterConfigurations_Get_Test() { var option = new FastDFSOption() { ClusterConfigurations = new List <ClusterConfiguration>() { new ClusterConfiguration() { Name = "cluster1", Charset = "utf-8", TrackerMaxConnection = 1, StorageMaxConnection = 2, Trackers = new List <Tracker>() { new Tracker("127.0.0.1", 22122) } } } }; var options = Options.Create <FastDFSOption>(option); IClusterSelector clusterSelector = new DefaultClusterSelector(options); var configuration = clusterSelector.Get("cluster1"); Assert.Equal("cluster1", configuration.Name); Assert.Equal(1, configuration.TrackerMaxConnection); Assert.Equal(2, configuration.StorageMaxConnection); }
/// <summary>EncodeBody /// </summary> public override byte[] EncodeBody(FastDFSOption option) { var groupNameBuffer = EndecodeUtil.EncodeGroupName(GroupName, option.Charset); var fileIdBuffer = EndecodeUtil.EncodeString(FileId, option.Charset); //var length = Consts.FDFS_GROUP_NAME_MAX_LEN + fileIdBuffer.Length; return(ByteUtil.Combine(groupNameBuffer, fileIdBuffer)); }
/// <summary>LoadContent /// </summary> public override void LoadContent(FastDFSOption option, byte[] data) { if (data.Length != Consts.FDFS_GROUP_INFO_SIZE) { throw new ArgumentException($"返回数据长度:{data.Length},不是有效的GroupInfo数据长度."); } GroupInfo = EndecodeUtil.DecodeGroupInfo(data, option.Charset); }
/// <summary>EncodeBody /// </summary> public override byte[] EncodeBody(FastDFSOption option) { //消息体长度为group name的最大长度,16 var bodyBuffer = EndecodeUtil.EncodeGroupName(GropName, option.Charset); //Header = new FDFSHeader(Consts.FDFS_GROUP_NAME_MAX_LEN, Consts.TRACKER_PROTO_CMD_SERVICE_QUERY_STORE_WITH_GROUP_ONE, 0); return(bodyBuffer); }
/// <summary>EncodeBody /// </summary> public override byte[] EncodeBody(FastDFSOption option) { var fileIdLengthBuffer = ByteUtil.LongToBuffer(FileId.Length); var fileSizeBuffer = ByteUtil.LongToBuffer(InputStream.Length); var fileIdBuffer = ByteUtil.StringToByte(FileId, option.Charset); //long length = Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_PROTO_PKG_LEN_SIZE + FileId.Length + RequestStream.Length; return(ByteUtil.Combine(fileIdLengthBuffer, fileSizeBuffer, fileIdBuffer)); }
/// <summary>LoadContent /// </summary> public override void LoadContent(FastDFSOption option, byte[] data) { byte[] groupNameBuffer = new byte[Consts.FDFS_GROUP_NAME_MAX_LEN]; Array.Copy(data, groupNameBuffer, Consts.FDFS_GROUP_NAME_MAX_LEN); GroupName = ByteUtil.ByteToString(groupNameBuffer, option.Charset).TrimEnd('\0'); byte[] fileNameBuffer = new byte[data.Length - Consts.FDFS_GROUP_NAME_MAX_LEN]; Array.Copy(data, Consts.FDFS_GROUP_NAME_MAX_LEN, fileNameBuffer, 0, fileNameBuffer.Length); FileId = ByteUtil.ByteToString(fileNameBuffer, option.Charset).TrimEnd('\0'); }
public DefaultConnectionManager(ILogger <DefaultConnectionManager> logger, IConnectionPoolBuilder connectionPoolFactory, IOptions <FastDFSOption> option) { _logger = logger; _connectionPoolFactory = connectionPoolFactory; _option = option.Value; _trackerConnectionAddresses = new List <ConnectionAddress>(); _trackerConnectionPools = new ConcurrentDictionary <ConnectionAddress, IConnectionPool>(); _storageConnectionPools = new ConcurrentDictionary <ConnectionAddress, IConnectionPool>(); }
/// <summary>LoadContent /// </summary> public override void LoadContent(FastDFSOption option, byte[] data) { var span = data.AsSpan(); var groupNameSpan = span.Slice(0, Consts.FDFS_GROUP_NAME_MAX_LEN); GroupName = EndecodeUtil.DecodeString(groupNameSpan.ToArray(), option.Charset); var fileNameSpan = span.Slice(Consts.FDFS_GROUP_NAME_MAX_LEN, data.Length - Consts.FDFS_GROUP_NAME_MAX_LEN); FileId = EndecodeUtil.DecodeString(fileNameSpan.ToArray(), option.Charset); }
public void ClusterConfigurations_Empty_Test() { var option = new FastDFSOption(); var options = Options.Create <FastDFSOption>(option); IClusterSelector clusterSelector = new DefaultClusterSelector(options); Assert.Throws <ArgumentNullException>(() => { clusterSelector.Get("cluster1"); }); }
/// <summary>EncodeBody /// </summary> public override byte[] EncodeBody(FastDFSOption option) { var groupNameBuffer = EndecodeUtil.EncodeGroupName(GroupName, option.Charset); //文件偏移量 var offsetBuffer = EndecodeUtil.EncodeLong(Offset); //下载文件的大小,全部下载用0 var byteSizeBuffer = EndecodeUtil.EncodeLong(ByteSize); //文件FileId数组 var fileIdBuffer = EndecodeUtil.EncodeString(FileId, option.Charset); //long length = Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_GROUP_NAME_MAX_LEN + FileId.Length; return(ByteUtil.Combine(offsetBuffer, byteSizeBuffer, groupNameBuffer, fileIdBuffer)); }
/// <summary>LoadContent /// </summary> public override void LoadContent(FastDFSOption option, byte[] data) { byte[] fileSizeBuffer = new byte[Consts.FDFS_PROTO_PKG_LEN_SIZE]; byte[] createTimeBuffer = new byte[Consts.FDFS_PROTO_PKG_LEN_SIZE]; byte[] crcBuffer = new byte[Consts.FDFS_PROTO_PKG_LEN_SIZE]; Array.Copy(data, 0, fileSizeBuffer, 0, fileSizeBuffer.Length); Array.Copy(data, Consts.FDFS_PROTO_PKG_LEN_SIZE, createTimeBuffer, 0, createTimeBuffer.Length); Array.Copy(data, Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_PROTO_PKG_LEN_SIZE, crcBuffer, 0, crcBuffer.Length); FileSize = ByteUtil.BufferToLong(data, 0); CreateTime = new System.DateTime(1970, 1, 1).AddSeconds(ByteUtil.BufferToLong(data, Consts.FDFS_PROTO_PKG_LEN_SIZE)); Crc32 = ByteUtil.BufferToLong(data, Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_PROTO_PKG_LEN_SIZE); }
/// <summary>LoadContent /// </summary> public override void LoadContent(FastDFSOption option, byte[] data) { byte[] groupNameBuffer = new byte[Consts.FDFS_GROUP_NAME_MAX_LEN]; Array.Copy(data, groupNameBuffer, Consts.FDFS_GROUP_NAME_MAX_LEN); GroupName = ByteUtil.ByteToString(groupNameBuffer, option.Charset).TrimEnd('\0'); byte[] ipAddressBuffer = new byte[Consts.IP_ADDRESS_SIZE - 1]; Array.Copy(data, Consts.FDFS_GROUP_NAME_MAX_LEN, ipAddressBuffer, 0, Consts.IP_ADDRESS_SIZE - 1); IPAddress = new string(Encoding.GetEncoding(option.Charset).GetChars(ipAddressBuffer)).TrimEnd('\0'); byte[] portBuffer = new byte[Consts.FDFS_PROTO_PKG_LEN_SIZE]; Array.Copy(data, Consts.FDFS_GROUP_NAME_MAX_LEN + Consts.IP_ADDRESS_SIZE - 1, portBuffer, 0, Consts.FDFS_PROTO_PKG_LEN_SIZE); Port = (int)ByteUtil.BufferToLong(portBuffer, 0); }
///// <summary>是否流请求 ///// </summary> //public override bool StreamRequest => true; /// <summary>EncodeBody /// </summary> public override byte[] EncodeBody(FastDFSOption option) { var fileSizeBuffer = ByteUtil.LongToBuffer(InputStream.Length); var extBuffer = EndecodeUtil.EncodeFileExt(FileExt, option.Charset); /*long lenth = 1 + Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_FILE_EXT_NAME_MAX_LEN;*/ var bodyBuffer = new List <byte> { StorePathIndex }; bodyBuffer.AddRange(fileSizeBuffer); bodyBuffer.AddRange(extBuffer); return(bodyBuffer.ToArray()); }
private byte[] CreateMetaDataBuffer(FastDFSOption option, IDictionary <string, string> metaData) { List <byte> metaDataBuffer = new List <byte>(); foreach (KeyValuePair <string, string> p in metaData) { // insert a separater if this is not the first meta data item. if (metaDataBuffer.Count != 0) { metaDataBuffer.Add(Consts.METADATA_PAIR_SEPARATER); } metaDataBuffer.AddRange(EndecodeUtil.EncodeString(p.Key, option.Charset)); metaDataBuffer.Add(Consts.METADATA_KEY_VALUE_SEPARATOR); metaDataBuffer.AddRange(EndecodeUtil.EncodeString(p.Value, option.Charset)); } return(metaDataBuffer.ToArray()); }
/// <summary>LoadContent /// </summary> public override void LoadContent(FastDFSOption option, byte[] data) { var dataSpan = data.AsSpan(); var groupNameBufferSpan = dataSpan.Slice(0, Consts.FDFS_GROUP_NAME_MAX_LEN); GroupName = ByteUtil.ByteToString(groupNameBufferSpan.ToArray(), option.Charset).TrimEnd('\0'); var fileNameBufferSpan = dataSpan.Slice(Consts.FDFS_GROUP_NAME_MAX_LEN); FileId = ByteUtil.ByteToString(fileNameBufferSpan.ToArray(), option.Charset).TrimEnd('\0'); //byte[] groupNameBuffer = new byte[Consts.FDFS_GROUP_NAME_MAX_LEN]; //Array.Copy(data, groupNameBuffer, Consts.FDFS_GROUP_NAME_MAX_LEN); //GroupName = ByteUtil.ByteToString(groupNameBuffer, option.Charset).TrimEnd('\0'); //byte[] fileNameBuffer = new byte[data.Length - Consts.FDFS_GROUP_NAME_MAX_LEN]; //Array.Copy(data, Consts.FDFS_GROUP_NAME_MAX_LEN, fileNameBuffer, 0, fileNameBuffer.Length); //FileId = ByteUtil.ByteToString(fileNameBuffer, option.Charset).TrimEnd('\0'); }
/// <summary>LoadContent /// </summary> public override void LoadContent(FastDFSOption option, byte[] data) { if (data.Length % Consts.FDFS_STORAGE_INFO_SIZE != 0) { throw new ArgumentException("返回数据长度不正确,不是'FDFS_STORAGE_INFO_SIZE' 的整数倍."); } var count = data.Length / Consts.FDFS_STORAGE_INFO_SIZE; var dataSpan = data.AsSpan(); for (int i = 0; i < count; i++) { //var buffer = new byte[Consts.FDFS_STORAGE_INFO_SIZE]; //Array.Copy(data, i * Consts.FDFS_STORAGE_INFO_SIZE, buffer, 0, buffer.Length); var bufferSpan = dataSpan.Slice(i * Consts.FDFS_STORAGE_INFO_SIZE, Consts.FDFS_STORAGE_INFO_SIZE); var storageInfo = EndecodeUtil.DecodeStorageInfo(bufferSpan.ToArray(), option.Charset); StorageInfos.Add(storageInfo); } }
public void ClusterConfigurations_Get_Default_Test() { var option = new FastDFSOption() { ClusterConfigurations = new List <ClusterConfiguration>() { new ClusterConfiguration() { Name = "cluster2", Charset = "utf-8" } } }; var options = Options.Create <FastDFSOption>(option); IClusterSelector clusterSelector = new DefaultClusterSelector(options); var configuration = clusterSelector.Get("cluster1"); Assert.Equal("cluster2", configuration.Name); }
///// <summary>使用流传输 ///// </summary> //public override bool StreamRequest => true; /// <summary>EncodeBody /// </summary> public override byte[] EncodeBody(FastDFSOption option) { //1.StorePathIndex //2.文件长度 var fileSizeBuffer = EndecodeUtil.EncodeLong(InputStream.Length); //3.扩展名 byte[] extBuffer = EndecodeUtil.EncodeFileExt(FileExt, option.Charset); //4.文件数据,这里不写入 //int lenth = 1 + Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_FILE_EXT_NAME_MAX_LEN; var bodyBuffer = new List <byte> { StorePathIndex }; bodyBuffer.AddRange(fileSizeBuffer); bodyBuffer.AddRange(extBuffer); return(bodyBuffer.ToArray()); }
///// <summary>是否流请求 ///// </summary> //public override bool StreamRequest => true; /// <summary>EncodeBody /// </summary> public override byte[] EncodeBody(FastDFSOption option) { //文件名长度数组 var masterFileIdLenBuffer = EndecodeUtil.EncodeLong((long)MasterFileId.Length); //文件长度数组 var fileSizeBuffer = EndecodeUtil.EncodeLong(InputStream.Length); //从文件前缀名数据 var prefixBuffer = EndecodeUtil.EncodePrefix(Prefix, option.Charset); var extBuffer = EndecodeUtil.EncodeFileExt(FileExt, option.Charset); //主文件Id var masterFileIdBuffer = EndecodeUtil.EncodeString(MasterFileId, option.Charset); //2个长度,主文件FileId数组长度,文件长度 //long length = 2 * Consts.FDFS_PROTO_PKG_LEN_SIZE + Consts.FDFS_FILE_PREFIX_MAX_LEN + Consts.FDFS_FILE_EXT_NAME_MAX_LEN + masterFileIdBuffer.Length; return(ByteUtil.Combine(masterFileIdLenBuffer, fileSizeBuffer, prefixBuffer, extBuffer, masterFileIdBuffer)); //文件内容 //Array.Copy(ContentBytes, 0, bodyBuffer, offset, ContentBytes.Length); }
/// <summary>EncodeBody /// </summary> public override byte[] EncodeBody(FastDFSOption option) { string optionString = (Option == MetaDataOption.Overwrite) ? "O" : "M"; var optionBuffer = EndecodeUtil.EncodeString(optionString, option.Charset); var groupNameBuffer = EndecodeUtil.EncodeGroupName(GroupName, option.Charset); var fileIdBuffer = ByteUtil.StringToByte(FileId, option.Charset); var metaDataBuffer = CreateMetaDataBuffer(option, MetaData); var fileIdLengthBuffer = ByteUtil.LongToBuffer(fileIdBuffer.Length); var metaDataSizeBuffer = ByteUtil.LongToBuffer(metaDataBuffer.Length); //int length = Consts.FDFS_PROTO_PKG_LEN_SIZE + // filename length // Consts.FDFS_PROTO_PKG_LEN_SIZE + // metadata size // 1 + // operation flag // Consts.FDFS_GROUP_NAME_MAX_LEN + // group name // fileIdBuffer.Length + // file name // metaDataBuffer.Length; // metadata return(ByteUtil.Combine(fileIdLengthBuffer, metaDataSizeBuffer, optionBuffer, groupNameBuffer, fileIdBuffer, metaDataBuffer)); }
/// <summary>LoadContent /// </summary> public virtual void LoadContent(FastDFSOption option, byte[] data) { }
/// <summary>Ctor /// </summary> public ReConnectHandler(ILogger <ReConnectHandler> logger, FastDFSOption option, Func <Task> reConnectAction) { _logger = logger; _option = option; _reConnectAction = reConnectAction; }
public abstract byte[] EncodeBody(FastDFSOption option);
public void Get_Default_CreateNew_Test() { var option = new FastDFSOption() { ClusterConfigurations = new List <ClusterConfiguration>() { new ClusterConfiguration() { Name = "cluster1", Trackers = new List <Tracker>() { new Tracker("127.0.0.1", 22122) } } } }; var options = Options.Create <FastDFSOption>(option); var mockCluster = new Mock <ICluster>(); mockCluster.Setup(x => x.Name).Returns("cluster1"); var mockScopeServiceProvider = new Mock <IServiceProvider>(); mockScopeServiceProvider.Setup(x => x.GetService(typeof(ICluster))) .Returns(mockCluster.Object); mockScopeServiceProvider.Setup(x => x.GetService(typeof(ClusterConfiguration))) .Returns(option.ClusterConfigurations.FirstOrDefault()); var mockServiceScope = new Mock <IServiceScope>(); mockServiceScope.Setup(x => x.ServiceProvider) .Returns(mockScopeServiceProvider.Object); var mockScopeFactory = new Mock <IServiceScopeFactory>(); mockScopeFactory.Setup(x => x.CreateScope()) .Returns(mockServiceScope.Object); var mockServiceProvider = new Mock <IServiceProvider>(); mockServiceProvider.Setup(x => x.GetService(typeof(IServiceScopeFactory))) .Returns(mockScopeFactory.Object); var mockClusterSelector = new Mock <IClusterSelector>(); mockClusterSelector.Setup(x => x.Get("cluster1")).Returns(option.ClusterConfigurations.FirstOrDefault()); IClusterFactory clusterFactory = new DefaultClusterFactory(_mockLogger.Object, mockServiceProvider.Object, options, mockClusterSelector.Object); var cluster = clusterFactory.Get(""); mockClusterSelector.Verify(x => x.Get("cluster1"), Times.Once); mockScopeServiceProvider.Verify(x => x.GetService(typeof(ICluster)), Times.Once); mockScopeServiceProvider.Verify(x => x.GetService(typeof(ClusterConfiguration)), Times.Once); var cluster2 = clusterFactory.Get(""); Assert.Equal("cluster1", cluster2.Name); }
/// <summary>LoadContent /// </summary> public override void LoadContent(FastDFSOption option, byte[] data) { Content = data; }