104 lines
3.4 KiB
C++
104 lines
3.4 KiB
C++
#include<hgl/type/StrChar.h>
|
||
#include<hgl/type/String.h>
|
||
#include<hgl/io/MemoryOutputStream.h>
|
||
#include<hgl/util/hash/Hash.h>
|
||
|
||
namespace hgl
|
||
{
|
||
namespace network
|
||
{
|
||
/**
|
||
* 获取WebSocket信息
|
||
* @param data 输入的信息头
|
||
* @param size 信息头长度
|
||
* @return 是否解晰成功
|
||
*/
|
||
bool GetWebSocketInfo(UTF8String &sec_websocket_key,UTF8String &sec_websocket_protocol,uint &sec_websocket_version,const char *data,const uint size)
|
||
{
|
||
constexpr char SEC_WEBSOCKET_KEY[]="Sec-WebSocket-Key: ";
|
||
constexpr uint SEC_WEBSOCKET_KEY_SIZE=sizeof(SEC_WEBSOCKET_KEY)-1; //sizeof的带\0所以要-1
|
||
|
||
constexpr char SEC_WEBSOCKET_PROTOCOL[]="Sec-WebSocket-Protocol: ";
|
||
constexpr uint SEC_WEBSOCKET_PROTOCOL_SIZE=sizeof(SEC_WEBSOCKET_PROTOCOL)-1;
|
||
|
||
constexpr char SEC_WEBSOCKET_VERSION[]="Sec-WebSocket-Version: ";
|
||
constexpr uint SEC_WEBSOCKET_VERSION_SIZE=sizeof(SEC_WEBSOCKET_VERSION)-1;
|
||
|
||
if(!data||size<40)return(false);
|
||
|
||
const char *end;
|
||
|
||
{
|
||
const char *key=hgl::strstr(data,size,SEC_WEBSOCKET_KEY,SEC_WEBSOCKET_KEY_SIZE);
|
||
|
||
if(!key)return(false);
|
||
|
||
key+=SEC_WEBSOCKET_KEY_SIZE;
|
||
|
||
end=key;
|
||
while(*end!='\r')++end;
|
||
|
||
sec_websocket_key=UTF8String(key,end-key);
|
||
}
|
||
|
||
{
|
||
const char *protocol=hgl::strstr(data,size,SEC_WEBSOCKET_PROTOCOL,SEC_WEBSOCKET_PROTOCOL_SIZE);
|
||
|
||
if(protocol) //也有可能是不存在的
|
||
{
|
||
protocol+=SEC_WEBSOCKET_PROTOCOL_SIZE;
|
||
end=protocol;
|
||
while(*end!='\r')++end;
|
||
|
||
sec_websocket_protocol.SetString(protocol,end-protocol);
|
||
}
|
||
}
|
||
|
||
{
|
||
const char *version=hgl::strstr(data,size,SEC_WEBSOCKET_VERSION,SEC_WEBSOCKET_VERSION_SIZE);
|
||
|
||
if(version)
|
||
{
|
||
version+=SEC_WEBSOCKET_VERSION_SIZE;
|
||
end=version;
|
||
while(*end!='\r')++end;
|
||
|
||
hgl::stou(version,sec_websocket_version);
|
||
}
|
||
}
|
||
|
||
return(true);
|
||
}
|
||
|
||
///**
|
||
/// 这函数可以用,只是这版SDK没有base64_encode,所以暂时屏蔽
|
||
// * 生成WebSocket回复头
|
||
// * @param result 回复头存放字符串
|
||
// */
|
||
//void MakeWebSocketAccept(UTF8String &result,const UTF8String &sec_websocket_key,const UTF8String &sec_websocket_protocol)
|
||
//{
|
||
// const UTF8String key_mask=sec_websocket_key+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
||
|
||
// util::HashCodeSHA1 hc;
|
||
|
||
// CountSHA1(key_mask.c_str(),key_mask.Length(),hc);
|
||
|
||
// io::MemoryOutputStream mos;
|
||
|
||
// base64_encode(&mos,hc.code,hc.size());
|
||
|
||
// const UTF8String sec_websocket_accept((char *)mos.GetData(),mos.GetSize());
|
||
|
||
// result="HTTP/1.1 101 Switching Protocols\r\n"
|
||
// "Upgrade: websocket\r\n"
|
||
// "Connection: Upgrade\r\n"
|
||
// "Sec-WebSocket-Accept: "+sec_websocket_accept;
|
||
|
||
// if(!sec_websocket_protocol.IsEmpty())
|
||
// result+="\r\nSec-WebSocket-Protocol: "+sec_websocket_protocol;
|
||
|
||
// result+="\r\n\r\n";
|
||
//}
|
||
}//namespace network
|
||
}//namespace hgl
|