18590a0fdSAndre Fischer /**************************************************************
28590a0fdSAndre Fischer *
38590a0fdSAndre Fischer * Licensed to the Apache Software Foundation (ASF) under one
48590a0fdSAndre Fischer * or more contributor license agreements. See the NOTICE file
58590a0fdSAndre Fischer * distributed with this work for additional information
68590a0fdSAndre Fischer * regarding copyright ownership. The ASF licenses this file
78590a0fdSAndre Fischer * to you under the Apache License, Version 2.0 (the
88590a0fdSAndre Fischer * "License"); you may not use this file except in compliance
98590a0fdSAndre Fischer * with the License. You may obtain a copy of the License at
108590a0fdSAndre Fischer *
118590a0fdSAndre Fischer * http://www.apache.org/licenses/LICENSE-2.0
128590a0fdSAndre Fischer *
138590a0fdSAndre Fischer * Unless required by applicable law or agreed to in writing,
148590a0fdSAndre Fischer * software distributed under the License is distributed on an
158590a0fdSAndre Fischer * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
168590a0fdSAndre Fischer * KIND, either express or implied. See the License for the
178590a0fdSAndre Fischer * specific language governing permissions and limitations
188590a0fdSAndre Fischer * under the License.
198590a0fdSAndre Fischer *
208590a0fdSAndre Fischer *************************************************************/
218590a0fdSAndre Fischer
228590a0fdSAndre Fischer // MARKER(update_precomp.py): autogen include statement, do not remove
23421ed02eSdamjan #include "precompiled_webdav.hxx"
248590a0fdSAndre Fischer
258590a0fdSAndre Fischer #include <string.h>
268590a0fdSAndre Fischer #include <rtl/uri.hxx>
278590a0fdSAndre Fischer #include <rtl/ustring.hxx>
288590a0fdSAndre Fischer #include <rtl/ustrbuf.hxx>
29*9646dec5SDamjan Jovanovic #include "CurlUri.hxx"
308590a0fdSAndre Fischer #include "DAVException.hxx"
31*9646dec5SDamjan Jovanovic
32*9646dec5SDamjan Jovanovic #include <curl/curl.h>
338590a0fdSAndre Fischer
348590a0fdSAndre Fischer #include "../inc/urihelper.hxx"
358590a0fdSAndre Fischer
368590a0fdSAndre Fischer using namespace http_dav_ucp;
378590a0fdSAndre Fischer
388590a0fdSAndre Fischer # if defined __SUNPRO_CC
398590a0fdSAndre Fischer # pragma enable_warn
408590a0fdSAndre Fischer #endif
418590a0fdSAndre Fischer
428590a0fdSAndre Fischer // -------------------------------------------------------------------
438590a0fdSAndre Fischer // Constructor
448590a0fdSAndre Fischer // -------------------------------------------------------------------
458590a0fdSAndre Fischer
468590a0fdSAndre Fischer namespace {
478590a0fdSAndre Fischer
matchIgnoreAsciiCase(rtl::OString const & rStr1,sal_Char const * pStr2,sal_Int32 nStr2Len)488590a0fdSAndre Fischer inline bool matchIgnoreAsciiCase(rtl::OString const & rStr1,
498590a0fdSAndre Fischer sal_Char const * pStr2,
508590a0fdSAndre Fischer sal_Int32 nStr2Len) SAL_THROW(())
518590a0fdSAndre Fischer {
528590a0fdSAndre Fischer return
538590a0fdSAndre Fischer rtl_str_shortenedCompareIgnoreAsciiCase_WithLength(
548590a0fdSAndre Fischer rStr1.getStr(), rStr1.getLength(), pStr2, nStr2Len, nStr2Len)
558590a0fdSAndre Fischer == 0;
568590a0fdSAndre Fischer }
578590a0fdSAndre Fischer
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();
698590a0fdSAndre Fischer }
708590a0fdSAndre Fischer
71*9646dec5SDamjan Jovanovic }
72*9646dec5SDamjan Jovanovic
CurlUri(const CURLU * inUri)73*9646dec5SDamjan Jovanovic CurlUri::CurlUri( const CURLU * inUri )
748590a0fdSAndre Fischer throw ( DAVException )
75*9646dec5SDamjan Jovanovic : mURI()
768590a0fdSAndre Fischer , mScheme()
77*9646dec5SDamjan Jovanovic , mUserName()
78*9646dec5SDamjan Jovanovic , mPassword()
798590a0fdSAndre Fischer , mHostName()
808590a0fdSAndre Fischer , mPort()
818590a0fdSAndre Fischer , mPath()
828590a0fdSAndre Fischer {
838590a0fdSAndre Fischer if ( inUri == 0 )
848590a0fdSAndre Fischer 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 );
968590a0fdSAndre Fischer throw DAVException( DAVException::DAV_INVALID_ARG );
97*9646dec5SDamjan Jovanovic }
98*9646dec5SDamjan Jovanovic curl_free( uri );
998590a0fdSAndre Fischer
100*9646dec5SDamjan Jovanovic init( mCurlUri );
1018590a0fdSAndre Fischer
1028590a0fdSAndre Fischer calculateURI();
1038590a0fdSAndre Fischer }
1048590a0fdSAndre Fischer
CurlUri(const rtl::OUString & inUri)105*9646dec5SDamjan Jovanovic CurlUri::CurlUri( const rtl::OUString & inUri )
1068590a0fdSAndre Fischer throw ( DAVException )
107*9646dec5SDamjan Jovanovic : mCurlUri( 0 )
1088590a0fdSAndre Fischer , mURI()
1098590a0fdSAndre Fischer , mScheme()
110*9646dec5SDamjan Jovanovic , mUserName()
111*9646dec5SDamjan Jovanovic , mPassword()
1128590a0fdSAndre Fischer , mHostName()
113*9646dec5SDamjan Jovanovic , mPort( 0 )
1148590a0fdSAndre Fischer , mPath()
1158590a0fdSAndre Fischer {
1168590a0fdSAndre Fischer if ( inUri.getLength() <= 0 )
1178590a0fdSAndre Fischer 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 );
1238590a0fdSAndre Fischer
1248590a0fdSAndre Fischer // #i77023#
1258590a0fdSAndre Fischer rtl::OUString aEscapedUri( ucb_impl::urihelper::encodeURI( inUri ) );
1268590a0fdSAndre Fischer
1278590a0fdSAndre Fischer rtl::OString theInputUri(
1288590a0fdSAndre Fischer aEscapedUri.getStr(), aEscapedUri.getLength(), RTL_TEXTENCODING_UTF8 );
1298590a0fdSAndre Fischer
130*9646dec5SDamjan Jovanovic if ( curl_url_set( mCurlUri, CURLUPART_URL, theInputUri.getStr(), 0 ) != CURLUE_OK )
1318590a0fdSAndre Fischer {
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 }
1428590a0fdSAndre Fischer }
143*9646dec5SDamjan Jovanovic
144*9646dec5SDamjan Jovanovic rtl::OUString portString = getURLStringPart( mCurlUri, CURLUPART_PORT, 0 );
145*9646dec5SDamjan Jovanovic if ( portString.isEmpty() )
1468590a0fdSAndre Fischer {
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 );
1518590a0fdSAndre Fischer }
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 )
1808590a0fdSAndre Fischer {
181*9646dec5SDamjan Jovanovic curl_url_cleanup( mCurlUri );
182*9646dec5SDamjan Jovanovic throw DAVException( DAVException::DAV_INVALID_ARG );
1838590a0fdSAndre Fischer }
184*9646dec5SDamjan Jovanovic curl_free( uri );
1858590a0fdSAndre Fischer
186*9646dec5SDamjan Jovanovic init( mCurlUri );
1878590a0fdSAndre Fischer
1888590a0fdSAndre Fischer calculateURI();
1898590a0fdSAndre Fischer }
1908590a0fdSAndre Fischer
init(const CURLU * pUri)191*9646dec5SDamjan Jovanovic void CurlUri::init( const CURLU * pUri )
1928590a0fdSAndre Fischer {
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() )
2058590a0fdSAndre Fischer {
2068590a0fdSAndre Fischer mPath += rtl::OUString::createFromAscii( "?" );
207*9646dec5SDamjan Jovanovic mPath += query;
2088590a0fdSAndre Fischer }
2098590a0fdSAndre Fischer
210*9646dec5SDamjan Jovanovic rtl::OUString fragment = getURLStringPart( pUri, CURLUPART_FRAGMENT, 0 );
211*9646dec5SDamjan Jovanovic if ( !fragment.isEmpty() )
2128590a0fdSAndre Fischer {
2138590a0fdSAndre Fischer mPath += rtl::OUString::createFromAscii( "#" );
214*9646dec5SDamjan Jovanovic mPath += fragment;
2158590a0fdSAndre Fischer }
2168590a0fdSAndre Fischer }
2178590a0fdSAndre Fischer
~CurlUri()218*9646dec5SDamjan Jovanovic CurlUri::~CurlUri( )
2198590a0fdSAndre Fischer {
220*9646dec5SDamjan Jovanovic if ( mCurlUri )
221*9646dec5SDamjan Jovanovic curl_url_cleanup( mCurlUri );
2228590a0fdSAndre Fischer }
2238590a0fdSAndre Fischer
calculateURI()224*9646dec5SDamjan Jovanovic void CurlUri::calculateURI ()
2258590a0fdSAndre Fischer {
2268590a0fdSAndre Fischer rtl::OUStringBuffer aBuf( mScheme );
2278590a0fdSAndre Fischer aBuf.appendAscii( "://" );
228*9646dec5SDamjan Jovanovic if ( mUserName.getLength() > 0 )
2298590a0fdSAndre Fischer {
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 }
2368590a0fdSAndre Fischer aBuf.appendAscii( "@" );
2378590a0fdSAndre Fischer }
2388590a0fdSAndre Fischer // Is host a numeric IPv6 address?
2398590a0fdSAndre Fischer if ( ( mHostName.indexOf( ':' ) != -1 ) &&
2408590a0fdSAndre Fischer ( mHostName[ 0 ] != sal_Unicode( '[' ) ) )
2418590a0fdSAndre Fischer {
2428590a0fdSAndre Fischer aBuf.appendAscii( "[" );
2438590a0fdSAndre Fischer aBuf.append( mHostName );
2448590a0fdSAndre Fischer aBuf.appendAscii( "]" );
2458590a0fdSAndre Fischer }
2468590a0fdSAndre Fischer else
2478590a0fdSAndre Fischer {
2488590a0fdSAndre Fischer aBuf.append( mHostName );
2498590a0fdSAndre Fischer }
2508590a0fdSAndre Fischer
2518590a0fdSAndre Fischer // append port, but only, if not default port.
2528590a0fdSAndre Fischer bool bAppendPort = true;
2538590a0fdSAndre Fischer switch ( mPort )
2548590a0fdSAndre Fischer {
2558590a0fdSAndre Fischer case DEFAULT_HTTP_PORT:
2568590a0fdSAndre Fischer bAppendPort = !mScheme.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "http" ) );
2578590a0fdSAndre Fischer break;
2588590a0fdSAndre Fischer
2598590a0fdSAndre Fischer case DEFAULT_HTTPS_PORT:
2608590a0fdSAndre Fischer bAppendPort = !mScheme.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "https" ) );
2618590a0fdSAndre Fischer break;
2628590a0fdSAndre Fischer }
2638590a0fdSAndre Fischer if ( bAppendPort )
2648590a0fdSAndre Fischer {
2658590a0fdSAndre Fischer aBuf.appendAscii( ":" );
2668590a0fdSAndre Fischer aBuf.append( rtl::OUString::valueOf( mPort ) );
2678590a0fdSAndre Fischer }
2688590a0fdSAndre Fischer aBuf.append( mPath );
2698590a0fdSAndre Fischer
2708590a0fdSAndre Fischer mURI = aBuf.makeStringAndClear();
2718590a0fdSAndre Fischer }
2728590a0fdSAndre Fischer
GetPathBaseName() const273*9646dec5SDamjan Jovanovic ::rtl::OUString CurlUri::GetPathBaseName () const
2748590a0fdSAndre Fischer {
2758590a0fdSAndre Fischer sal_Int32 nPos = mPath.lastIndexOf ('/');
2768590a0fdSAndre Fischer sal_Int32 nTrail = 0;
2778590a0fdSAndre Fischer if (nPos == mPath.getLength () - 1)
2788590a0fdSAndre Fischer {
2798590a0fdSAndre Fischer // Trailing slash found. Skip.
2808590a0fdSAndre Fischer nTrail = 1;
2818590a0fdSAndre Fischer nPos = mPath.lastIndexOf ('/', nPos);
2828590a0fdSAndre Fischer }
2838590a0fdSAndre Fischer if (nPos != -1)
2848590a0fdSAndre Fischer {
2858590a0fdSAndre Fischer rtl::OUString aTemp(
2868590a0fdSAndre Fischer mPath.copy (nPos + 1, mPath.getLength () - nPos - 1 - nTrail) );
2878590a0fdSAndre Fischer
2888590a0fdSAndre Fischer // query, fragment present?
2898590a0fdSAndre Fischer nPos = aTemp.indexOf( '?' );
2908590a0fdSAndre Fischer if ( nPos == -1 )
2918590a0fdSAndre Fischer nPos = aTemp.indexOf( '#' );
2928590a0fdSAndre Fischer
2938590a0fdSAndre Fischer if ( nPos != -1 )
2948590a0fdSAndre Fischer aTemp = aTemp.copy( 0, nPos );
2958590a0fdSAndre Fischer
2968590a0fdSAndre Fischer return aTemp;
2978590a0fdSAndre Fischer }
2988590a0fdSAndre Fischer else
2998590a0fdSAndre Fischer return rtl::OUString::createFromAscii ("/");
3008590a0fdSAndre Fischer }
3018590a0fdSAndre Fischer
operator ==(const CurlUri & rOther) const302*9646dec5SDamjan Jovanovic bool CurlUri::operator== ( const CurlUri & rOther ) const
3038590a0fdSAndre Fischer {
3048590a0fdSAndre Fischer return ( mURI == rOther.mURI );
3058590a0fdSAndre Fischer }
3068590a0fdSAndre Fischer
GetPathBaseNameUnescaped() const307*9646dec5SDamjan Jovanovic ::rtl::OUString CurlUri::GetPathBaseNameUnescaped () const
3088590a0fdSAndre Fischer {
3098590a0fdSAndre Fischer return unescape( GetPathBaseName() );
3108590a0fdSAndre Fischer }
3118590a0fdSAndre Fischer
AppendPath(const rtl::OUString & rPath)312*9646dec5SDamjan Jovanovic void CurlUri::AppendPath (const rtl::OUString& rPath)
3138590a0fdSAndre Fischer {
3148590a0fdSAndre Fischer if (mPath.lastIndexOf ('/') != mPath.getLength () - 1)
3158590a0fdSAndre Fischer mPath += rtl::OUString::createFromAscii ("/");
3168590a0fdSAndre Fischer
3178590a0fdSAndre Fischer mPath += rPath;
3188590a0fdSAndre Fischer calculateURI ();
3198590a0fdSAndre Fischer };
3208590a0fdSAndre Fischer
3218590a0fdSAndre Fischer // static
escapeSegment(const rtl::OUString & segment)322*9646dec5SDamjan Jovanovic rtl::OUString CurlUri::escapeSegment( const rtl::OUString& segment )
3238590a0fdSAndre Fischer {
3248590a0fdSAndre Fischer return rtl::Uri::encode( segment,
3258590a0fdSAndre Fischer rtl_UriCharClassPchar,
3268590a0fdSAndre Fischer rtl_UriEncodeIgnoreEscapes,
3278590a0fdSAndre Fischer RTL_TEXTENCODING_UTF8 );
3288590a0fdSAndre Fischer }
3298590a0fdSAndre Fischer
3308590a0fdSAndre Fischer // static
unescape(const rtl::OUString & segment)331*9646dec5SDamjan Jovanovic rtl::OUString CurlUri::unescape( const rtl::OUString& segment )
3328590a0fdSAndre Fischer {
3338590a0fdSAndre Fischer return rtl::Uri::decode( segment,
3348590a0fdSAndre Fischer rtl_UriDecodeWithCharset,
3358590a0fdSAndre Fischer RTL_TEXTENCODING_UTF8 );
3368590a0fdSAndre Fischer }
3378590a0fdSAndre Fischer
3388590a0fdSAndre Fischer // static
makeConnectionEndPointString(const rtl::OUString & rHostName,int nPort)339*9646dec5SDamjan Jovanovic rtl::OUString CurlUri::makeConnectionEndPointString(
3408590a0fdSAndre Fischer const rtl::OUString & rHostName, int nPort )
3418590a0fdSAndre Fischer {
3428590a0fdSAndre Fischer rtl::OUStringBuffer aBuf;
3438590a0fdSAndre Fischer
3448590a0fdSAndre Fischer // Is host a numeric IPv6 address?
3458590a0fdSAndre Fischer if ( ( rHostName.indexOf( ':' ) != -1 ) &&
3468590a0fdSAndre Fischer ( rHostName[ 0 ] != sal_Unicode( '[' ) ) )
3478590a0fdSAndre Fischer {
3488590a0fdSAndre Fischer aBuf.appendAscii( "[" );
3498590a0fdSAndre Fischer aBuf.append( rHostName );
3508590a0fdSAndre Fischer aBuf.appendAscii( "]" );
3518590a0fdSAndre Fischer }
3528590a0fdSAndre Fischer else
3538590a0fdSAndre Fischer {
3548590a0fdSAndre Fischer aBuf.append( rHostName );
3558590a0fdSAndre Fischer }
3568590a0fdSAndre Fischer
3578590a0fdSAndre Fischer if ( ( nPort != DEFAULT_HTTP_PORT ) && ( nPort != DEFAULT_HTTPS_PORT ) )
3588590a0fdSAndre Fischer {
3598590a0fdSAndre Fischer aBuf.appendAscii( ":" );
3608590a0fdSAndre Fischer aBuf.append( rtl::OUString::valueOf( sal_Int32( nPort ) ) );
3618590a0fdSAndre Fischer }
3628590a0fdSAndre Fischer return aBuf.makeStringAndClear();
3638590a0fdSAndre Fischer }
3648590a0fdSAndre Fischer
365