You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@trafficserver.apache.org by "Kopel, Yakov" <yk...@websense.com> on 2012/06/27 17:39:06 UTC

CONNECT to parent proxy has URL with a trailing slash

I want to redirect a CONNECT request to parent proxy.
I'm doing it with the TSHttpTxnParentProxySet API.

The problem is that the URL that the TS is setting is invalid:
	
	CONNECT www.google.com:443/ HTTP/1.1
	Host: www.google.com:443

The TS adding to every URL a trailing slash in the end of the URL, but here it makes the URL invalid (look at http://www.ietf.org/rfc/rfc2817.txt  in section 5.2).

Solution:
	I'm suggesting a patch for the URL.cc file that doesn't add a trailing slash when not needed (when there is only hostname).
	This is valid action as is written in the RFC (http://tools.ietf.org/html/rfc3986 in section 3) :
		"When authority is present, the path must either be empty -or- begin with a slash ("/") character"
	While" authority" is the hostaname.

The patch:

diff --git a/proxy/hdrs/URL.cc b/proxy/hdrs/URL.cc
index 33416b5..f18ad0f 100644
--- a/proxy/hdrs/URL.cc
+++ b/proxy/hdrs/URL.cc
@@ -778,7 +778,7 @@ url_length_get(URLImpl * url)

   if (url->m_ptr_path)
     length += url->m_len_path + 1;      // +1 for /
-  else
+  else if (!url->m_ptr_host) // we put '/' only when there is no host name
     length += 1;                // +1 for /

   if (url->m_ptr_params)
@@ -1551,8 +1551,12 @@ url_print(URLImpl * url, char *buf_start, int buf_length, int *buf_index_inout,
                          buf_start, buf_length, buf_index_inout, buf_chars_to_skip_inout));
     }
   }
-
-  TRY(mime_mem_print("/", 1, buf_start, buf_length, buf_index_inout, buf_chars_to_skip_inout));
+
+  // Put the trailing slash only if there is another content in the url (path)
+  // or that there is no host name
+  if (url->m_ptr_path || !url->m_ptr_host) {
+     TRY(mime_mem_print("/", 1, buf_start, buf_length, buf_index_inout, buf_chars_to_skip_inout));
+  }

   if (url->m_ptr_path) {
     TRY(mime_mem_print(url->m_ptr_path, url->m_len_path, buf_start,



 Protected by Websense Hosted Email Security -- www.websense.com 

Re: CONNECT to parent proxy has URL with a trailing slash

Posted by Leif Hedstrom <zw...@apache.org>.
On 6/27/12 8:39 AM, Kopel, Yakov wrote:
> I want to redirect a CONNECT request to parent proxy.
> I'm doing it with the TSHttpTxnParentProxySet API.

Can you go to Jira and see if there's a bug filed for this already? 
Maybe it was you who filed it? :). I remember seeing something about 
that trailing slash in a Jira ticket.

If not, just open a new ticket and attach the patch to it.

Cheers,


-- Leif

>
> The problem is that the URL that the TS is setting is invalid:
> 	
> 	CONNECT www.google.com:443/ HTTP/1.1
> 	Host: www.google.com:443
>
> The TS adding to every URL a trailing slash in the end of the URL, but here it makes the URL invalid (look at http://www.ietf.org/rfc/rfc2817.txt  in section 5.2).
>
> Solution:
> 	I'm suggesting a patch for the URL.cc file that doesn't add a trailing slash when not needed (when there is only hostname).
> 	This is valid action as is written in the RFC (http://tools.ietf.org/html/rfc3986 in section 3) :
> 		"When authority is present, the path must either be empty -or- begin with a slash ("/") character"
> 	While" authority" is the hostaname.
>
> The patch:
>
> diff --git a/proxy/hdrs/URL.cc b/proxy/hdrs/URL.cc
> index 33416b5..f18ad0f 100644
> --- a/proxy/hdrs/URL.cc
> +++ b/proxy/hdrs/URL.cc
> @@ -778,7 +778,7 @@ url_length_get(URLImpl * url)
>
>     if (url->m_ptr_path)
>       length += url->m_len_path + 1;      // +1 for /
> -  else
> +  else if (!url->m_ptr_host) // we put '/' only when there is no host name
>       length += 1;                // +1 for /
>
>     if (url->m_ptr_params)
> @@ -1551,8 +1551,12 @@ url_print(URLImpl * url, char *buf_start, int buf_length, int *buf_index_inout,
>                            buf_start, buf_length, buf_index_inout, buf_chars_to_skip_inout));
>       }
>     }
> -
> -  TRY(mime_mem_print("/", 1, buf_start, buf_length, buf_index_inout, buf_chars_to_skip_inout));
> +
> +  // Put the trailing slash only if there is another content in the url (path)
> +  // or that there is no host name
> +  if (url->m_ptr_path || !url->m_ptr_host) {
> +     TRY(mime_mem_print("/", 1, buf_start, buf_length, buf_index_inout, buf_chars_to_skip_inout));
> +  }
>
>     if (url->m_ptr_path) {
>       TRY(mime_mem_print(url->m_ptr_path, url->m_len_path, buf_start,
>
>
>
>   Protected by Websense Hosted Email Security -- www.websense.com