anchor.diff:      replace_last(strip_trailing_crlf(Data), MP);
   handle_last_data(_Data, #mp{headers=dropping}=MP) ->
       MP;
  -handle_last_data(Data, #mp{name=Name, cb=Callback, cb_data=CbData}=MP) ->
  +handle_last_data(Data, MP) ->
       Stripped = strip_trailing_crlf(Data),
  -    Result = Callback({data, Name, Stripped}, CbData),
  -    handle_last_data_cb(Result, Stripped, MP).
  +    handle_last_data_cb(data_cb(Stripped, MP), Stripped, MP).
  +
  +data_cb(Data, #mp{name=Name, cb=Callback, cb_data=CbData}) ->
  +    Callback({data, Name, Data}, CbData).
   
   strip_trailing_crlf(Bin) ->
       N = size(Bin) - 2,
  
positive.code:     replace_last(Data, MP);
  handle_body_data(Data, #mp{last=undefined}=MP) ->
      push_data(Data, MP);
  handle_body_data(Data, #mp{name=Name, last=Last, cb=Callback,
                             cb_data=CbData}=MP) ->
      %% We notify on the last data because we don't yet know what the
      %% current data means
      Result = Callback({data, Name, Last}, CbData),
      handle_data_cb(Result, Data, MP).
  
  handle_data_cb({continue, CbData}, Data, MP) ->
      push_data(Data, MP#mp{cb_data=CbData});
  
negative.code: 
  handle_finalized_part(Part, #mp{cb=undefined}=MP) ->
      reset_part_attrs(add_part(Part, MP));
  handle_finalized_part(Part, MP) ->
      handle_eof_cb(eof_cb(MP), Part, MP).
  
  eof_cb(#mp{cb=Callback, cb_data=CbData, name=Name}) ->
      Callback({data, Name, eof}, CbData).
  
  add_part(Part, #mp{parts=Parts}=MP) ->
      MP#mp{parts=[Part|Parts]}.
  