diff --git a/src/geef_pkt.erl b/src/geef_pkt.erl index 55ad15f..f3de17d 100644 --- a/src/geef_pkt.erl +++ b/src/geef_pkt.erl @@ -56,12 +56,21 @@ do_unpack(Len, Rest) -> parse_pkt(In, 0) -> {flush, In}; parse_pkt(In, Len) -> - LenLF = Len - 5 - ?SHA_LEN, % "want " | "want " + sha, remove LF if it's there - {Type, Rest0} = pkt_type(In), - <> = Rest0, - {{Type, geef_oid:parse(Sha)}, Rest}. + {Type, NameLen, Rest0} = pkt_type(In), + LenLF = Len - NameLen, % lets us optionally clean the LF + {Pkt, Rest1} = case Type of + done -> + {done, Rest0}; + _ -> + <> = Rest0, + {{Type, geef_oid:parse(Sha)}, R} + end, + <<_:LenLF/binary, Rest/binary>> = Rest1, + {Pkt, Rest}. pkt_type(<<"have ", Rest/binary>>) -> - {have, Rest}; + {have, 5 + ?SHA_LEN, Rest}; pkt_type(<<"want ", Rest/binary>>) -> - {want, Rest}. + {want, 5 + ?SHA_LEN, Rest}; +pkt_type(<<"done", Rest/binary>>) -> + {done, 4, Rest}. diff --git a/test/pkt_test.erl b/test/pkt_test.erl index 2f1f781..8d171b0 100644 --- a/test/pkt_test.erl +++ b/test/pkt_test.erl @@ -8,6 +8,11 @@ flush_test() -> Actual = geef_pkt:parse("0000"), ?assertEqual(Expected, Actual). +done_test() -> + Expected = {done, <<>>}, + Actual = geef_pkt:parse("0009done\n"), + ?assertEqual(Expected, Actual). + have_test() -> Expected = {{want, geef_oid:parse("e17ca7f2d877acbf8b9a9a1cb4c243ca72e86463")}, <<>>}, Actual = geef_pkt:parse("0032want e17ca7f2d877acbf8b9a9a1cb4c243ca72e86463\n"),