erlang:decode_packet(Type, Bin, Options) ->
{ok, Packet, Rest} |
{more, Length} |
{error, Reason}
Type =
raw | 0 | 1 | 2 | 4 | asn1 | cdr | sunrm | fcgi | tpkt |
line | http | http_bin | httph | httph_bin
Bin = binary()
Options = [Opt]
Opt =
{packet_size, integer() >= 0} |
{line_length, integer() >= 0}
Packet = binary() | HttpPacket
Rest = binary()
Length = integer() >= 0 | undefined
Reason = term()
HttpPacket =
HttpRequest | HttpResponse | HttpHeader | http_eoh | HttpError
HttpRequest = {http_request, HttpMethod, HttpUri, HttpVersion}
HttpResponse =
{http_response, HttpVersion, integer(), HttpString}
HttpHeader =
{http_header,
integer(),
HttpField,
UnmodifiedField :: HttpString,
Value :: HttpString}
HttpError = {http_error, HttpString}
HttpMethod =
'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' |
'TRACE' | HttpString
HttpUri =
'*' |
{absoluteURI,
http | https,
Host :: HttpString,
Port :: inet:port_number() | undefined,
Path :: HttpString} |
{scheme, Scheme :: HttpString, HttpString} |
{abs_path, HttpString} |
HttpString
HttpVersion =
{Major :: integer() >= 0, Minor :: integer() >= 0}
HttpField =
'Cache-Control' | 'Connection' | 'Date' | 'Pragma' |
'Transfer-Encoding' | 'Upgrade' | 'Via' | 'Accept' |
'Accept-Charset' | 'Accept-Encoding' | 'Accept-Language' |
'Authorization' | 'From' | 'Host' | 'If-Modified-Since' |
'If-Match' | 'If-None-Match' | 'If-Range' |
'If-Unmodified-Since' | 'Max-Forwards' |
'Proxy-Authorization' | 'Range' | 'Referer' | 'User-Agent' |
'Age' | 'Location' | 'Proxy-Authenticate' | 'Public' |
'Retry-After' | 'Server' | 'Vary' | 'Warning' |
'Www-Authenticate' | 'Allow' | 'Content-Base' |
'Content-Encoding' | 'Content-Language' | 'Content-Length' |
'Content-Location' | 'Content-Md5' | 'Content-Range' |
'Content-Type' | 'Etag' | 'Expires' | 'Last-Modified' |
'Accept-Ranges' | 'Set-Cookie' | 'Set-Cookie2' |
'X-Forwarded-For' | 'Cookie' | 'Keep-Alive' |
'Proxy-Connection' | HttpString
HttpString = string() | binary()
根据 Type
指定的数据包协议解码二进制 Bin
。类似于带有选项 {packet,Type}.
的套接字完成的数据包处理
如果整个数据包包含在 Bin
中,则它将与二进制文件的其余部分一起作为 {ok,Packet,Rest}
返回。
如果Bin
不包含整个数据包,则返回{more,Length}
。 Length
是数据包的预期总大小,如果预期数据包大小未知,则为 undefined
。然后可以再次调用decode_packet
并添加更多数据。
如果报文不符合协议格式,则返回{error,Reason}
。
Type
s:
raw | 0
-
不进行数据包处理。除非它为空,否则将返回整个二进制文件。
1 | 2 | 4
-
数据包包含一个标头,指定数据包中的字节数,后跟该字节数。标头的长度可以是 1、2 或 4 个字节;字节顺序是大端字节序。当数据包返回时,标头被剥离。
line
-
数据包是由分隔符字节组成的 line-terminated,默认为 latin-1 换行符。分隔符字节包含在返回的数据包中,除非该行根据选项
line_length
被截断。 asn1 | cdr | sunrm | fcgi | tpkt
-
标头没有被剥离。
报文类型的含义如下:
asn1
- ASN.1 BERsunrm
- Sun's RPC encodingcdr
- CORBA (GIOP 1.1)fcgi
- Fast CGItpkt
- TPKT format [RFC1006]
http | httph | http_bin | httph_bin
-
超文本传输协议。返回的数据包格式符合前面说明的
HttpPacket
。数据包可以是请求、响应、标头或标头结束标记。无效行返回为HttpError
。识别的请求方法和标头字段作为原子返回。其他的则以字符串形式返回。无法识别的标头字段字符串的格式仅开头为大写字母,后面为连字符,例如
"Sec-Websocket-Key"
。标头字段名称也在UnmodifiedField
中以字符串形式返回,无需任何转换或格式化。当需要
HttpRequest
或HttpResponse
时,协议类型http
仅用于第一行。以下调用将使用httph
获取HttpHeader
直到返回http_eoh
,这标志着标头的结束和任何后续消息正文的开始。变体
http_bin
和httph_bin
将字符串 (HttpString
) 作为二进制文件而不是列表返回。自 OTP 26.0 起,
Host
可能是包含在中的 IPv6 地址[]
,如定义RFC2732.
选项:
{packet_size, integer() >= 0}
-
设置数据包正文允许的最大大小。如果报文头指示报文的长度大于允许的最大长度,则认为该报文无效。默认为0,表示没有大小限制。
{line_length, integer() >= 0}
-
对于数据包类型
line
,超过指定长度的行将被截断。如果
packet_size
本身未设置,选项line_length
也适用于http*
数据包类型,作为选项packet_size
的别名。此用途仅用于向后兼容。 {line_delimiter, 0 =< byte() =< 255}
-
对于数据包类型
line
,设置分隔字节。默认为 latin-1 字符$\n
。
例子:
> erlang:decode_packet(1,<<3,"abcd">>,[]).
{ok,<<"abc">>,<<"d">>}
> erlang:decode_packet(1,<<5,"abcd">>,[]).
{more,6}
相关用法
- erlang decode_unsigned(Subject, Endianness)用法及代码示例
- erlang decode_hex(Bin)用法及代码示例
- erlang delete用法及代码示例
- erlang delete_element(Index, Tuple1)用法及代码示例
- erlang demonitor(MonitorRef, OptionList)用法及代码示例
- erlang delete(Item, Q1)用法及代码示例
- erlang delete_r(Item, Q1)用法及代码示例
- erlang delete_with(Pred, Q1)用法及代码示例
- erlang delete_with_r(Pred, Q1)用法及代码示例
- erlang deflate(Z, Data, Flush)用法及代码示例
- erlang droplast用法及代码示例
- erlang duplicate用法及代码示例
- erlang date用法及代码示例
- erlang dirname(Filename)用法及代码示例
- erlang date()用法及代码示例
- erlang drop(Q1 :: queue(Item))用法及代码示例
- erlang drop_r(Q1 :: queue(Item))用法及代码示例
- erlang daeh(Q :: queue(Item))用法及代码示例
- erlang domain(LogEvent, Extra)用法及代码示例
- erlang duplicate(N, Elem)用法及代码示例
- erlang domain(BinRel)用法及代码示例
- erlang drestriction(BinRel1, Set)用法及代码示例
- erlang drestriction(SetFun, Set1, Set2)用法及代码示例
- erlang dh_gex_group(MinSize, SuggestedSize, MaxSize, Groups)用法及代码示例
- erlang dissect_query(QueryString)用法及代码示例
注:本文由纯净天空筛选整理自erlang.org大神的英文原创作品 decode_packet(Type, Bin, Options) -> {ok, Packet, Rest} | {more, Length} | {error, Reason}。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。