xref: /AOO41X/main/ucb/source/ucp/webdav/SerfGetReqProcImpl.cxx (revision 8590a0fdd306f78ee72b863c64cbcf09c28509eb)
1*8590a0fdSAndre Fischer /**************************************************************
2*8590a0fdSAndre Fischer  *
3*8590a0fdSAndre Fischer  * Licensed to the Apache Software Foundation (ASF) under one
4*8590a0fdSAndre Fischer  * or more contributor license agreements.  See the NOTICE file
5*8590a0fdSAndre Fischer  * distributed with this work for additional information
6*8590a0fdSAndre Fischer  * regarding copyright ownership.  The ASF licenses this file
7*8590a0fdSAndre Fischer  * to you under the Apache License, Version 2.0 (the
8*8590a0fdSAndre Fischer  * "License"); you may not use this file except in compliance
9*8590a0fdSAndre Fischer  * with the License.  You may obtain a copy of the License at
10*8590a0fdSAndre Fischer  *
11*8590a0fdSAndre Fischer  *   http://www.apache.org/licenses/LICENSE-2.0
12*8590a0fdSAndre Fischer  *
13*8590a0fdSAndre Fischer  * Unless required by applicable law or agreed to in writing,
14*8590a0fdSAndre Fischer  * software distributed under the License is distributed on an
15*8590a0fdSAndre Fischer  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*8590a0fdSAndre Fischer  * KIND, either express or implied.  See the License for the
17*8590a0fdSAndre Fischer  * specific language governing permissions and limitations
18*8590a0fdSAndre Fischer  * under the License.
19*8590a0fdSAndre Fischer  *
20*8590a0fdSAndre Fischer  *************************************************************/
21*8590a0fdSAndre Fischer 
22*8590a0fdSAndre Fischer // MARKER(update_precomp.py): autogen include statement, do not remove
23*8590a0fdSAndre Fischer #include "precompiled_ucb.hxx"
24*8590a0fdSAndre Fischer 
25*8590a0fdSAndre Fischer #include <SerfGetReqProcImpl.hxx>
26*8590a0fdSAndre Fischer 
27*8590a0fdSAndre Fischer using namespace com::sun::star;
28*8590a0fdSAndre Fischer 
29*8590a0fdSAndre Fischer namespace http_dav_ucp
30*8590a0fdSAndre Fischer {
31*8590a0fdSAndre Fischer 
32*8590a0fdSAndre Fischer SerfGetReqProcImpl::SerfGetReqProcImpl( const char* inPath,
33*8590a0fdSAndre Fischer                                         const com::sun::star::uno::Reference< SerfInputStream > & xioInStrm )
34*8590a0fdSAndre Fischer     : SerfRequestProcessorImpl( inPath )
35*8590a0fdSAndre Fischer     , xInputStream( xioInStrm )
36*8590a0fdSAndre Fischer     , xOutputStream()
37*8590a0fdSAndre Fischer     , mpHeaderNames( 0 )
38*8590a0fdSAndre Fischer     , mpResource( 0 )
39*8590a0fdSAndre Fischer {
40*8590a0fdSAndre Fischer }
41*8590a0fdSAndre Fischer 
42*8590a0fdSAndre Fischer SerfGetReqProcImpl::SerfGetReqProcImpl( const char* inPath,
43*8590a0fdSAndre Fischer                                         const com::sun::star::uno::Reference< SerfInputStream > & xioInStrm,
44*8590a0fdSAndre Fischer                                         const std::vector< ::rtl::OUString > & inHeaderNames,
45*8590a0fdSAndre Fischer                                         DAVResource & ioResource )
46*8590a0fdSAndre Fischer     : SerfRequestProcessorImpl( inPath )
47*8590a0fdSAndre Fischer     , xInputStream( xioInStrm )
48*8590a0fdSAndre Fischer     , xOutputStream()
49*8590a0fdSAndre Fischer     , mpHeaderNames( &inHeaderNames )
50*8590a0fdSAndre Fischer     , mpResource( &ioResource )
51*8590a0fdSAndre Fischer {
52*8590a0fdSAndre Fischer }
53*8590a0fdSAndre Fischer 
54*8590a0fdSAndre Fischer SerfGetReqProcImpl::SerfGetReqProcImpl( const char* inPath,
55*8590a0fdSAndre Fischer                                         const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream > & xioOutStrm )
56*8590a0fdSAndre Fischer     : SerfRequestProcessorImpl( inPath )
57*8590a0fdSAndre Fischer     , xInputStream()
58*8590a0fdSAndre Fischer     , xOutputStream( xioOutStrm )
59*8590a0fdSAndre Fischer     , mpHeaderNames( 0 )
60*8590a0fdSAndre Fischer     , mpResource( 0 )
61*8590a0fdSAndre Fischer {
62*8590a0fdSAndre Fischer }
63*8590a0fdSAndre Fischer 
64*8590a0fdSAndre Fischer SerfGetReqProcImpl::SerfGetReqProcImpl( const char* inPath,
65*8590a0fdSAndre Fischer                                         const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream > & xioOutStrm,
66*8590a0fdSAndre Fischer                                         const std::vector< ::rtl::OUString > & inHeaderNames,
67*8590a0fdSAndre Fischer                                         DAVResource & ioResource )
68*8590a0fdSAndre Fischer     : SerfRequestProcessorImpl( inPath )
69*8590a0fdSAndre Fischer     , xInputStream()
70*8590a0fdSAndre Fischer     , xOutputStream( xioOutStrm )
71*8590a0fdSAndre Fischer     , mpHeaderNames( &inHeaderNames )
72*8590a0fdSAndre Fischer     , mpResource( &ioResource )
73*8590a0fdSAndre Fischer {
74*8590a0fdSAndre Fischer }
75*8590a0fdSAndre Fischer 
76*8590a0fdSAndre Fischer SerfGetReqProcImpl::~SerfGetReqProcImpl()
77*8590a0fdSAndre Fischer {
78*8590a0fdSAndre Fischer }
79*8590a0fdSAndre Fischer 
80*8590a0fdSAndre Fischer serf_bucket_t * SerfGetReqProcImpl::createSerfRequestBucket( serf_request_t * inSerfRequest )
81*8590a0fdSAndre Fischer {
82*8590a0fdSAndre Fischer     serf_bucket_alloc_t* pSerfBucketAlloc = serf_request_get_alloc( inSerfRequest );
83*8590a0fdSAndre Fischer 
84*8590a0fdSAndre Fischer     // create serf request
85*8590a0fdSAndre Fischer     serf_bucket_t *req_bkt = serf_request_bucket_request_create( inSerfRequest,
86*8590a0fdSAndre Fischer                                                                  "GET",
87*8590a0fdSAndre Fischer                                                                  getPathStr(),
88*8590a0fdSAndre Fischer                                                                  0,
89*8590a0fdSAndre Fischer                                                                  serf_request_get_alloc( inSerfRequest ) );
90*8590a0fdSAndre Fischer 
91*8590a0fdSAndre Fischer     // TODO - correct headers
92*8590a0fdSAndre Fischer     // set request header fields
93*8590a0fdSAndre Fischer     serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt );
94*8590a0fdSAndre Fischer     serf_bucket_headers_setn( hdrs_bkt, "User-Agent", "www.openoffice.org/ucb/" );
95*8590a0fdSAndre Fischer     serf_bucket_headers_setn( hdrs_bkt, "Accept-Encoding", "gzip");
96*8590a0fdSAndre Fischer 
97*8590a0fdSAndre Fischer     return req_bkt;
98*8590a0fdSAndre Fischer }
99*8590a0fdSAndre Fischer 
100*8590a0fdSAndre Fischer namespace
101*8590a0fdSAndre Fischer {
102*8590a0fdSAndre Fischer     apr_status_t Serf_ProcessResponseHeader( void* inUserData,
103*8590a0fdSAndre Fischer                                              const char* inHeaderName,
104*8590a0fdSAndre Fischer                                              const char* inHeaderValue )
105*8590a0fdSAndre Fischer     {
106*8590a0fdSAndre Fischer         SerfGetReqProcImpl* pReqProcImpl = static_cast< SerfGetReqProcImpl* >( inUserData );
107*8590a0fdSAndre Fischer         pReqProcImpl->processSingleResponseHeader( inHeaderName,
108*8590a0fdSAndre Fischer                                                    inHeaderValue );
109*8590a0fdSAndre Fischer 
110*8590a0fdSAndre Fischer         return APR_SUCCESS;
111*8590a0fdSAndre Fischer     }
112*8590a0fdSAndre Fischer } // end of anonymous namespace
113*8590a0fdSAndre Fischer 
114*8590a0fdSAndre Fischer bool SerfGetReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
115*8590a0fdSAndre Fischer                                                     serf_bucket_t * inSerfResponseBucket,
116*8590a0fdSAndre Fischer                                                     apr_pool_t * /*inAprPool*/,
117*8590a0fdSAndre Fischer                                                     apr_status_t & outStatus )
118*8590a0fdSAndre Fischer {
119*8590a0fdSAndre Fischer     const char* data;
120*8590a0fdSAndre Fischer     apr_size_t len;
121*8590a0fdSAndre Fischer 
122*8590a0fdSAndre Fischer     while (1) {
123*8590a0fdSAndre Fischer         outStatus = serf_bucket_read(inSerfResponseBucket, 8096, &data, &len);
124*8590a0fdSAndre Fischer         if (SERF_BUCKET_READ_ERROR(outStatus))
125*8590a0fdSAndre Fischer         {
126*8590a0fdSAndre Fischer             return true;
127*8590a0fdSAndre Fischer         }
128*8590a0fdSAndre Fischer 
129*8590a0fdSAndre Fischer         if ( len > 0 )
130*8590a0fdSAndre Fischer         {
131*8590a0fdSAndre Fischer             if ( xInputStream.is() )
132*8590a0fdSAndre Fischer             {
133*8590a0fdSAndre Fischer                 xInputStream->AddToStream( data, len );
134*8590a0fdSAndre Fischer             }
135*8590a0fdSAndre Fischer             else if ( xOutputStream.is() )
136*8590a0fdSAndre Fischer             {
137*8590a0fdSAndre Fischer                 const uno::Sequence< sal_Int8 > aDataSeq( (sal_Int8 *)data, len );
138*8590a0fdSAndre Fischer                 xOutputStream->writeBytes( aDataSeq );
139*8590a0fdSAndre Fischer             }
140*8590a0fdSAndre Fischer         }
141*8590a0fdSAndre Fischer 
142*8590a0fdSAndre Fischer         /* are we done yet? */
143*8590a0fdSAndre Fischer         if (APR_STATUS_IS_EOF(outStatus))
144*8590a0fdSAndre Fischer         {
145*8590a0fdSAndre Fischer             // read response header, if requested
146*8590a0fdSAndre Fischer             if ( mpHeaderNames != 0 && mpResource != 0 )
147*8590a0fdSAndre Fischer             {
148*8590a0fdSAndre Fischer                 serf_bucket_t* SerfHeaderBucket = serf_bucket_response_get_headers( inSerfResponseBucket );
149*8590a0fdSAndre Fischer                 if ( SerfHeaderBucket != 0 )
150*8590a0fdSAndre Fischer                 {
151*8590a0fdSAndre Fischer                     serf_bucket_headers_do( SerfHeaderBucket,
152*8590a0fdSAndre Fischer                                             Serf_ProcessResponseHeader,
153*8590a0fdSAndre Fischer                                             this );
154*8590a0fdSAndre Fischer                 }
155*8590a0fdSAndre Fischer             }
156*8590a0fdSAndre Fischer 
157*8590a0fdSAndre Fischer             outStatus = APR_EOF;
158*8590a0fdSAndre Fischer             return true;
159*8590a0fdSAndre Fischer         }
160*8590a0fdSAndre Fischer 
161*8590a0fdSAndre Fischer         /* have we drained the response so far? */
162*8590a0fdSAndre Fischer         if ( APR_STATUS_IS_EAGAIN( outStatus ) )
163*8590a0fdSAndre Fischer         {
164*8590a0fdSAndre Fischer             return false;
165*8590a0fdSAndre Fischer         }
166*8590a0fdSAndre Fischer     }
167*8590a0fdSAndre Fischer 
168*8590a0fdSAndre Fischer     /* NOTREACHED */
169*8590a0fdSAndre Fischer     return true;
170*8590a0fdSAndre Fischer }
171*8590a0fdSAndre Fischer 
172*8590a0fdSAndre Fischer void SerfGetReqProcImpl::processSingleResponseHeader( const char* inHeaderName,
173*8590a0fdSAndre Fischer                                                       const char* inHeaderValue )
174*8590a0fdSAndre Fischer {
175*8590a0fdSAndre Fischer     rtl::OUString aHeaderName( rtl::OUString::createFromAscii( inHeaderName ) );
176*8590a0fdSAndre Fischer 
177*8590a0fdSAndre Fischer     bool bStoreHeaderField = false;
178*8590a0fdSAndre Fischer 
179*8590a0fdSAndre Fischer     if ( mpHeaderNames->size() == 0 )
180*8590a0fdSAndre Fischer     {
181*8590a0fdSAndre Fischer         // store all header fields
182*8590a0fdSAndre Fischer         bStoreHeaderField = true;
183*8590a0fdSAndre Fischer     }
184*8590a0fdSAndre Fischer     else
185*8590a0fdSAndre Fischer     {
186*8590a0fdSAndre Fischer         // store only header fields which are requested
187*8590a0fdSAndre Fischer         std::vector< ::rtl::OUString >::const_iterator it( mpHeaderNames->begin() );
188*8590a0fdSAndre Fischer         const std::vector< ::rtl::OUString >::const_iterator end( mpHeaderNames->end() );
189*8590a0fdSAndre Fischer 
190*8590a0fdSAndre Fischer         while ( it != end )
191*8590a0fdSAndre Fischer         {
192*8590a0fdSAndre Fischer             // header names are case insensitive
193*8590a0fdSAndre Fischer             if ( (*it).equalsIgnoreAsciiCase( aHeaderName ) )
194*8590a0fdSAndre Fischer             {
195*8590a0fdSAndre Fischer                 bStoreHeaderField = true;
196*8590a0fdSAndre Fischer                 break;
197*8590a0fdSAndre Fischer             }
198*8590a0fdSAndre Fischer             else
199*8590a0fdSAndre Fischer             {
200*8590a0fdSAndre Fischer                 ++it;
201*8590a0fdSAndre Fischer             }
202*8590a0fdSAndre Fischer         }
203*8590a0fdSAndre Fischer     }
204*8590a0fdSAndre Fischer 
205*8590a0fdSAndre Fischer     if ( bStoreHeaderField )
206*8590a0fdSAndre Fischer     {
207*8590a0fdSAndre Fischer         DAVPropertyValue thePropertyValue;
208*8590a0fdSAndre Fischer         thePropertyValue.IsCaseSensitive = false;
209*8590a0fdSAndre Fischer         thePropertyValue.Name = aHeaderName;
210*8590a0fdSAndre Fischer         thePropertyValue.Value <<= rtl::OUString::createFromAscii( inHeaderValue );
211*8590a0fdSAndre Fischer         mpResource->properties.push_back( thePropertyValue );
212*8590a0fdSAndre Fischer     }
213*8590a0fdSAndre Fischer }
214*8590a0fdSAndre Fischer 
215*8590a0fdSAndre Fischer } // namespace http_dav_ucp
216