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
238590a0fdSAndre Fischer #include "precompiled_ucb.hxx"
248590a0fdSAndre Fischer
25*c1c10f68SAriel Constenla-Haile #include "SerfHeadReqProcImpl.hxx"
268590a0fdSAndre Fischer
278590a0fdSAndre Fischer using namespace com::sun::star;
288590a0fdSAndre Fischer
298590a0fdSAndre Fischer namespace http_dav_ucp
308590a0fdSAndre Fischer {
318590a0fdSAndre Fischer
SerfHeadReqProcImpl(const char * inPath,const DAVRequestHeaders & inRequestHeaders,const std::vector<::rtl::OUString> & inHeaderNames,DAVResource & ioResource)328590a0fdSAndre Fischer SerfHeadReqProcImpl::SerfHeadReqProcImpl( const char* inPath,
33e9ff7e89SOliver-Rainer Wittmann const DAVRequestHeaders& inRequestHeaders,
34e9ff7e89SOliver-Rainer Wittmann const std::vector< ::rtl::OUString > & inHeaderNames,
35e9ff7e89SOliver-Rainer Wittmann DAVResource & ioResource )
36e9ff7e89SOliver-Rainer Wittmann : SerfRequestProcessorImpl( inPath, inRequestHeaders )
378590a0fdSAndre Fischer , mpHeaderNames( &inHeaderNames )
388590a0fdSAndre Fischer , mpResource( &ioResource )
398590a0fdSAndre Fischer {
408590a0fdSAndre Fischer }
418590a0fdSAndre Fischer
~SerfHeadReqProcImpl()428590a0fdSAndre Fischer SerfHeadReqProcImpl::~SerfHeadReqProcImpl()
438590a0fdSAndre Fischer {
448590a0fdSAndre Fischer }
458590a0fdSAndre Fischer
createSerfRequestBucket(serf_request_t * inSerfRequest)468590a0fdSAndre Fischer serf_bucket_t * SerfHeadReqProcImpl::createSerfRequestBucket( serf_request_t * inSerfRequest )
478590a0fdSAndre Fischer {
488590a0fdSAndre Fischer // create serf request
498590a0fdSAndre Fischer serf_bucket_t *req_bkt = serf_request_bucket_request_create( inSerfRequest,
508590a0fdSAndre Fischer "HEAD",
518590a0fdSAndre Fischer getPathStr(),
528590a0fdSAndre Fischer 0,
538590a0fdSAndre Fischer serf_request_get_alloc( inSerfRequest ) );
548590a0fdSAndre Fischer
558590a0fdSAndre Fischer // set request header fields
568590a0fdSAndre Fischer serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt );
57e9ff7e89SOliver-Rainer Wittmann // general header fields provided by caller
58e9ff7e89SOliver-Rainer Wittmann setRequestHeaders( hdrs_bkt );
598590a0fdSAndre Fischer
608590a0fdSAndre Fischer return req_bkt;
618590a0fdSAndre Fischer }
628590a0fdSAndre Fischer
processChunkOfResponseData(const char *,apr_size_t)6349989859SOliver-Rainer Wittmann void SerfHeadReqProcImpl::processChunkOfResponseData( const char* /*data*/,
6449989859SOliver-Rainer Wittmann apr_size_t /*len*/ )
6549989859SOliver-Rainer Wittmann {
6649989859SOliver-Rainer Wittmann // nothing to do
6749989859SOliver-Rainer Wittmann }
6849989859SOliver-Rainer Wittmann
698590a0fdSAndre Fischer namespace
708590a0fdSAndre Fischer {
Serf_ProcessResponseHeader(void * inUserData,const char * inHeaderName,const char * inHeaderValue)718590a0fdSAndre Fischer apr_status_t Serf_ProcessResponseHeader( void* inUserData,
728590a0fdSAndre Fischer const char* inHeaderName,
738590a0fdSAndre Fischer const char* inHeaderValue )
748590a0fdSAndre Fischer {
758590a0fdSAndre Fischer SerfHeadReqProcImpl* pReqProcImpl = static_cast< SerfHeadReqProcImpl* >( inUserData );
768590a0fdSAndre Fischer pReqProcImpl->processSingleResponseHeader( inHeaderName,
778590a0fdSAndre Fischer inHeaderValue );
788590a0fdSAndre Fischer
798590a0fdSAndre Fischer return APR_SUCCESS;
808590a0fdSAndre Fischer }
818590a0fdSAndre Fischer } // end of anonymous namespace
828590a0fdSAndre Fischer
handleEndOfResponseData(serf_bucket_t * inSerfResponseBucket)8349989859SOliver-Rainer Wittmann void SerfHeadReqProcImpl::handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket )
848590a0fdSAndre Fischer {
8549989859SOliver-Rainer Wittmann // read response header, if requested
8649989859SOliver-Rainer Wittmann if ( mpHeaderNames != 0 && mpResource != 0 )
878590a0fdSAndre Fischer {
8849989859SOliver-Rainer Wittmann serf_bucket_t* SerfHeaderBucket = serf_bucket_response_get_headers( inSerfResponseBucket );
8949989859SOliver-Rainer Wittmann if ( SerfHeaderBucket != 0 )
908590a0fdSAndre Fischer {
9149989859SOliver-Rainer Wittmann serf_bucket_headers_do( SerfHeaderBucket,
9249989859SOliver-Rainer Wittmann Serf_ProcessResponseHeader,
9349989859SOliver-Rainer Wittmann this );
948590a0fdSAndre Fischer }
958590a0fdSAndre Fischer }
968590a0fdSAndre Fischer }
97307c6619SOliver-Rainer Wittmann
processSingleResponseHeader(const char * inHeaderName,const char * inHeaderValue)988590a0fdSAndre Fischer void SerfHeadReqProcImpl::processSingleResponseHeader( const char* inHeaderName,
998590a0fdSAndre Fischer const char* inHeaderValue )
1008590a0fdSAndre Fischer {
1018590a0fdSAndre Fischer rtl::OUString aHeaderName( rtl::OUString::createFromAscii( inHeaderName ) );
1028590a0fdSAndre Fischer
1038590a0fdSAndre Fischer bool bStoreHeaderField = false;
1048590a0fdSAndre Fischer
1058590a0fdSAndre Fischer if ( mpHeaderNames->size() == 0 )
1068590a0fdSAndre Fischer {
1078590a0fdSAndre Fischer // store all header fields
1088590a0fdSAndre Fischer bStoreHeaderField = true;
1098590a0fdSAndre Fischer }
1108590a0fdSAndre Fischer else
1118590a0fdSAndre Fischer {
1128590a0fdSAndre Fischer // store only header fields which are requested
1138590a0fdSAndre Fischer std::vector< ::rtl::OUString >::const_iterator it( mpHeaderNames->begin() );
1148590a0fdSAndre Fischer const std::vector< ::rtl::OUString >::const_iterator end( mpHeaderNames->end() );
1158590a0fdSAndre Fischer
1168590a0fdSAndre Fischer while ( it != end )
1178590a0fdSAndre Fischer {
1188590a0fdSAndre Fischer // header names are case insensitive
1198590a0fdSAndre Fischer if ( (*it).equalsIgnoreAsciiCase( aHeaderName ) )
1208590a0fdSAndre Fischer {
1218590a0fdSAndre Fischer bStoreHeaderField = true;
1228590a0fdSAndre Fischer break;
1238590a0fdSAndre Fischer }
1248590a0fdSAndre Fischer else
1258590a0fdSAndre Fischer {
1268590a0fdSAndre Fischer ++it;
1278590a0fdSAndre Fischer }
1288590a0fdSAndre Fischer }
1298590a0fdSAndre Fischer }
1308590a0fdSAndre Fischer
1318590a0fdSAndre Fischer if ( bStoreHeaderField )
1328590a0fdSAndre Fischer {
1338590a0fdSAndre Fischer DAVPropertyValue thePropertyValue;
1348590a0fdSAndre Fischer thePropertyValue.IsCaseSensitive = false;
1358590a0fdSAndre Fischer thePropertyValue.Name = aHeaderName;
1368590a0fdSAndre Fischer thePropertyValue.Value <<= rtl::OUString::createFromAscii( inHeaderValue );
1378590a0fdSAndre Fischer mpResource->properties.push_back( thePropertyValue );
1388590a0fdSAndre Fischer }
1398590a0fdSAndre Fischer }
140307c6619SOliver-Rainer Wittmann
1418590a0fdSAndre Fischer } // namespace http_dav_ucp
142