[ 
https://issues.apache.org/jira/browse/COUCHDB-558?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Filipe Manana updated COUCHDB-558:
----------------------------------

    Attachment: jira-couchdb-558-for-trunk-3rd-try.patch

Hi again Paul,

I already improved on some of the points you made:

* check_integrity should probably throw an error or return the body -> DONE
* You should still be recording stats even when validation fails -> DONE
* There are alot of variable assignments where they aren't necessary -> DONE
* keep lines less than 80 characters -> DONE
* really_long_function_names_are_hard_to_read - The functions for trailers 
could be made more generic. -> DONE
* The check for Content-MD5 appears to be case sensitive -> DONE
* ...having your hash matching function just throw an error that will get 
caught by the try/catch around the HandleReq() call -> DONE

* "the only thing I'm a bit concerned about is the trailier parsing. The 
current bits are a bit awkard. In a perfect world id prefer to see that as a 
patch to mochiweb, but having it in CouchDB is fine if they rejected that patch 
or during the time it takes to get into upstream."

Well, the read_length(0) function from mochiweb_request.erl is awkard, as it 
gives us the trailer as a list of binaries. In mochiweb_headers.erl, we can 
create a Mochiweb Headers structure only from [ {key(), value()} ] lists.
Therefore, in this patch, I added this little function to couch_httpd.erl:

%% @spec to_mochiweb_headers([binary()]) -> headers()
%%
%% Transforms the given binary list into a Mochiweb
%% headers structure. Each binary is a raw HTTP header
%% line (e.g. <<"Content-Lengh: 345\r\n">>).
%%
to_mochiweb_headers(BinaryList) ->
    {ok, R} = re:compile("^(.*?):\s+(.*?)\r\n$"),
    F = fun(Bin, Acc) ->
        {match, [_, H, V]} = re:run(Bin, R, [{capture, all, list}]),
        [ {H, V} | Acc ]
    end,
    mochiweb_headers:make(lists:foldr(F, [], BinaryList)).

Then I can get values from it like a normal header: 
"mochiweb_headers:get_value("Content-MD5", Trailer)".
This is case insensitive.

I would like to know you point of views for:

1) I think I'll submit a patch to Mochiweb, where I add that little function to 
mochiweb_utils.erl or mochiweb_headers.erl.

2) Look into the self explanatory comment of the function update_req/2 that I 
added. What do you think?

I will write the Erlang test suite soon :)

thanks

Best regards,
Filipe Manana



> Validate Content-MD5 request headers on uploads
> -----------------------------------------------
>
>                 Key: COUCHDB-558
>                 URL: https://issues.apache.org/jira/browse/COUCHDB-558
>             Project: CouchDB
>          Issue Type: Improvement
>          Components: Database Core, HTTP Interface
>            Reporter: Adam Kocoloski
>             Fix For: 0.11
>
>         Attachments: jira-couchdb-558-for-trunk-2nd-try.patch, 
> jira-couchdb-558-for-trunk-3rd-try.patch, jira-couchdb-558-for-trunk.patch
>
>
> We could detect in-flight data corruption if a client sends a Content-MD5 
> header along with the data and Couch validates the MD5 on arrival.
> RFC1864 - The Content-MD5 Header Field
> http://www.faqs.org/rfcs/rfc1864.html

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to