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
22c1c10f68SAriel Constenla-Haile #include "SerfRequestProcessorImpl.hxx"
236601ee31SAriel Constenla-Haile #include "webdavuseragent.hxx"
248590a0fdSAndre Fischer
2510e20387SAndre Fischer namespace
2610e20387SAndre Fischer {
2710e20387SAndre Fischer // Define a magic value that is used by serf to reset chunked
2810e20387SAndre Fischer // encoding. The value definition is not supported by serf, hence the
2910e20387SAndre Fischer // definition here.
3010e20387SAndre Fischer static const apr_int64_t SERF_UNKNOWN_LENGTH (-1);
3110e20387SAndre Fischer }
3210e20387SAndre Fischer
338590a0fdSAndre Fischer namespace http_dav_ucp
348590a0fdSAndre Fischer {
358590a0fdSAndre Fischer
SerfRequestProcessorImpl(const char * inPath,const DAVRequestHeaders & inRequestHeaders)36e9ff7e89SOliver-Rainer Wittmann SerfRequestProcessorImpl::SerfRequestProcessorImpl( const char* inPath,
37e9ff7e89SOliver-Rainer Wittmann const DAVRequestHeaders& inRequestHeaders )
388590a0fdSAndre Fischer : mPathStr( inPath )
39e9ff7e89SOliver-Rainer Wittmann , mrRequestHeaders( inRequestHeaders )
4049989859SOliver-Rainer Wittmann , mbUseChunkedEncoding( false )
418590a0fdSAndre Fischer {
428590a0fdSAndre Fischer }
438590a0fdSAndre Fischer
~SerfRequestProcessorImpl()448590a0fdSAndre Fischer SerfRequestProcessorImpl::~SerfRequestProcessorImpl()
458590a0fdSAndre Fischer {
468590a0fdSAndre Fischer }
478590a0fdSAndre Fischer
getPathStr() const488590a0fdSAndre Fischer const char* SerfRequestProcessorImpl::getPathStr() const
498590a0fdSAndre Fischer {
508590a0fdSAndre Fischer return mPathStr;
518590a0fdSAndre Fischer }
528590a0fdSAndre Fischer
activateChunkedEncoding()5349989859SOliver-Rainer Wittmann void SerfRequestProcessorImpl::activateChunkedEncoding()
5449989859SOliver-Rainer Wittmann {
5549989859SOliver-Rainer Wittmann mbUseChunkedEncoding = true;
5649989859SOliver-Rainer Wittmann }
5749989859SOliver-Rainer Wittmann
useChunkedEncoding() const583277e71fSAriel Constenla-Haile bool SerfRequestProcessorImpl::useChunkedEncoding() const
5949989859SOliver-Rainer Wittmann {
6049989859SOliver-Rainer Wittmann return mbUseChunkedEncoding;
6149989859SOliver-Rainer Wittmann }
6249989859SOliver-Rainer Wittmann
6310e20387SAndre Fischer
handleChunkedEncoding(serf_bucket_t * pRequestBucket,apr_int64_t nLength) const6410e20387SAndre Fischer void SerfRequestProcessorImpl::handleChunkedEncoding (
6510e20387SAndre Fischer serf_bucket_t* pRequestBucket,
6610e20387SAndre Fischer apr_int64_t nLength) const
6710e20387SAndre Fischer {
6810e20387SAndre Fischer if (pRequestBucket != NULL)
6910e20387SAndre Fischer {
7010e20387SAndre Fischer if (useChunkedEncoding())
7110e20387SAndre Fischer {
7210e20387SAndre Fischer // Activate chunked encoding.
7310e20387SAndre Fischer serf_bucket_request_set_CL(pRequestBucket, SERF_UNKNOWN_LENGTH);
7410e20387SAndre Fischer }
7510e20387SAndre Fischer else
7610e20387SAndre Fischer {
7710e20387SAndre Fischer // Deactivate chunked encoding by setting the length.
7810e20387SAndre Fischer serf_bucket_request_set_CL(pRequestBucket, nLength);
7910e20387SAndre Fischer }
8010e20387SAndre Fischer }
8110e20387SAndre Fischer }
8210e20387SAndre Fischer
8310e20387SAndre Fischer
setRequestHeaders(serf_bucket_t * inoutSerfHeaderBucket)84e9ff7e89SOliver-Rainer Wittmann void SerfRequestProcessorImpl::setRequestHeaders( serf_bucket_t* inoutSerfHeaderBucket )
85e9ff7e89SOliver-Rainer Wittmann {
866601ee31SAriel Constenla-Haile bool bHasUserAgent( false );
87e9ff7e89SOliver-Rainer Wittmann DAVRequestHeaders::const_iterator aHeaderIter( mrRequestHeaders.begin() );
88e9ff7e89SOliver-Rainer Wittmann const DAVRequestHeaders::const_iterator aEnd( mrRequestHeaders.end() );
89e9ff7e89SOliver-Rainer Wittmann
90e9ff7e89SOliver-Rainer Wittmann while ( aHeaderIter != aEnd )
91e9ff7e89SOliver-Rainer Wittmann {
92e9ff7e89SOliver-Rainer Wittmann const rtl::OString aHeader = rtl::OUStringToOString( (*aHeaderIter).first,
93e9ff7e89SOliver-Rainer Wittmann RTL_TEXTENCODING_UTF8 );
94e9ff7e89SOliver-Rainer Wittmann const rtl::OString aValue = rtl::OUStringToOString( (*aHeaderIter).second,
95e9ff7e89SOliver-Rainer Wittmann RTL_TEXTENCODING_UTF8 );
96e9ff7e89SOliver-Rainer Wittmann
976601ee31SAriel Constenla-Haile OSL_TRACE( "Request Header - \"%s: %s\"", aHeader.getStr(), aValue.getStr() );
986601ee31SAriel Constenla-Haile if ( !bHasUserAgent )
996601ee31SAriel Constenla-Haile bHasUserAgent = aHeaderIter->first.equalsAsciiL(
1006601ee31SAriel Constenla-Haile RTL_CONSTASCII_STRINGPARAM( "User-Agent" ) );
1016601ee31SAriel Constenla-Haile
102*23fe34efSOliver-Rainer Wittmann serf_bucket_headers_setc( inoutSerfHeaderBucket,
103e9ff7e89SOliver-Rainer Wittmann aHeader.getStr(),
104e9ff7e89SOliver-Rainer Wittmann aValue.getStr() );
105e9ff7e89SOliver-Rainer Wittmann
106e9ff7e89SOliver-Rainer Wittmann ++aHeaderIter;
107e9ff7e89SOliver-Rainer Wittmann }
108e9ff7e89SOliver-Rainer Wittmann
1096601ee31SAriel Constenla-Haile if ( !bHasUserAgent )
1106601ee31SAriel Constenla-Haile {
1116601ee31SAriel Constenla-Haile const rtl::OUString &rUserAgent = WebDAVUserAgent::get();
1126601ee31SAriel Constenla-Haile serf_bucket_headers_set( inoutSerfHeaderBucket,
1136601ee31SAriel Constenla-Haile "User-Agent",
1146601ee31SAriel Constenla-Haile rtl::OUStringToOString( rUserAgent, RTL_TEXTENCODING_UTF8 ).getStr() );
1156601ee31SAriel Constenla-Haile }
1166601ee31SAriel Constenla-Haile
117e9ff7e89SOliver-Rainer Wittmann serf_bucket_headers_set( inoutSerfHeaderBucket, "Accept-Encoding", "gzip");
118e9ff7e89SOliver-Rainer Wittmann }
119e9ff7e89SOliver-Rainer Wittmann
processSerfResponseBucket(serf_request_t *,serf_bucket_t * inSerfResponseBucket,apr_pool_t *,apr_status_t & outStatus)12049989859SOliver-Rainer Wittmann bool SerfRequestProcessorImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
12149989859SOliver-Rainer Wittmann serf_bucket_t * inSerfResponseBucket,
12249989859SOliver-Rainer Wittmann apr_pool_t * /*inAprPool*/,
12349989859SOliver-Rainer Wittmann apr_status_t & outStatus )
12449989859SOliver-Rainer Wittmann {
12549989859SOliver-Rainer Wittmann const char* data;
12649989859SOliver-Rainer Wittmann apr_size_t len;
12749989859SOliver-Rainer Wittmann
12849989859SOliver-Rainer Wittmann while (1) {
12949989859SOliver-Rainer Wittmann outStatus = serf_bucket_read(inSerfResponseBucket, 8096, &data, &len);
13049989859SOliver-Rainer Wittmann if (SERF_BUCKET_READ_ERROR(outStatus))
13149989859SOliver-Rainer Wittmann {
13249989859SOliver-Rainer Wittmann return true;
13349989859SOliver-Rainer Wittmann }
13449989859SOliver-Rainer Wittmann
13549989859SOliver-Rainer Wittmann if ( len > 0 )
13649989859SOliver-Rainer Wittmann {
13749989859SOliver-Rainer Wittmann processChunkOfResponseData( data, len );
13849989859SOliver-Rainer Wittmann }
13949989859SOliver-Rainer Wittmann
14049989859SOliver-Rainer Wittmann /* are we done yet? */
14149989859SOliver-Rainer Wittmann if (APR_STATUS_IS_EOF(outStatus))
14249989859SOliver-Rainer Wittmann {
14349989859SOliver-Rainer Wittmann handleEndOfResponseData( inSerfResponseBucket );
14449989859SOliver-Rainer Wittmann
14549989859SOliver-Rainer Wittmann outStatus = APR_EOF;
14649989859SOliver-Rainer Wittmann return true;
14749989859SOliver-Rainer Wittmann }
14849989859SOliver-Rainer Wittmann
14949989859SOliver-Rainer Wittmann /* have we drained the response so far? */
15049989859SOliver-Rainer Wittmann if ( APR_STATUS_IS_EAGAIN( outStatus ) )
15149989859SOliver-Rainer Wittmann {
15249989859SOliver-Rainer Wittmann return false;
15349989859SOliver-Rainer Wittmann }
15449989859SOliver-Rainer Wittmann }
15549989859SOliver-Rainer Wittmann
15649989859SOliver-Rainer Wittmann /* NOTREACHED */
15749989859SOliver-Rainer Wittmann return true;
15849989859SOliver-Rainer Wittmann }
15949989859SOliver-Rainer Wittmann
1608590a0fdSAndre Fischer } // namespace http_dav_ucp
1618590a0fdSAndre Fischer
162