You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.1 KiB
69 lines
2.1 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace AIK.Common.StompNet
|
|
{
|
|
/// <summary>
|
|
/// STOMP帧结构
|
|
/// </summary>
|
|
public static class StompFrameHelper
|
|
{
|
|
private static readonly byte[] NullByte = { 0 };
|
|
|
|
public static byte[] BuildFrame(string command, Dictionary<string, string>? headers = null, string? body = null)
|
|
{
|
|
var sb = new StringBuilder();
|
|
sb.Append(command).Append('\n');
|
|
|
|
if (headers != null)
|
|
{
|
|
foreach (var header in headers)
|
|
{
|
|
sb.Append($"{header.Key}:{header.Value}").Append("\n");
|
|
}
|
|
}
|
|
|
|
sb.Append("\n"); // 空行
|
|
sb.Append("\u0000"); // 结束符
|
|
var headerBytes = Encoding.UTF8.GetBytes(sb.ToString());
|
|
|
|
return headerBytes;
|
|
}
|
|
|
|
public static (string command, Dictionary<string, string> headers, string body)? ParseFrame(byte[] data)
|
|
{
|
|
if (data.Length == 0 || data[data.Length - 1] != 0) return null;
|
|
|
|
var text = Encoding.UTF8.GetString(data, 0, data.Length - 1); // 去掉
|
|
var parts = text.Split(new[] { "\r\n\r\n", "\n\n" }, 2, StringSplitOptions.None);
|
|
|
|
if (parts.Length < 1) return null;
|
|
|
|
var headerSection = parts[0];
|
|
var body = parts.Length > 1 ? parts[1] : "";
|
|
|
|
var lines = headerSection.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
|
|
if (lines.Length == 0) return null;
|
|
|
|
var command = lines[0].Trim();
|
|
var headers = new Dictionary<string, string>();
|
|
|
|
for (int i = 1; i < lines.Length; i++)
|
|
{
|
|
var line = lines[i];
|
|
var idx = line.IndexOf(':');
|
|
if (idx > 0)
|
|
{
|
|
var key = line.Substring(0, idx).Trim();
|
|
var value = line.Substring(idx + 1).Trim();
|
|
headers[key] = value;
|
|
}
|
|
}
|
|
|
|
return (command, headers, body);
|
|
}
|
|
}
|
|
}
|
|
|