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}。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。