xref: /AOO41X/main/ucb/source/ucp/webdav/SerfPutReqProcImpl.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 <rtl/ustring.hxx>
26*8590a0fdSAndre Fischer 
27*8590a0fdSAndre Fischer #include <SerfPutReqProcImpl.hxx>
28*8590a0fdSAndre Fischer 
29*8590a0fdSAndre Fischer #include <serf.h>
30*8590a0fdSAndre Fischer 
31*8590a0fdSAndre Fischer namespace http_dav_ucp
32*8590a0fdSAndre Fischer {
33*8590a0fdSAndre Fischer 
34*8590a0fdSAndre Fischer SerfPutReqProcImpl::SerfPutReqProcImpl( const char* inPath,
35*8590a0fdSAndre Fischer                                         const char* inData,
36*8590a0fdSAndre Fischer                                         apr_size_t inDataLen )
37*8590a0fdSAndre Fischer     : SerfRequestProcessorImpl( inPath )
38*8590a0fdSAndre Fischer     , mpData( inData )
39*8590a0fdSAndre Fischer     , mnDataLen( inDataLen )
40*8590a0fdSAndre Fischer {
41*8590a0fdSAndre Fischer }
42*8590a0fdSAndre Fischer 
43*8590a0fdSAndre Fischer SerfPutReqProcImpl::~SerfPutReqProcImpl()
44*8590a0fdSAndre Fischer {
45*8590a0fdSAndre Fischer }
46*8590a0fdSAndre Fischer 
47*8590a0fdSAndre Fischer serf_bucket_t * SerfPutReqProcImpl::createSerfRequestBucket( serf_request_t * inSerfRequest )
48*8590a0fdSAndre Fischer {
49*8590a0fdSAndre Fischer     serf_bucket_alloc_t* pSerfBucketAlloc = serf_request_get_alloc( inSerfRequest );
50*8590a0fdSAndre Fischer 
51*8590a0fdSAndre Fischer     // create body bucket
52*8590a0fdSAndre Fischer     serf_bucket_t* body_bkt = 0;
53*8590a0fdSAndre Fischer     if ( mpData != 0 && mnDataLen > 0 )
54*8590a0fdSAndre Fischer     {
55*8590a0fdSAndre Fischer         body_bkt = SERF_BUCKET_SIMPLE_STRING_LEN( mpData, mnDataLen, pSerfBucketAlloc );
56*8590a0fdSAndre Fischer     }
57*8590a0fdSAndre Fischer 
58*8590a0fdSAndre Fischer     // create serf request
59*8590a0fdSAndre Fischer     serf_bucket_t *req_bkt = serf_request_bucket_request_create( inSerfRequest,
60*8590a0fdSAndre Fischer                                                                  "PUT",
61*8590a0fdSAndre Fischer                                                                  getPathStr(),
62*8590a0fdSAndre Fischer                                                                  body_bkt,
63*8590a0fdSAndre Fischer                                                                  serf_request_get_alloc( inSerfRequest ) );
64*8590a0fdSAndre Fischer 
65*8590a0fdSAndre Fischer     // TODO - correct headers
66*8590a0fdSAndre Fischer     // set request header fields
67*8590a0fdSAndre Fischer     serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt );
68*8590a0fdSAndre Fischer     serf_bucket_headers_setn( hdrs_bkt, "User-Agent", "www.openoffice.org/ucb/" );
69*8590a0fdSAndre Fischer     serf_bucket_headers_setn( hdrs_bkt, "Accept-Encoding", "gzip");
70*8590a0fdSAndre Fischer 
71*8590a0fdSAndre Fischer     // request specific header fields
72*8590a0fdSAndre Fischer     if ( body_bkt != 0 )
73*8590a0fdSAndre Fischer     {
74*8590a0fdSAndre Fischer         serf_bucket_headers_setn( hdrs_bkt, "Content-Length",
75*8590a0fdSAndre Fischer                                   rtl::OUStringToOString( rtl::OUString::valueOf( (sal_Int32)mnDataLen ), RTL_TEXTENCODING_UTF8 ) );
76*8590a0fdSAndre Fischer     }
77*8590a0fdSAndre Fischer 
78*8590a0fdSAndre Fischer 
79*8590a0fdSAndre Fischer     return req_bkt;
80*8590a0fdSAndre Fischer }
81*8590a0fdSAndre Fischer 
82*8590a0fdSAndre Fischer 
83*8590a0fdSAndre Fischer bool SerfPutReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
84*8590a0fdSAndre Fischer                                                     serf_bucket_t * inSerfResponseBucket,
85*8590a0fdSAndre Fischer                                                     apr_pool_t * /*inAprPool*/,
86*8590a0fdSAndre Fischer                                                     apr_status_t & outStatus )
87*8590a0fdSAndre Fischer {
88*8590a0fdSAndre Fischer     const char* data;
89*8590a0fdSAndre Fischer     apr_size_t len;
90*8590a0fdSAndre Fischer 
91*8590a0fdSAndre Fischer     while (1) {
92*8590a0fdSAndre Fischer         outStatus = serf_bucket_read(inSerfResponseBucket, 8096, &data, &len);
93*8590a0fdSAndre Fischer         if (SERF_BUCKET_READ_ERROR(outStatus))
94*8590a0fdSAndre Fischer         {
95*8590a0fdSAndre Fischer             return true;
96*8590a0fdSAndre Fischer         }
97*8590a0fdSAndre Fischer 
98*8590a0fdSAndre Fischer         /* are we done yet? */
99*8590a0fdSAndre Fischer         if (APR_STATUS_IS_EOF(outStatus))
100*8590a0fdSAndre Fischer         {
101*8590a0fdSAndre Fischer             outStatus = APR_EOF;
102*8590a0fdSAndre Fischer             return true;
103*8590a0fdSAndre Fischer         }
104*8590a0fdSAndre Fischer 
105*8590a0fdSAndre Fischer         /* have we drained the response so far? */
106*8590a0fdSAndre Fischer         if ( APR_STATUS_IS_EAGAIN( outStatus ) )
107*8590a0fdSAndre Fischer         {
108*8590a0fdSAndre Fischer             return false;
109*8590a0fdSAndre Fischer         }
110*8590a0fdSAndre Fischer     }
111*8590a0fdSAndre Fischer 
112*8590a0fdSAndre Fischer     /* NOTREACHED */
113*8590a0fdSAndre Fischer     return true;
114*8590a0fdSAndre Fischer }
115*8590a0fdSAndre Fischer 
116*8590a0fdSAndre Fischer } // namespace http_dav_ucp
117