- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
parse(Data) ->
	io:format("~p~n", [Data]),
	<<A:8, B:8, C/binary>> = Data,
	FinalMark = case (bit_nth(0, A)) of 1 -> true; 0 -> false end,
	MaskMark = case (bit_nth(0, B)) of 1 -> true; 0 -> false end,
	Result1 = [{final, FinalMark}, {masked, MaskMark}],
	Opcode = case <<A:4>> of
		<<16#0:4>> -> continuation_frame;
		<<16#1:4>> -> text_frame;
		<<16#2:4>> -> binary_frame;
		<<16#8:4>> -> connection_closed;
		<<16#9:4>> -> ping;
		<<16#a:4>> -> pong;
		<<_:4>> -> unknown
	end,
	Result2 = Result1 ++ [{opcode, Opcode}],
	<<LengthSign:7>> = <<B:7>>,
	Length = if
		LengthSign =< 125 ->
			C1 = C,
			LengthSign;
		LengthSign == 126 ->
			<<L0:16, C1/binary>> = C, L0;
		LengthSign == 127 ->
			<<L0:64, C1/binary>> = C, L0
	end,
	Result3 = Result2 ++ [{length, Length}],
	case MaskMark of
		true ->
			<<MaskingKey0:8, MaskingKey1:8, MaskingKey2:8, MaskingKey3:8, C2/binary>> = C1,
			MaskingKey = [MaskingKey0, MaskingKey1, MaskingKey2, MaskingKey3],
			Result4 = Result3 ++ [{masking_key, MaskingKey}],
			Payload = binary_to_list(C2),
			TX = decode(Payload, lists:reverse(MaskingKey), 0, []);
		false -> C2 = C1, Result4 = Result3,
			Payload = binary_to_list(C2), TX = Payload
	end,
	Result = Result4 ++ [{msg, TX}],
	Result.
                                     
        
            Пишу модуль для работы с веб-сокетами на Эрланге. Эта функция парсит и декодирует пакет, присылаемый клиентом.
Функцию я уже переписал.