xref: /AOO41X/main/ucb/source/ucp/webdav/SerfPostReqProcImpl.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 <SerfPostReqProcImpl.hxx>
26*8590a0fdSAndre Fischer 
27*8590a0fdSAndre Fischer #include <serf.h>
28*8590a0fdSAndre Fischer 
29*8590a0fdSAndre Fischer using namespace com::sun::star;
30*8590a0fdSAndre Fischer 
31*8590a0fdSAndre Fischer namespace http_dav_ucp
32*8590a0fdSAndre Fischer {
33*8590a0fdSAndre Fischer 
34*8590a0fdSAndre Fischer SerfPostReqProcImpl::SerfPostReqProcImpl( const char* inPath,
35*8590a0fdSAndre Fischer                                           const char* inData,
36*8590a0fdSAndre Fischer                                           apr_size_t inDataLen,
37*8590a0fdSAndre Fischer                                           const char* inContentType,
38*8590a0fdSAndre Fischer                                           const char* inReferer,
39*8590a0fdSAndre Fischer                                           const com::sun::star::uno::Reference< SerfInputStream > & xioInStrm )
40*8590a0fdSAndre Fischer     : SerfRequestProcessorImpl( inPath )
41*8590a0fdSAndre Fischer     , mpPostData( inData )
42*8590a0fdSAndre Fischer     , mnPostDataLen( inDataLen )
43*8590a0fdSAndre Fischer     , mpContentType( inContentType )
44*8590a0fdSAndre Fischer     , mpReferer( inReferer )
45*8590a0fdSAndre Fischer     , xInputStream( xioInStrm )
46*8590a0fdSAndre Fischer     , xOutputStream()
47*8590a0fdSAndre Fischer {
48*8590a0fdSAndre Fischer }
49*8590a0fdSAndre Fischer 
50*8590a0fdSAndre Fischer SerfPostReqProcImpl::SerfPostReqProcImpl( const char* inPath,
51*8590a0fdSAndre Fischer                                           const char* inData,
52*8590a0fdSAndre Fischer                                           apr_size_t inDataLen,
53*8590a0fdSAndre Fischer                                           const char* inContentType,
54*8590a0fdSAndre Fischer                                           const char* inReferer,
55*8590a0fdSAndre Fischer                                           const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream > & xioOutStrm )
56*8590a0fdSAndre Fischer     : SerfRequestProcessorImpl( inPath )
57*8590a0fdSAndre Fischer     , mpPostData( inData )
58*8590a0fdSAndre Fischer     , mnPostDataLen( inDataLen )
59*8590a0fdSAndre Fischer     , mpContentType( inContentType )
60*8590a0fdSAndre Fischer     , mpReferer( inReferer )
61*8590a0fdSAndre Fischer     , xInputStream()
62*8590a0fdSAndre Fischer     , xOutputStream( xioOutStrm )
63*8590a0fdSAndre Fischer {
64*8590a0fdSAndre Fischer }
65*8590a0fdSAndre Fischer 
66*8590a0fdSAndre Fischer SerfPostReqProcImpl::~SerfPostReqProcImpl()
67*8590a0fdSAndre Fischer {
68*8590a0fdSAndre Fischer }
69*8590a0fdSAndre Fischer 
70*8590a0fdSAndre Fischer serf_bucket_t * SerfPostReqProcImpl::createSerfRequestBucket( serf_request_t * inSerfRequest )
71*8590a0fdSAndre Fischer {
72*8590a0fdSAndre Fischer     serf_bucket_alloc_t* pSerfBucketAlloc = serf_request_get_alloc( inSerfRequest );
73*8590a0fdSAndre Fischer 
74*8590a0fdSAndre Fischer     // create body bucket
75*8590a0fdSAndre Fischer     serf_bucket_t* body_bkt = 0;
76*8590a0fdSAndre Fischer     if ( mpPostData != 0 && mnPostDataLen > 0 )
77*8590a0fdSAndre Fischer     {
78*8590a0fdSAndre Fischer         body_bkt = SERF_BUCKET_SIMPLE_STRING_LEN( mpPostData, mnPostDataLen, pSerfBucketAlloc );
79*8590a0fdSAndre Fischer     }
80*8590a0fdSAndre Fischer 
81*8590a0fdSAndre Fischer     // create serf request
82*8590a0fdSAndre Fischer     serf_bucket_t *req_bkt = serf_request_bucket_request_create( inSerfRequest,
83*8590a0fdSAndre Fischer                                                                  "POST",
84*8590a0fdSAndre Fischer                                                                  getPathStr(),
85*8590a0fdSAndre Fischer                                                                  body_bkt,
86*8590a0fdSAndre Fischer                                                                  serf_request_get_alloc( inSerfRequest ) );
87*8590a0fdSAndre Fischer 
88*8590a0fdSAndre Fischer     // TODO - correct headers
89*8590a0fdSAndre Fischer     // set request header fields
90*8590a0fdSAndre Fischer     serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt );
91*8590a0fdSAndre Fischer     serf_bucket_headers_setn( hdrs_bkt, "User-Agent", "www.openoffice.org/ucb/" );
92*8590a0fdSAndre Fischer     serf_bucket_headers_setn( hdrs_bkt, "Accept-Encoding", "gzip");
93*8590a0fdSAndre Fischer 
94*8590a0fdSAndre Fischer     // request specific header fields
95*8590a0fdSAndre Fischer     if ( body_bkt != 0 )
96*8590a0fdSAndre Fischer     {
97*8590a0fdSAndre Fischer         serf_bucket_headers_setn( hdrs_bkt, "Content-Length",
98*8590a0fdSAndre Fischer                                   rtl::OUStringToOString( rtl::OUString::valueOf( (sal_Int32)mnPostDataLen ), RTL_TEXTENCODING_UTF8 ) );
99*8590a0fdSAndre Fischer     }
100*8590a0fdSAndre Fischer     if ( mpContentType != 0 )
101*8590a0fdSAndre Fischer     {
102*8590a0fdSAndre Fischer         serf_bucket_headers_setn( hdrs_bkt, "Content-Type", mpContentType );
103*8590a0fdSAndre Fischer     }
104*8590a0fdSAndre Fischer     if ( mpReferer != 0 )
105*8590a0fdSAndre Fischer     {
106*8590a0fdSAndre Fischer         serf_bucket_headers_setn( hdrs_bkt, "Referer", mpReferer );
107*8590a0fdSAndre Fischer     }
108*8590a0fdSAndre Fischer 
109*8590a0fdSAndre Fischer     return req_bkt;
110*8590a0fdSAndre Fischer }
111*8590a0fdSAndre Fischer 
112*8590a0fdSAndre Fischer 
113*8590a0fdSAndre Fischer bool SerfPostReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
114*8590a0fdSAndre Fischer                                                     serf_bucket_t * inSerfResponseBucket,
115*8590a0fdSAndre Fischer                                                     apr_pool_t * /*inAprPool*/,
116*8590a0fdSAndre Fischer                                                     apr_status_t & outStatus )
117*8590a0fdSAndre Fischer {
118*8590a0fdSAndre Fischer     const char* data;
119*8590a0fdSAndre Fischer     apr_size_t len;
120*8590a0fdSAndre Fischer 
121*8590a0fdSAndre Fischer     while (1) {
122*8590a0fdSAndre Fischer         outStatus = serf_bucket_read(inSerfResponseBucket, 8096, &data, &len);
123*8590a0fdSAndre Fischer         if (SERF_BUCKET_READ_ERROR(outStatus))
124*8590a0fdSAndre Fischer         {
125*8590a0fdSAndre Fischer             return true;
126*8590a0fdSAndre Fischer         }
127*8590a0fdSAndre Fischer 
128*8590a0fdSAndre Fischer         if ( len > 0 )
129*8590a0fdSAndre Fischer         {
130*8590a0fdSAndre Fischer             if ( xInputStream.is() )
131*8590a0fdSAndre Fischer             {
132*8590a0fdSAndre Fischer                 xInputStream->AddToStream( data, len );
133*8590a0fdSAndre Fischer             }
134*8590a0fdSAndre Fischer             else if ( xOutputStream.is() )
135*8590a0fdSAndre Fischer             {
136*8590a0fdSAndre Fischer                 const uno::Sequence< sal_Int8 > aDataSeq( (sal_Int8 *)data, len );
137*8590a0fdSAndre Fischer                 xOutputStream->writeBytes( aDataSeq );
138*8590a0fdSAndre Fischer             }
139*8590a0fdSAndre Fischer         }
140*8590a0fdSAndre Fischer 
141*8590a0fdSAndre Fischer         /* are we done yet? */
142*8590a0fdSAndre Fischer         if (APR_STATUS_IS_EOF(outStatus))
143*8590a0fdSAndre Fischer         {
144*8590a0fdSAndre Fischer             outStatus = APR_EOF;
145*8590a0fdSAndre Fischer             return true;
146*8590a0fdSAndre Fischer         }
147*8590a0fdSAndre Fischer 
148*8590a0fdSAndre Fischer         /* have we drained the response so far? */
149*8590a0fdSAndre Fischer         if ( APR_STATUS_IS_EAGAIN( outStatus ) )
150*8590a0fdSAndre Fischer         {
151*8590a0fdSAndre Fischer             return false;
152*8590a0fdSAndre Fischer         }
153*8590a0fdSAndre Fischer     }
154*8590a0fdSAndre Fischer 
155*8590a0fdSAndre Fischer     /* NOTREACHED */
156*8590a0fdSAndre Fischer     return true;
157*8590a0fdSAndre Fischer }
158*8590a0fdSAndre Fischer 
159*8590a0fdSAndre Fischer } // namespace http_dav_ucp
160