private void DecodeMessage(string header, ArraySegment<byte> body)
{
StringBuilder headers = new StringBuilder();
headers.AppendFormat("{0}{1}{2}{3}", kVersionHeaderField, kHeaderFieldDelimeter, FunapiVersion.kProtocolVersion, kHeaderDelimeter);
string[] lines = header.Replace("\r", "").Split('\n');
foreach (string n in lines)
{
if (n.Length > 0)
{
string[] tuple = n.Split(kHeaderSeparator, StringSplitOptions.RemoveEmptyEntries);
string key = tuple[0].ToLower();
string value = "";
if (tuple.Length >= 2)
value = tuple[1];
switch (key)
{
case "content-type":
break;
case "set-cookie":
str_cookie_ = value;
DebugUtils.DebugLog("Set Cookie : {0}", str_cookie_);
break;
case "content-length":
headers.AppendFormat("{0}{1}{2}{3}", kLengthHeaderField, kHeaderFieldDelimeter, value, kHeaderDelimeter);
break;
case "x-ifun-enc":
headers.AppendFormat("{0}{1}{2}{3}", kEncryptionHeaderField, kHeaderFieldDelimeter, value, kHeaderDelimeter);
break;
default:
headers.AppendFormat("{0}{1}{2}{3}", tuple[0], kHeaderFieldDelimeter, value, kHeaderDelimeter);
break;
}
}
else {
break;
}
}
headers.Append(kHeaderDelimeter);
byte[] header_bytes = System.Text.Encoding.ASCII.GetBytes(headers.ToString());
// Checks buffer space
int total_size = header_bytes.Length + body.Count;
received_size_ += total_size;
CheckReceiveBuffer();
// Copy to buffer
// NOTE: offset should be calculated after CheckReceiveBuffer()
// (CheckReceiveBuffer() may change received_size_)
int offset = received_size_ - total_size;
Buffer.BlockCopy(header_bytes, 0, receive_buffer_, offset, header_bytes.Length);
Buffer.BlockCopy(body.Array, 0, receive_buffer_, offset + header_bytes.Length, body.Count);
// Decoding a message
TryToDecodeMessage();
}