1. Куча / Говнокод #8385

    +131

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 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.

    Пишу модуль для работы с веб-сокетами на Эрланге. Эта функция парсит и декодирует пакет, присылаемый клиентом.
    Функцию я уже переписал.

    Запостил: rasufa, 01 Ноября 2011

    Комментарии (6) RSS

    • У макконнелла помню была описана похожая задача. Он предлагал структуру пакетов (состав и тип полей) хранить в таблице, ключом к которой является тип пакета. И парсинг значительно упрощается... Не знаю, правда, насколько это применимо к Эрлангу.
      Ответить
    • Я один нихуя не понял?
      Ответить
    • по моему этому коду просто нехватает структурности.

      никогда не понимал народ который пытается все свалить в одну функцию.

      оба кэйса и тру ветка ифа должны отлично выделяться в отдельные функции.
      Ответить
    • pastebin.com
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий