Commit 9bd03483 authored by Claes Jakobsson's avatar Claes Jakobsson
Browse files

Julien Chaffraix fixed so that the fragment part in an URL is not sent to the server anymore

parent 2e830066
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -6,6 +6,10 @@

                                  Changelog

Claes Jakobsson (6 Jan 2010)
- Julien Chaffraix fixed so that the fragment part in an URL is not sent
  to the server anymore.

Kamil Dudka (3 Jan 2010)
- Julien Chaffraix eliminated a duplicated initialization in singlesocket().

+1 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ This release includes the following bugfixes:
 o some *_proxy environment variables didn't function
 o libcurl-OpenSSL engine cleanup
 o header include fix for FreeBSD versions before v8
 o fragment part of URLs are no longer sent to the server

This release includes the following known bugs:

+3 −0
Original line number Diff line number Diff line
@@ -449,6 +449,9 @@ on which protocols are supported.
The string given to CURLOPT_URL must be url-encoded and follow RFC 2396
(http://curl.haxx.se/rfc/rfc2396.txt).

Please note that starting with version 7.20.0, the fragment part of the URI will
not be send as part of the path, which was the case previously.

\fICURLOPT_URL\fP is the only option that \fBmust\fP be set before
\fIcurl_easy_perform(3)\fP is called.

+17 −9
Original line number Diff line number Diff line
@@ -3311,8 +3311,9 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
                                    bool *prot_missing)
{
  char *at;
  char *tmp;
  char *fragment;
  char *path = data->state.path;
  char *query;
  int rc;
  char protobuf[16];
  const char *protop;
@@ -3438,11 +3439,11 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
   */
  at = strchr(conn->host.name, '@');
  if(at)
    tmp = strchr(at+1, '?');
    query = strchr(at+1, '?');
  else
    tmp = strchr(conn->host.name, '?');
    query = strchr(conn->host.name, '?');

  if(tmp) {
  if(query) {
    /* We must insert a slash before the '?'-letter in the URL. If the URL had
       a slash after the '?', that is where the path currently begins and the
       '?string' is still part of the host name.
@@ -3451,7 +3452,7 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
       the path. And have it all prefixed with a slash.
    */

    size_t hostlen = strlen(tmp);
    size_t hostlen = strlen(query);
    size_t pathlen = strlen(path);

    /* move the existing path plus the zero byte forward, to make room for
@@ -3459,11 +3460,11 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
    memmove(path+hostlen+1, path, pathlen+1);

     /* now copy the trailing host part in front of the existing path */
    memcpy(path+1, tmp, hostlen);
    memcpy(path+1, query, hostlen);

    path[0]='/'; /* prepend the missing slash */

    *tmp=0; /* now cut off the hostname at the ? */
    *query=0; /* now cut off the hostname at the ? */
  }
  else if(!path[0]) {
    /* if there's no path set, use a single slash */
@@ -3504,8 +3505,15 @@ static CURLcode parseurlandfillconn(struct SessionHandle *data,
    /* Override any scope that was set above.  */
    conn->scope = data->set.scope;

  /* Remove the fragment part of the path. Per RFC 2396, this is always the
     last part of the URI. We are looking for the first '#' so that we deal gracefully
     with non conformant URI such as http://example.com#foo#bar. */
  fragment = strchr(path, '#');
  if(fragment)
    *fragment = 0;

  /*
   * So if the URL was A://B/C,
   * So if the URL was A://B/C#D,
   *   protop is A
   *   conn->host.name is B
   *   data->state.path is /C

tests/data/test1109

0 → 100644
+46 −0
Original line number Diff line number Diff line
<testcase>
# Test that the fragment is not send as part of the path.
<info>
<keywords>
HTTP
CURLOPT_URL
</keywords>
</info>

# Server-side
<reply name="1">
<data>
HTTP/1.1 200 OK
Content-Length: 6

hello
</data>
</reply>

# Client-side
<client>
<server>
http
</server>
 <name>
HTTP GET
 </name>
 <command>
http://%HOSTIP:%HTTPPORT/1109#test
</command>
</client>


# Verify data after the test has been "shot"
<verify>
<strip>
^User-Agent:.*
</strip>
<protocol>
GET /1109 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*

</protocol>
</verify>
</testcase>
Loading