1*9646dec5SDamjan Jovanovic /**************************************************************
2*9646dec5SDamjan Jovanovic *
3*9646dec5SDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one
4*9646dec5SDamjan Jovanovic * or more contributor license agreements. See the NOTICE file
5*9646dec5SDamjan Jovanovic * distributed with this work for additional information
6*9646dec5SDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file
7*9646dec5SDamjan Jovanovic * to you under the Apache License, Version 2.0 (the
8*9646dec5SDamjan Jovanovic * "License"); you may not use this file except in compliance
9*9646dec5SDamjan Jovanovic * with the License. You may obtain a copy of the License at
10*9646dec5SDamjan Jovanovic *
11*9646dec5SDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0
12*9646dec5SDamjan Jovanovic *
13*9646dec5SDamjan Jovanovic * Unless required by applicable law or agreed to in writing,
14*9646dec5SDamjan Jovanovic * software distributed under the License is distributed on an
15*9646dec5SDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9646dec5SDamjan Jovanovic * KIND, either express or implied. See the License for the
17*9646dec5SDamjan Jovanovic * specific language governing permissions and limitations
18*9646dec5SDamjan Jovanovic * under the License.
19*9646dec5SDamjan Jovanovic *
20*9646dec5SDamjan Jovanovic *************************************************************/
21*9646dec5SDamjan Jovanovic
22*9646dec5SDamjan Jovanovic // MARKER(update_precomp.py): autogen include statement, do not remove
23*9646dec5SDamjan Jovanovic #include "precompiled_webdav.hxx"
24*9646dec5SDamjan Jovanovic
25*9646dec5SDamjan Jovanovic #include <string.h>
26*9646dec5SDamjan Jovanovic #include <rtl/uri.hxx>
27*9646dec5SDamjan Jovanovic #include <rtl/ustring.hxx>
28*9646dec5SDamjan Jovanovic #include <rtl/ustrbuf.hxx>
29*9646dec5SDamjan Jovanovic #include "CurlUri.hxx"
30*9646dec5SDamjan Jovanovic #include "DAVException.hxx"
31*9646dec5SDamjan Jovanovic
32*9646dec5SDamjan Jovanovic #include <curl/curl.h>
33*9646dec5SDamjan Jovanovic
34*9646dec5SDamjan Jovanovic #include "../inc/urihelper.hxx"
35*9646dec5SDamjan Jovanovic
36*9646dec5SDamjan Jovanovic using namespace http_dav_ucp;
37*9646dec5SDamjan Jovanovic
38*9646dec5SDamjan Jovanovic # if defined __SUNPRO_CC
39*9646dec5SDamjan Jovanovic # pragma enable_warn
40*9646dec5SDamjan Jovanovic #endif
41*9646dec5SDamjan Jovanovic
42*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
43*9646dec5SDamjan Jovanovic // Constructor
44*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
45*9646dec5SDamjan Jovanovic
46*9646dec5SDamjan Jovanovic namespace {
47*9646dec5SDamjan Jovanovic
matchIgnoreAsciiCase(rtl::OString const & rStr1,sal_Char const * pStr2,sal_Int32 nStr2Len)48*9646dec5SDamjan Jovanovic inline bool matchIgnoreAsciiCase(rtl::OString const & rStr1,
49*9646dec5SDamjan Jovanovic sal_Char const * pStr2,
50*9646dec5SDamjan Jovanovic sal_Int32 nStr2Len) SAL_THROW(())
51*9646dec5SDamjan Jovanovic {
52*9646dec5SDamjan Jovanovic return
53*9646dec5SDamjan Jovanovic rtl_str_shortenedCompareIgnoreAsciiCase_WithLength(
54*9646dec5SDamjan Jovanovic rStr1.getStr(), rStr1.getLength(), pStr2, nStr2Len, nStr2Len)
55*9646dec5SDamjan Jovanovic == 0;
56*9646dec5SDamjan Jovanovic }
57*9646dec5SDamjan Jovanovic
getURLStringPart(const CURLU * curlUrl,CURLUPart part,unsigned int flags)58*9646dec5SDamjan Jovanovic inline rtl::OUString getURLStringPart( const CURLU *curlUrl, CURLUPart part, unsigned int flags )
59*9646dec5SDamjan Jovanovic {
60*9646dec5SDamjan Jovanovic char *value = NULL;
61*9646dec5SDamjan Jovanovic CURLUcode rc = curl_url_get( const_cast<CURLU*>( curlUrl ), part, &value, flags );
62*9646dec5SDamjan Jovanovic if ( rc == CURLUE_OK )
63*9646dec5SDamjan Jovanovic {
64*9646dec5SDamjan Jovanovic rtl::OUString str = rtl::OStringToOUString( value, RTL_TEXTENCODING_UTF8 );
65*9646dec5SDamjan Jovanovic curl_free( value );
66*9646dec5SDamjan Jovanovic return str;
67*9646dec5SDamjan Jovanovic }
68*9646dec5SDamjan Jovanovic return rtl::OUString();
69*9646dec5SDamjan Jovanovic }
70*9646dec5SDamjan Jovanovic
71*9646dec5SDamjan Jovanovic }
72*9646dec5SDamjan Jovanovic
CurlUri(const CURLU * inUri)73*9646dec5SDamjan Jovanovic CurlUri::CurlUri( const CURLU * inUri )
74*9646dec5SDamjan Jovanovic throw ( DAVException )
75*9646dec5SDamjan Jovanovic : mURI()
76*9646dec5SDamjan Jovanovic , mScheme()
77*9646dec5SDamjan Jovanovic , mUserName()
78*9646dec5SDamjan Jovanovic , mPassword()
79*9646dec5SDamjan Jovanovic , mHostName()
80*9646dec5SDamjan Jovanovic , mPort()
81*9646dec5SDamjan Jovanovic , mPath()
82*9646dec5SDamjan Jovanovic {
83*9646dec5SDamjan Jovanovic if ( inUri == 0 )
84*9646dec5SDamjan Jovanovic throw DAVException( DAVException::DAV_INVALID_ARG );
85*9646dec5SDamjan Jovanovic mCurlUri = curl_url_dup( const_cast<CURLU *>(inUri) );
86*9646dec5SDamjan Jovanovic if ( mCurlUri == NULL )
87*9646dec5SDamjan Jovanovic throw DAVException( DAVException::DAV_HTTP_ERROR,
88*9646dec5SDamjan Jovanovic rtl::OUString::createFromAscii( "Out of memory" ),
89*9646dec5SDamjan Jovanovic SC_INSUFFICIENT_STORAGE );
90*9646dec5SDamjan Jovanovic
91*9646dec5SDamjan Jovanovic char * uri;
92*9646dec5SDamjan Jovanovic CURLUcode rc = curl_url_get( mCurlUri, CURLUPART_URL, &uri, 0 );
93*9646dec5SDamjan Jovanovic if ( rc != CURLUE_OK )
94*9646dec5SDamjan Jovanovic {
95*9646dec5SDamjan Jovanovic curl_url_cleanup( mCurlUri );
96*9646dec5SDamjan Jovanovic throw DAVException( DAVException::DAV_INVALID_ARG );
97*9646dec5SDamjan Jovanovic }
98*9646dec5SDamjan Jovanovic curl_free( uri );
99*9646dec5SDamjan Jovanovic
100*9646dec5SDamjan Jovanovic init( mCurlUri );
101*9646dec5SDamjan Jovanovic
102*9646dec5SDamjan Jovanovic calculateURI();
103*9646dec5SDamjan Jovanovic }
104*9646dec5SDamjan Jovanovic
CurlUri(const rtl::OUString & inUri)105*9646dec5SDamjan Jovanovic CurlUri::CurlUri( const rtl::OUString & inUri )
106*9646dec5SDamjan Jovanovic throw ( DAVException )
107*9646dec5SDamjan Jovanovic : mCurlUri( 0 )
108*9646dec5SDamjan Jovanovic , mURI()
109*9646dec5SDamjan Jovanovic , mScheme()
110*9646dec5SDamjan Jovanovic , mUserName()
111*9646dec5SDamjan Jovanovic , mPassword()
112*9646dec5SDamjan Jovanovic , mHostName()
113*9646dec5SDamjan Jovanovic , mPort( 0 )
114*9646dec5SDamjan Jovanovic , mPath()
115*9646dec5SDamjan Jovanovic {
116*9646dec5SDamjan Jovanovic if ( inUri.getLength() <= 0 )
117*9646dec5SDamjan Jovanovic throw DAVException( DAVException::DAV_INVALID_ARG );
118*9646dec5SDamjan Jovanovic mCurlUri = curl_url();
119*9646dec5SDamjan Jovanovic if ( mCurlUri == NULL )
120*9646dec5SDamjan Jovanovic throw DAVException( DAVException::DAV_HTTP_ERROR,
121*9646dec5SDamjan Jovanovic rtl::OUString::createFromAscii( "Out of memory" ),
122*9646dec5SDamjan Jovanovic SC_INSUFFICIENT_STORAGE );
123*9646dec5SDamjan Jovanovic
124*9646dec5SDamjan Jovanovic // #i77023#
125*9646dec5SDamjan Jovanovic rtl::OUString aEscapedUri( ucb_impl::urihelper::encodeURI( inUri ) );
126*9646dec5SDamjan Jovanovic
127*9646dec5SDamjan Jovanovic rtl::OString theInputUri(
128*9646dec5SDamjan Jovanovic aEscapedUri.getStr(), aEscapedUri.getLength(), RTL_TEXTENCODING_UTF8 );
129*9646dec5SDamjan Jovanovic
130*9646dec5SDamjan Jovanovic if ( curl_url_set( mCurlUri, CURLUPART_URL, theInputUri.getStr(), 0 ) != CURLUE_OK )
131*9646dec5SDamjan Jovanovic {
132*9646dec5SDamjan Jovanovic // I kid you not:
133*9646dec5SDamjan Jovanovic // Sometimes, we are just given a URL's path part,
134*9646dec5SDamjan Jovanovic // and CREATING THE URL ABSOLUTELY MUST SUCCEED, even though the resulting URL
135*9646dec5SDamjan Jovanovic // of "/path/to/file.txt" will be the terrible "://:0/path/to/file.txt" !!!
136*9646dec5SDamjan Jovanovic // (Such input usually comes from the callers of GetPathBaseName() and the like.)
137*9646dec5SDamjan Jovanovic if ( !theInputUri.isEmpty() && theInputUri[0] == '/' &&
138*9646dec5SDamjan Jovanovic curl_url_set( mCurlUri, CURLUPART_PATH, theInputUri.getStr(), 0 ) != CURLUE_OK )
139*9646dec5SDamjan Jovanovic {
140*9646dec5SDamjan Jovanovic throw DAVException( DAVException::DAV_INVALID_ARG );
141*9646dec5SDamjan Jovanovic }
142*9646dec5SDamjan Jovanovic }
143*9646dec5SDamjan Jovanovic
144*9646dec5SDamjan Jovanovic rtl::OUString portString = getURLStringPart( mCurlUri, CURLUPART_PORT, 0 );
145*9646dec5SDamjan Jovanovic if ( portString.isEmpty() )
146*9646dec5SDamjan Jovanovic {
147*9646dec5SDamjan Jovanovic rtl::OUString defaultPortW = getURLStringPart( mCurlUri, CURLUPART_PORT, CURLU_DEFAULT_PORT );
148*9646dec5SDamjan Jovanovic rtl::OString defaultPortA = OUStringToOString( defaultPortW, RTL_TEXTENCODING_UTF8 );
149*9646dec5SDamjan Jovanovic if ( !defaultPortA.isEmpty() )
150*9646dec5SDamjan Jovanovic curl_url_set( mCurlUri, CURLUPART_PORT, defaultPortA.getStr(), 0 );
151*9646dec5SDamjan Jovanovic }
152*9646dec5SDamjan Jovanovic rtl::OUString path = getURLStringPart( mCurlUri, CURLUPART_PATH, 0 );
153*9646dec5SDamjan Jovanovic if ( path.isEmpty() )
154*9646dec5SDamjan Jovanovic curl_url_set( mCurlUri, CURLUPART_PATH, "/", 0);
155*9646dec5SDamjan Jovanovic
156*9646dec5SDamjan Jovanovic init( mCurlUri );
157*9646dec5SDamjan Jovanovic
158*9646dec5SDamjan Jovanovic calculateURI();
159*9646dec5SDamjan Jovanovic }
160*9646dec5SDamjan Jovanovic
CurlUri(const CurlUri & curlUri)161*9646dec5SDamjan Jovanovic CurlUri::CurlUri( const CurlUri &curlUri )
162*9646dec5SDamjan Jovanovic throw ( DAVException )
163*9646dec5SDamjan Jovanovic : mURI()
164*9646dec5SDamjan Jovanovic , mScheme()
165*9646dec5SDamjan Jovanovic , mUserName()
166*9646dec5SDamjan Jovanovic , mPassword()
167*9646dec5SDamjan Jovanovic , mHostName()
168*9646dec5SDamjan Jovanovic , mPort()
169*9646dec5SDamjan Jovanovic , mPath()
170*9646dec5SDamjan Jovanovic {
171*9646dec5SDamjan Jovanovic mCurlUri = curl_url_dup( curlUri.mCurlUri );
172*9646dec5SDamjan Jovanovic if ( mCurlUri == NULL )
173*9646dec5SDamjan Jovanovic throw DAVException( DAVException::DAV_HTTP_ERROR,
174*9646dec5SDamjan Jovanovic rtl::OUString::createFromAscii( "Out of memory" ),
175*9646dec5SDamjan Jovanovic SC_INSUFFICIENT_STORAGE );
176*9646dec5SDamjan Jovanovic
177*9646dec5SDamjan Jovanovic char * uri;
178*9646dec5SDamjan Jovanovic CURLUcode rc = curl_url_get( mCurlUri, CURLUPART_URL, &uri, 0 );
179*9646dec5SDamjan Jovanovic if ( rc != CURLUE_OK )
180*9646dec5SDamjan Jovanovic {
181*9646dec5SDamjan Jovanovic curl_url_cleanup( mCurlUri );
182*9646dec5SDamjan Jovanovic throw DAVException( DAVException::DAV_INVALID_ARG );
183*9646dec5SDamjan Jovanovic }
184*9646dec5SDamjan Jovanovic curl_free( uri );
185*9646dec5SDamjan Jovanovic
186*9646dec5SDamjan Jovanovic init( mCurlUri );
187*9646dec5SDamjan Jovanovic
188*9646dec5SDamjan Jovanovic calculateURI();
189*9646dec5SDamjan Jovanovic }
190*9646dec5SDamjan Jovanovic
init(const CURLU * pUri)191*9646dec5SDamjan Jovanovic void CurlUri::init( const CURLU * pUri )
192*9646dec5SDamjan Jovanovic {
193*9646dec5SDamjan Jovanovic mScheme = getURLStringPart( pUri, CURLUPART_SCHEME, 0 );
194*9646dec5SDamjan Jovanovic mUserName = getURLStringPart( pUri, CURLUPART_USER, 0 );
195*9646dec5SDamjan Jovanovic mPassword = getURLStringPart( pUri, CURLUPART_PASSWORD, 0 );
196*9646dec5SDamjan Jovanovic mHostName = getURLStringPart( pUri, CURLUPART_HOST, 0 );
197*9646dec5SDamjan Jovanovic rtl::OUString portString = getURLStringPart( pUri, CURLUPART_PORT, 0);
198*9646dec5SDamjan Jovanovic mPort = 0;
199*9646dec5SDamjan Jovanovic if ( !portString.isEmpty() )
200*9646dec5SDamjan Jovanovic mPort = portString.toInt32();
201*9646dec5SDamjan Jovanovic mPath = getURLStringPart( pUri, CURLUPART_PATH, 0 );
202*9646dec5SDamjan Jovanovic
203*9646dec5SDamjan Jovanovic rtl::OUString query = getURLStringPart( pUri, CURLUPART_QUERY, 0 );
204*9646dec5SDamjan Jovanovic if ( !query.isEmpty() )
205*9646dec5SDamjan Jovanovic {
206*9646dec5SDamjan Jovanovic mPath += rtl::OUString::createFromAscii( "?" );
207*9646dec5SDamjan Jovanovic mPath += query;
208*9646dec5SDamjan Jovanovic }
209*9646dec5SDamjan Jovanovic
210*9646dec5SDamjan Jovanovic rtl::OUString fragment = getURLStringPart( pUri, CURLUPART_FRAGMENT, 0 );
211*9646dec5SDamjan Jovanovic if ( !fragment.isEmpty() )
212*9646dec5SDamjan Jovanovic {
213*9646dec5SDamjan Jovanovic mPath += rtl::OUString::createFromAscii( "#" );
214*9646dec5SDamjan Jovanovic mPath += fragment;
215*9646dec5SDamjan Jovanovic }
216*9646dec5SDamjan Jovanovic }
217*9646dec5SDamjan Jovanovic
~CurlUri()218*9646dec5SDamjan Jovanovic CurlUri::~CurlUri( )
219*9646dec5SDamjan Jovanovic {
220*9646dec5SDamjan Jovanovic if ( mCurlUri )
221*9646dec5SDamjan Jovanovic curl_url_cleanup( mCurlUri );
222*9646dec5SDamjan Jovanovic }
223*9646dec5SDamjan Jovanovic
calculateURI()224*9646dec5SDamjan Jovanovic void CurlUri::calculateURI ()
225*9646dec5SDamjan Jovanovic {
226*9646dec5SDamjan Jovanovic rtl::OUStringBuffer aBuf( mScheme );
227*9646dec5SDamjan Jovanovic aBuf.appendAscii( "://" );
228*9646dec5SDamjan Jovanovic if ( mUserName.getLength() > 0 )
229*9646dec5SDamjan Jovanovic {
230*9646dec5SDamjan Jovanovic aBuf.append( mUserName );
231*9646dec5SDamjan Jovanovic if ( mPassword.getLength() > 0 )
232*9646dec5SDamjan Jovanovic {
233*9646dec5SDamjan Jovanovic aBuf.appendAscii( ":" );
234*9646dec5SDamjan Jovanovic aBuf.append( mPassword );
235*9646dec5SDamjan Jovanovic }
236*9646dec5SDamjan Jovanovic aBuf.appendAscii( "@" );
237*9646dec5SDamjan Jovanovic }
238*9646dec5SDamjan Jovanovic // Is host a numeric IPv6 address?
239*9646dec5SDamjan Jovanovic if ( ( mHostName.indexOf( ':' ) != -1 ) &&
240*9646dec5SDamjan Jovanovic ( mHostName[ 0 ] != sal_Unicode( '[' ) ) )
241*9646dec5SDamjan Jovanovic {
242*9646dec5SDamjan Jovanovic aBuf.appendAscii( "[" );
243*9646dec5SDamjan Jovanovic aBuf.append( mHostName );
244*9646dec5SDamjan Jovanovic aBuf.appendAscii( "]" );
245*9646dec5SDamjan Jovanovic }
246*9646dec5SDamjan Jovanovic else
247*9646dec5SDamjan Jovanovic {
248*9646dec5SDamjan Jovanovic aBuf.append( mHostName );
249*9646dec5SDamjan Jovanovic }
250*9646dec5SDamjan Jovanovic
251*9646dec5SDamjan Jovanovic // append port, but only, if not default port.
252*9646dec5SDamjan Jovanovic bool bAppendPort = true;
253*9646dec5SDamjan Jovanovic switch ( mPort )
254*9646dec5SDamjan Jovanovic {
255*9646dec5SDamjan Jovanovic case DEFAULT_HTTP_PORT:
256*9646dec5SDamjan Jovanovic bAppendPort = !mScheme.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "http" ) );
257*9646dec5SDamjan Jovanovic break;
258*9646dec5SDamjan Jovanovic
259*9646dec5SDamjan Jovanovic case DEFAULT_HTTPS_PORT:
260*9646dec5SDamjan Jovanovic bAppendPort = !mScheme.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "https" ) );
261*9646dec5SDamjan Jovanovic break;
262*9646dec5SDamjan Jovanovic }
263*9646dec5SDamjan Jovanovic if ( bAppendPort )
264*9646dec5SDamjan Jovanovic {
265*9646dec5SDamjan Jovanovic aBuf.appendAscii( ":" );
266*9646dec5SDamjan Jovanovic aBuf.append( rtl::OUString::valueOf( mPort ) );
267*9646dec5SDamjan Jovanovic }
268*9646dec5SDamjan Jovanovic aBuf.append( mPath );
269*9646dec5SDamjan Jovanovic
270*9646dec5SDamjan Jovanovic mURI = aBuf.makeStringAndClear();
271*9646dec5SDamjan Jovanovic }
272*9646dec5SDamjan Jovanovic
GetPathBaseName() const273*9646dec5SDamjan Jovanovic ::rtl::OUString CurlUri::GetPathBaseName () const
274*9646dec5SDamjan Jovanovic {
275*9646dec5SDamjan Jovanovic sal_Int32 nPos = mPath.lastIndexOf ('/');
276*9646dec5SDamjan Jovanovic sal_Int32 nTrail = 0;
277*9646dec5SDamjan Jovanovic if (nPos == mPath.getLength () - 1)
278*9646dec5SDamjan Jovanovic {
279*9646dec5SDamjan Jovanovic // Trailing slash found. Skip.
280*9646dec5SDamjan Jovanovic nTrail = 1;
281*9646dec5SDamjan Jovanovic nPos = mPath.lastIndexOf ('/', nPos);
282*9646dec5SDamjan Jovanovic }
283*9646dec5SDamjan Jovanovic if (nPos != -1)
284*9646dec5SDamjan Jovanovic {
285*9646dec5SDamjan Jovanovic rtl::OUString aTemp(
286*9646dec5SDamjan Jovanovic mPath.copy (nPos + 1, mPath.getLength () - nPos - 1 - nTrail) );
287*9646dec5SDamjan Jovanovic
288*9646dec5SDamjan Jovanovic // query, fragment present?
289*9646dec5SDamjan Jovanovic nPos = aTemp.indexOf( '?' );
290*9646dec5SDamjan Jovanovic if ( nPos == -1 )
291*9646dec5SDamjan Jovanovic nPos = aTemp.indexOf( '#' );
292*9646dec5SDamjan Jovanovic
293*9646dec5SDamjan Jovanovic if ( nPos != -1 )
294*9646dec5SDamjan Jovanovic aTemp = aTemp.copy( 0, nPos );
295*9646dec5SDamjan Jovanovic
296*9646dec5SDamjan Jovanovic return aTemp;
297*9646dec5SDamjan Jovanovic }
298*9646dec5SDamjan Jovanovic else
299*9646dec5SDamjan Jovanovic return rtl::OUString::createFromAscii ("/");
300*9646dec5SDamjan Jovanovic }
301*9646dec5SDamjan Jovanovic
operator ==(const CurlUri & rOther) const302*9646dec5SDamjan Jovanovic bool CurlUri::operator== ( const CurlUri & rOther ) const
303*9646dec5SDamjan Jovanovic {
304*9646dec5SDamjan Jovanovic return ( mURI == rOther.mURI );
305*9646dec5SDamjan Jovanovic }
306*9646dec5SDamjan Jovanovic
GetPathBaseNameUnescaped() const307*9646dec5SDamjan Jovanovic ::rtl::OUString CurlUri::GetPathBaseNameUnescaped () const
308*9646dec5SDamjan Jovanovic {
309*9646dec5SDamjan Jovanovic return unescape( GetPathBaseName() );
310*9646dec5SDamjan Jovanovic }
311*9646dec5SDamjan Jovanovic
AppendPath(const rtl::OUString & rPath)312*9646dec5SDamjan Jovanovic void CurlUri::AppendPath (const rtl::OUString& rPath)
313*9646dec5SDamjan Jovanovic {
314*9646dec5SDamjan Jovanovic if (mPath.lastIndexOf ('/') != mPath.getLength () - 1)
315*9646dec5SDamjan Jovanovic mPath += rtl::OUString::createFromAscii ("/");
316*9646dec5SDamjan Jovanovic
317*9646dec5SDamjan Jovanovic mPath += rPath;
318*9646dec5SDamjan Jovanovic calculateURI ();
319*9646dec5SDamjan Jovanovic };
320*9646dec5SDamjan Jovanovic
321*9646dec5SDamjan Jovanovic // static
escapeSegment(const rtl::OUString & segment)322*9646dec5SDamjan Jovanovic rtl::OUString CurlUri::escapeSegment( const rtl::OUString& segment )
323*9646dec5SDamjan Jovanovic {
324*9646dec5SDamjan Jovanovic return rtl::Uri::encode( segment,
325*9646dec5SDamjan Jovanovic rtl_UriCharClassPchar,
326*9646dec5SDamjan Jovanovic rtl_UriEncodeIgnoreEscapes,
327*9646dec5SDamjan Jovanovic RTL_TEXTENCODING_UTF8 );
328*9646dec5SDamjan Jovanovic }
329*9646dec5SDamjan Jovanovic
330*9646dec5SDamjan Jovanovic // static
unescape(const rtl::OUString & segment)331*9646dec5SDamjan Jovanovic rtl::OUString CurlUri::unescape( const rtl::OUString& segment )
332*9646dec5SDamjan Jovanovic {
333*9646dec5SDamjan Jovanovic return rtl::Uri::decode( segment,
334*9646dec5SDamjan Jovanovic rtl_UriDecodeWithCharset,
335*9646dec5SDamjan Jovanovic RTL_TEXTENCODING_UTF8 );
336*9646dec5SDamjan Jovanovic }
337*9646dec5SDamjan Jovanovic
338*9646dec5SDamjan Jovanovic // static
makeConnectionEndPointString(const rtl::OUString & rHostName,int nPort)339*9646dec5SDamjan Jovanovic rtl::OUString CurlUri::makeConnectionEndPointString(
340*9646dec5SDamjan Jovanovic const rtl::OUString & rHostName, int nPort )
341*9646dec5SDamjan Jovanovic {
342*9646dec5SDamjan Jovanovic rtl::OUStringBuffer aBuf;
343*9646dec5SDamjan Jovanovic
344*9646dec5SDamjan Jovanovic // Is host a numeric IPv6 address?
345*9646dec5SDamjan Jovanovic if ( ( rHostName.indexOf( ':' ) != -1 ) &&
346*9646dec5SDamjan Jovanovic ( rHostName[ 0 ] != sal_Unicode( '[' ) ) )
347*9646dec5SDamjan Jovanovic {
348*9646dec5SDamjan Jovanovic aBuf.appendAscii( "[" );
349*9646dec5SDamjan Jovanovic aBuf.append( rHostName );
350*9646dec5SDamjan Jovanovic aBuf.appendAscii( "]" );
351*9646dec5SDamjan Jovanovic }
352*9646dec5SDamjan Jovanovic else
353*9646dec5SDamjan Jovanovic {
354*9646dec5SDamjan Jovanovic aBuf.append( rHostName );
355*9646dec5SDamjan Jovanovic }
356*9646dec5SDamjan Jovanovic
357*9646dec5SDamjan Jovanovic if ( ( nPort != DEFAULT_HTTP_PORT ) && ( nPort != DEFAULT_HTTPS_PORT ) )
358*9646dec5SDamjan Jovanovic {
359*9646dec5SDamjan Jovanovic aBuf.appendAscii( ":" );
360*9646dec5SDamjan Jovanovic aBuf.append( rtl::OUString::valueOf( sal_Int32( nPort ) ) );
361*9646dec5SDamjan Jovanovic }
362*9646dec5SDamjan Jovanovic return aBuf.makeStringAndClear();
363*9646dec5SDamjan Jovanovic }
364