<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>28687</bug_id>
          
          <creation_ts>2009-08-24 14:49:59 -0700</creation_ts>
          <short_desc>should not pass URI fragments to libsoup</short_desc>
          <delta_ts>2009-09-08 13:07:43 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKitGTK</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Dan Winship">danw</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>gustavo</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>142421</commentid>
    <comment_count>0</comment_count>
    <who name="Dan Winship">danw</who>
    <bug_when>2009-08-24 14:49:59 -0700</bug_when>
    <thetext>(pointed out by reinouts on irc)

If you click on a link like &quot;http://example.com/#comments&quot; in WebKitGTK, it passes the whole URI (including the fragment) to libsoup. Normally libsoup doesn&apos;t pass the &quot;#comments&quot; to the remote server, but if you&apos;re using a proxy, then it does. And some servers will return a 404 or 403 in that case because they interpret the &quot;#comments&quot; as being part of the path.

The fact that libsoup&apos;s behavior changes depending on whether you use a proxy is a libsoup bug, but you could argue about which of the two behaviors is the buggy one. I think WebKit should not be passing fragments to libsoup; WebKit wants the whole page back, and so it should be requesting the whole page from libsoup, not just a portion of it. Also, it could be confusing if messages with URIs that are not soup_uri_equal() would result in identical requests, and this could end up tripping up things like caching, etc, as well. It seems wrong for &quot;soup_message_get_uri()&quot; to return a URI with a fragment in it, since the response body actually contains all fragments. But it would be wrong for SoupMessage to clear the fragment from the URI itself too, since that could trip up the app if it expected the URI to match what it had originally set it to.

So anyway, I think ResourceHandleSoup should strip the URI fragment from the URI as part of its process of canonicalizing it before passing it to libsoup.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>142823</commentid>
    <comment_count>1</comment_count>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-08-26 03:59:27 -0700</bug_when>
    <thetext>So, I&apos;ve tried something like...

diff --git a/WebCore/platform/network/soup/ResourceRequestSoup.cpp b/WebCore/platform/network/soup/ResourceRequestSoup.cpp
index f2011bb..eec75e0 100644
--- a/WebCore/platform/network/soup/ResourceRequestSoup.cpp
+++ b/WebCore/platform/network/soup/ResourceRequestSoup.cpp
@@ -30,9 +30,20 @@ using namespace std;

 namespace WebCore {

+static char* stripFragmentFromURI(char* uri)
+{
+    char* ptr = g_strrstr(uri, &quot;#&quot;);
+    if (ptr &amp;&amp; *(ptr-1) != &apos;&amp;&apos;)
+        *ptr = &apos;\0&apos;;
+
+    return uri;
+}
+
 SoupMessage* ResourceRequest::toSoupMessage() const
 {
-    SoupMessage* soupMessage = soup_message_new(httpMethod().utf8().data(), url().string().utf8().data());
+    GOwnPtr&lt;char&gt; uri(stripFragmentFromURI(g_strdup(url().string().utf8().data())));
+    SoupMessage* soupMessage = soup_message_new(httpMethod().utf8().data(),
+                                                const_cast&lt;char*&gt;(uri.get()));
     if (!soupMessage)
         return 0;

@@ -53,7 +64,7 @@ SoupMessage* ResourceRequest::toSoupMessage() const
 void ResourceRequest::updateFromSoupMessage(SoupMessage* soupMessage)
 {
     SoupURI* soupURI = soup_message_get_uri(soupMessage);
-    GOwnPtr&lt;gchar&gt; uri(soup_uri_to_string(soupURI, FALSE));
+    GOwnPtr&lt;gchar&gt; uri(stripFragmentFromURI(soup_uri_to_string(soupURI, FALSE)));
     m_url = KURL(KURL(), String::fromUTF8(uri.get()));

And all the http tests seem to still pass. Looks reasonable Dan? I first didn&apos;t check that the previous character is a &amp; and failed one test that dealt with espaced hex stuff in the URL. Is there any function in soup/glib I should be using to strip the fragment from a string? (Other than going through SoupURI somehow, I suppose).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>142830</commentid>
    <comment_count>2</comment_count>
    <who name="Dan Winship">danw</who>
    <bug_when>2009-08-26 05:24:47 -0700</bug_when>
    <thetext>You probably want to operate on the parsed URL, not the string form.

In ResourceHandle::start(), you have:

    KURL url = request().url();
    String urlString = url.string();

and you could just add a call to url.removeFragmentIdentifier() in between. Likewise in updateFromSoupMessage. (Though I&apos;m not sure if you want m_url to contain the fragment or not.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>145358</commentid>
    <comment_count>3</comment_count>
      <attachid>39187</attachid>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-09-08 08:12:40 -0700</bug_when>
    <thetext>Created attachment 39187
dontpassfragment.patch

Don&apos;t pass fragments in URIs to libsoup.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>145486</commentid>
    <comment_count>4</comment_count>
      <attachid>39187</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-09-08 12:18:24 -0700</bug_when>
    <thetext>Comment on attachment 39187
dontpassfragment.patch

Looks good, thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>145512</commentid>
    <comment_count>5</comment_count>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-09-08 13:07:43 -0700</bug_when>
    <thetext>Landed in r48178, closing.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>39187</attachid>
            <date>2009-09-08 08:12:40 -0700</date>
            <delta_ts>2009-09-08 12:18:24 -0700</delta_ts>
            <desc>dontpassfragment.patch</desc>
            <filename>dontpassfragment.patch</filename>
            <type>text/plain</type>
            <size>2928</size>
            <attacher name="Xan Lopez">xan.lopez</attacher>
            
              <data encoding="base64">RnJvbSBkMWY4ZDVjMTZkY2QzMzljMTVjY2I1NTQ0YTdhNjc3NDhlY2FkMDc5IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBYYW4gTG9wZXogPHhsb3BlekBpZ2FsaWEuY29tPgpEYXRlOiBU
dWUsIDggU2VwIDIwMDkgMTg6MTE6MzMgKzAzMDAKU3ViamVjdDogW1BBVENIXSAyMDA5LTA5LTA4
ICBYYW4gTG9wZXogIDx4bG9wZXpAaWdhbGlhLmNvbT4KCiAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCgogICAgICAgIHNob3VsZCBub3QgcGFzcyBVUkkgZnJhZ21lbnRzIHRvIGxp
YnNvdXAKICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjg2
ODcKCiAgICAgICAgU3RyaXAgdGhlIGZyYWdtZW50IGZyb20gdGhlIFVSSSBiZWZvcmUgcGFzc2lu
ZyBpdCB0byBzb3VwLCBzaW5jZQogICAgICAgIGl0IGZvcndhcmRzIGl0IHRvIHNlcnZlcnMgaW4g
c29tZSBjYXNlcyAobGlrZSB3aGVuIHVzaW5nIGEgcHJveHkpCiAgICAgICAgd2hpY2ggY29uZnVz
ZXMgdGhlbSBhbmQgbWFrZXMgdGhlbSByZXR1cm4gNDAzLzQwNC4KCiAgICAgICAgKiBwbGF0Zm9y
bS9uZXR3b3JrL3NvdXAvUmVzb3VyY2VIYW5kbGVTb3VwLmNwcDoKICAgICAgICAoV2ViQ29yZTo6
c3RhcnRIdHRwKToKICAgICAgICAoV2ViQ29yZTo6KToKLS0tCiBXZWJDb3JlL0NoYW5nZUxvZyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTUgKysrKysrKysrKysrKysrCiAu
Li4vcGxhdGZvcm0vbmV0d29yay9zb3VwL1Jlc291cmNlSGFuZGxlU291cC5jcHAgICB8ICAgMTEg
KysrKysrKystLS0KIDIgZmlsZXMgY2hhbmdlZCwgMjMgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlv
bnMoLSkKCmRpZmYgLS1naXQgYS9XZWJDb3JlL0NoYW5nZUxvZyBiL1dlYkNvcmUvQ2hhbmdlTG9n
CmluZGV4IGUxOWYxYzEuLjEzOTYyZjggMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvQ2hhbmdlTG9nCisr
KyBiL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTggQEAKKzIwMDktMDktMDggIFhhbiBM
b3BleiAgPHhsb3BlekBpZ2FsaWEuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIHNob3VsZCBub3QgcGFzcyBVUkkgZnJhZ21lbnRzIHRvIGxpYnNv
dXAKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI4Njg3
CisKKyAgICAgICAgU3RyaXAgdGhlIGZyYWdtZW50IGZyb20gdGhlIFVSSSBiZWZvcmUgcGFzc2lu
ZyBpdCB0byBzb3VwLCBzaW5jZQorICAgICAgICBpdCBmb3J3YXJkcyBpdCB0byBzZXJ2ZXJzIGlu
IHNvbWUgY2FzZXMgKGxpa2Ugd2hlbiB1c2luZyBhIHByb3h5KQorICAgICAgICB3aGljaCBjb25m
dXNlcyB0aGVtIGFuZCBtYWtlcyB0aGVtIHJldHVybiA0MDMvNDA0LgorCisgICAgICAgICogcGxh
dGZvcm0vbmV0d29yay9zb3VwL1Jlc291cmNlSGFuZGxlU291cC5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpzdGFydEh0dHApOgorICAgICAgICAoV2ViQ29yZTo6KToKKwogMjAwOS0wOS0wNyAgWGFu
IExvcGV6ICA8eGxvcGV6QGlnYWxpYS5jb20+CiAKICAgICAgICAgVW5yZXZpZXdlZCBidWlsZCBm
aXguCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291cC9SZXNvdXJjZUhh
bmRsZVNvdXAuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvUmVzb3VyY2VIYW5k
bGVTb3VwLmNwcAppbmRleCA3MTQwZWE3Li4wYTUyMWVmIDEwMDY0NAotLS0gYS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvc291cC9SZXNvdXJjZUhhbmRsZVNvdXAuY3BwCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9zb3VwL1Jlc291cmNlSGFuZGxlU291cC5jcHAKQEAgLTQ1MCw3ICs0
NTAsNyBAQCBzdGF0aWMgdm9pZCBlbnN1cmVTZXNzaW9uSXNJbml0aWFsaXplZChTb3VwU2Vzc2lv
biogc2Vzc2lvbikKICAgICBnX29iamVjdF9zZXRfZGF0YShHX09CSkVDVChzZXNzaW9uKSwgIndl
YmtpdC1pbml0IiwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oMHhkZWFkYmVlZikpOwogfQogCi1z
dGF0aWMgYm9vbCBzdGFydEh0dHAoUmVzb3VyY2VIYW5kbGUqIGhhbmRsZSwgU3RyaW5nIHVybFN0
cmluZykKK3N0YXRpYyBib29sIHN0YXJ0SHR0cChSZXNvdXJjZUhhbmRsZSogaGFuZGxlKQogewog
ICAgIEFTU0VSVChoYW5kbGUpOwogCkBAIC00NTksNyArNDU5LDEyIEBAIHN0YXRpYyBib29sIHN0
YXJ0SHR0cChSZXNvdXJjZUhhbmRsZSogaGFuZGxlLCBTdHJpbmcgdXJsU3RyaW5nKQogCiAgICAg
UmVzb3VyY2VIYW5kbGVJbnRlcm5hbCogZCA9IGhhbmRsZS0+Z2V0SW50ZXJuYWwoKTsKIAotICAg
IGQtPm1fbXNnID0gaGFuZGxlLT5yZXF1ZXN0KCkudG9Tb3VwTWVzc2FnZSgpOworICAgIFJlc291
cmNlUmVxdWVzdCByZXF1ZXN0KGhhbmRsZS0+cmVxdWVzdCgpKTsKKyAgICBLVVJMIHVybChyZXF1
ZXN0LnVybCgpKTsKKyAgICB1cmwucmVtb3ZlRnJhZ21lbnRJZGVudGlmaWVyKCk7CisgICAgcmVx
dWVzdC5zZXRVUkwodXJsKTsKKworICAgIGQtPm1fbXNnID0gcmVxdWVzdC50b1NvdXBNZXNzYWdl
KCk7CiAgICAgaWYgKCFkLT5tX21zZykKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC01NzMs
NyArNTc4LDcgQEAgYm9vbCBSZXNvdXJjZUhhbmRsZTo6c3RhcnQoRnJhbWUqIGZyYW1lKQogICAg
ICAgICByZXR1cm4gc3RhcnREYXRhKHRoaXMsIHVybFN0cmluZyk7CiAKICAgICBpZiAoZXF1YWxJ
Z25vcmluZ0Nhc2UocHJvdG9jb2wsICJodHRwIikgfHwgZXF1YWxJZ25vcmluZ0Nhc2UocHJvdG9j
b2wsICJodHRwcyIpKSB7Ci0gICAgICAgIGlmIChzdGFydEh0dHAodGhpcywgdXJsU3RyaW5nKSkK
KyAgICAgICAgaWYgKHN0YXJ0SHR0cCh0aGlzKSkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwog
ICAgIH0KIAotLSAKMS42LjQuMQoK
</data>
<flag name="review"
          id="20247"
          type_id="1"
          status="+"
          setter="gustavo"
    />
    <flag name="commit-queue"
          id="20248"
          type_id="3"
          status="-"
          setter="xan.lopez"
    />
          </attachment>
      

    </bug>

</bugzilla>