Re: Re: [PATCH v2] remote-curl: send Accept-Language header to server

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>"Li Linchao via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes:
>
>> From: Li Linchao <lilinchao@xxxxxxxxxx>
>>
>> Git server end's ability to accept Accept-Language header was introduced
>> in f18604bbf2(http: add Accept-Language header if possible), but this is
>
>Pleaes refer to the commit like so:
>
>    f18604bb (http: add Accept-Language header if possible, 2015-01-28)
>
>(cf. Documentation/SubmittingPatches::commit-reference)
>
>"git show -s --pretty=reference f18604bb" is one way to format a
>commit name in that format.
> 
OK, thanks for reminding.
>> only used by very early phase of the transfer, that's HTTP GET request to
>
>"that's" -> "which is", probably. 
OK.
>
>> discover references. For other phases, like POST request in the smart HTTP
>> the server side don't know what language the client speaks.
>
>"HTTP the server side don't" -> "HTTP, the server does not"
>
>>  http.c                      |  4 ++--
>>  http.h                      |  3 +++
>>  remote-curl.c               | 16 ++++++++++++++++
>>  t/t5541-http-push-smart.sh  | 19 +++++++++++++++++++
>>  t/t5550-http-fetch-dumb.sh  | 10 +++++-----
>>  t/t5551-http-fetch-smart.sh | 10 ++++++++--
>>  6 files changed, 53 insertions(+), 9 deletions(-)
>
>What is curious is that without any of changes to the *.[ch] files,
>updated test 5550 and 5551 pass already.
>
>In other words, these updated tests in 5550 and 5551 probably are
>not testing the behaviour the updated code intends to show.  Of
>course, if we revert the code that taught the Accept-Language to the
>GET requests in f18604bb, these tests will fail.  There is no reason
>to touch these two tests to "prove" that the code change in this
>patch does not break existing support, either. 
My bad, the updated test in t5550 can not test the updated code, but test 
the original code in f18604bb.
>
>> diff --git a/http.h b/http.h
>> index ba303cfb372..3c94c479100 100644
>> --- a/http.h
>> +++ b/http.h
>> @@ -178,6 +178,9 @@ int http_fetch_ref(const char *base, struct ref *ref);
>>  int http_get_info_packs(const char *base_url,
>>  struct packed_git **packs_head);
>
>> +/* Helper for getting Accept-Language header */
>> +const char *http_get_accept_language_header(void);
>
>OK.
>
>> @@ -932,6 +933,10 @@ static int post_rpc(struct rpc_state *rpc, int stateless_connect, int flush_rece
>>  headers = curl_slist_append(headers, needs_100_continue ?
>>  "Expect: 100-continue" : "Expect:");
>
>> +	/* Add Accept-Language header */
>> +	if (rpc->hdr_accept_language)
>> +	headers = curl_slist_append(headers, rpc->hdr_accept_language);
>
>curl_slist_append() makes a copy of .hdr_accept_language, so rpc
>struct is still responsible to release the resource used for the
>member when it goes out of scope.
>
>> +	accept_language = http_get_accept_language_header();
>> +	if (accept_language) {
>> +	strbuf_addstr(&buf, accept_language);
>> +	rpc->hdr_accept_language = strbuf_detach(&buf, NULL);
>
>That looks like a roundabout way to say xstrdup().  The whole thing
>can be done like so:
>
>	rpc->hdr_accept_language = xstrdup_or_null(http_get_accept_language_header());
>
>And by doing so we kill another bug.  "struct rpc" is allocated on
>the stack without any initialization, so the new code leaves the
>hdr_accept_language member uninitialized.  Rather, we want to
>explicitly set NULL to the member when the new header is not in use.
>
>> +	}
>> +
>
>The memory ownership model for this new .hdr_accept_language member
>in the RPC struct seems to be that the struct owns the resource of
>the member.
>
>>  strbuf_addf(&buf, "Content-Type: application/x-%s-request", svc);
>>  rpc->hdr_content_type = strbuf_detach(&buf, NULL);
>
>> @@ -1400,6 +1412,7 @@ static int stateless_connect(const char *service_name)
>>  struct discovery *discover;
>>  struct rpc_state rpc;
>>  struct strbuf buf = STRBUF_INIT;
>> +	const char *accept_language;
>
>>  /*
>>  * Run the info/refs request and see if the server supports protocol
>> @@ -1418,6 +1431,9 @@ static int stateless_connect(const char *service_name)
>>  printf("\n");
>>  fflush(stdout);
>>  }
>> +	accept_language = http_get_accept_language_header();
>> +	if (accept_language)
>> +	rpc.hdr_accept_language = xstrfmt("%s", accept_language);
>
>And this is in line with that memory ownership model.
>
>>  rpc.service_name = service_name;
>>  rpc.service_url = xstrfmt("%s%s", url.buf, rpc.service_name);
>
>I however do not see anybody that actually freeing when rpc is
>done.
>
>Are we adding a new memory leak?  Shouldn't we be releasing the
>resources held in rpc.hdr_accept_language when rpc goes out of
>scope? 
Right. we should free it in the end of the method, like so:
        free(rpc.service_url);
        free(rpc.hdr_content_type);
        free(rpc.hdr_accept);
+      free(rpc.hdr_accept_language);
        free(rpc.protocol_header);
        free(rpc.buf);
        strbuf_release(&buf);

>
>> diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh
>> index 2f09ff4fac6..4288a279e9e 100755
>> --- a/t/t5541-http-push-smart.sh
>> +++ b/t/t5541-http-push-smart.sh
>> @@ -80,6 +80,25 @@ test_expect_success 'push to remote repository (standard)' '
>>  test $HEAD = $(git rev-parse --verify HEAD))
>>  '
>
>> +test_expect_success 'push to remote repository (standard) with sending Accept-Language' '
>> +	cat >exp <<-\EOF &&
>> +	=> Send header: Accept-Language: zh-CN, en;q=0.9, *;q=0.8
>> +	=> Send header: Accept-Language: zh-CN, en;q=0.9, *;q=0.8
>> +	EOF
>
>As I already asked, do we need to use a language code that has never
>been used in our existing test to test this new codepath, or is it
>sufficient to reuse what we already know that will not cause problems
>in developers' testing environment, like those used in other
>existing tests, like ko_KR, en_US, etc.  If the latter, I strongly
>do not want to see a new language added to the test.  We are *not*
>in the business of testing the system locale support on the user's
>platform. 
OK. 
>
>> +	cd "$ROOT_PATH"/test_repo_clone &&
>> +	: >path_lang &&
>> +	git add path_lang &&
>> +	test_tick &&
>> +	git commit -m path_lang &&
>> +	HEAD=$(git rev-parse --verify HEAD) &&
>> +	GIT_TRACE_CURL=true LANGUAGE="zh_CN:en" git push -v -v 2>err &&
>
>If this test, or existing tests in other scripts, do not actually
>require the LANGUAGE specified in the environment variable to be
>"installed" on the user's platform, then it might be an acceptable
>alternative to use a locale (like "tlh_AQ") that is implausible to
>exist on the user's system, but using what we already use in other
>tests would be the safest thing to do.
>
>Use ko_KR.UTF8 (and nothing else) like 5550 does with its first use
>of check_language helper.  Or using en_US is also fine, as that is
>also used over there. 
OK.
>
>> +	! grep "Expect: 100-continue" err &&
>> +
>> +	grep "=> Send header: Accept-Language:" err >err.language &&
>> +	test_cmp exp err.language
>> +'
>> +
>>  test_expect_success 'push already up-to-date' '
>>  git push
>>  '
>
>As I already said, I do not think changes to the following two tests
>are warranted.
>
>> diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh
>> diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh 
Well, after I made some tests, the reason t5551 fail to test what we want is
"if test "$GIT_TEST_PROTOCOL_VERSION" = 2" this statement block the real
test.
>
>
>Thanks.




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux