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