@@ -51,12 +51,17 @@ size_t ReadCallback( void *ptr, std::size_t size, std::size_t nmemb, std::string
5151 assert ( ptr != 0 ) ;
5252 assert ( data != 0 ) ;
5353
54+ std::cout << " reading " << (size*nmemb) << " bytes " << data->size () << std::endl ;
55+
5456 std::size_t count = std::min ( size * nmemb, data->size () ) ;
5557 if ( count > 0 )
5658 {
57- std::memcpy ( &(*data)[0 ], ptr , count ) ;
59+ std::memcpy ( ptr, &(*data)[0 ], count ) ;
5860 data->erase ( 0 , count ) ;
5961 }
62+
63+ std::cout << " readed " << count << " bytes " << data->size () << std::endl ;
64+
6065 return count ;
6166}
6267
@@ -162,14 +167,41 @@ std::string PostData( const std::string& url, const std::string& data, const Hea
162167
163168 std::string post_data = data ;
164169
165- curl_easy_setopt (curl, CURLOPT_POST, 1 );
170+ curl_easy_setopt (curl, CURLOPT_POST, 1L );
166171 curl_easy_setopt (curl, CURLOPT_POSTFIELDS, &post_data[0 ] ) ;
167172 curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, post_data.size () ) ;
173+ curl_easy_setopt (curl, CURLOPT_VERBOSE, 1 ) ;
168174
169175 DoCurl ( curl ) ;
170176 return resp;
171177}
172178
179+ std::string PostDataWithHeader ( const std::string& url, const std::string& data, const Headers& hdr )
180+ {
181+ std::string resp ;
182+ CURL *curl = InitCurl ( url, &resp, hdr ) ;
183+
184+ std::string post_data = data ;
185+
186+ curl_easy_setopt (curl, CURLOPT_POST, 1L );
187+ curl_easy_setopt (curl, CURLOPT_POSTFIELDS, &post_data[0 ] ) ;
188+ curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, post_data.size () ) ;
189+ curl_easy_setopt (curl, CURLOPT_VERBOSE, 1L ) ;
190+ curl_easy_setopt (curl, CURLOPT_HEADER, 1L );
191+
192+ try
193+ {
194+ DoCurl ( curl ) ;
195+ }
196+ catch ( ... )
197+ {
198+ std::cout << " response = " << resp << std::endl ;
199+ throw ;
200+ }
201+
202+ return resp;
203+ }
204+
173205std::string PostFile ( const std::string& url, const std::string& filename, const Headers& hdr )
174206{
175207 std::string resp ;
@@ -183,18 +215,103 @@ std::string Put(
183215{
184216 std::string resp ;
185217 CURL *curl = InitCurl ( url, &resp, hdr ) ;
186-
187- std::string put_data = data ;
188218
189- curl_easy_setopt (curl, CURLOPT_UPLOAD, 1 );
219+ std::string put_data = data ;
220+
221+ // set common options
222+ curl_easy_setopt (curl, CURLOPT_HEADER, 1L );
223+ curl_easy_setopt (curl, CURLOPT_UPLOAD, 1L ) ;
190224 curl_easy_setopt (curl, CURLOPT_READFUNCTION, &ReadCallback ) ;
191225 curl_easy_setopt (curl, CURLOPT_READDATA , &put_data ) ;
192226 curl_easy_setopt (curl, CURLOPT_INFILESIZE, put_data.size () ) ;
193-
194- DoCurl ( curl ) ;
227+ curl_easy_setopt (curl, CURLOPT_VERBOSE, 1L ) ;
228+
229+ try
230+ {
231+ DoCurl ( curl ) ;
232+ }
233+ catch ( ... )
234+ {
235+ std::cout << " response = " << resp << std::endl ;
236+ throw ;
237+ }
238+
195239 return resp;
196240}
197241
242+ void Custom ( const std::string& url, const std::string& host, const Headers& headers )
243+ {
244+ CURL *curl = curl_easy_init ();
245+ if ( curl == 0 )
246+ throw std::bad_alloc () ;
247+
248+ // set common options
249+ curl_easy_setopt (curl, CURLOPT_URL, url.c_str ());
250+ curl_easy_setopt (curl, CURLOPT_CONNECT_ONLY, 1L );
251+ curl_easy_setopt (curl, CURLOPT_VERBOSE, 1L ) ;
252+ if ( curl_easy_perform ( curl ) != 0 )
253+ throw std::runtime_error ( " curl perform fail" ) ;
254+
255+ long sockextr;
256+ curl_easy_getinfo (curl, CURLINFO_LASTSOCKET, &sockextr);
257+ curl_socket_t sockfd = sockextr ;
258+
259+ struct timeval tv;
260+ tv.tv_sec = 60 ;
261+ tv.tv_usec = 0 ;
262+
263+ fd_set infd, outfd, errfd;
264+ FD_ZERO (&infd);
265+ FD_ZERO (&outfd);
266+ FD_ZERO (&errfd);
267+
268+ FD_SET (sockfd, &errfd); /* always check for error */
269+ FD_SET (sockfd, &outfd);
270+ if ( select (sockfd + 1 , &infd, &outfd, &errfd, &tv) == -1 )
271+ throw std::runtime_error ( " select fail" ) ;
272+
273+ std::string path = url.substr ( host.size () ) ;
274+ std::cout << (" PUT " + path + " HTTP/1.1" ) << std::endl ;
275+
276+ std::ostringstream req ;
277+ req << (" PUT " + path + " HTTP/1.1\n " )
278+ << " Host: " << " docs.google.com" << " \n " ;
279+
280+ for ( Headers::const_iterator i = headers.begin () ; i != headers.end () ; ++i )
281+ req << *i << ' \n ' ;
282+
283+ std::string data = " hahaha this is the new file!!!!!" ;
284+ req << " Content-Length: " << data.size () << ' \n '
285+ << " Content-Range: 0-" << data.size ()-1 << ' /' << data.size () << " \n\n\n "
286+ << data ;
287+
288+ std::string reqstr = req.str () ;
289+ std::cout << " requesting: \n " << reqstr << std::endl ;
290+
291+ std::size_t iolen ;
292+ if ( curl_easy_send (curl, &reqstr[0 ], reqstr.size (), &iolen) != CURLE_OK )
293+ throw std::runtime_error ( " cannot send" ) ;
294+
295+ while ( true )
296+ {
297+ char buf[1024 +1 ] ;
298+ FD_ZERO (&infd);
299+ FD_ZERO (&outfd);
300+ FD_ZERO (&errfd);
301+
302+ FD_SET (sockfd, &errfd); /* always check for error */
303+ FD_SET (sockfd, &infd);
304+ if ( select (sockfd + 1 , &infd, &outfd, &errfd, &tv) == -1 )
305+ throw std::runtime_error ( " select fail" ) ;
306+
307+ if ( curl_easy_recv (curl, buf, 1024 , &iolen) != CURLE_OK )
308+ throw std::runtime_error ( " cannot send" ) ;
309+
310+ buf[iolen] = ' \0 ' ;
311+ std::cout << " read: " << buf << std::endl ;
312+ }
313+ }
314+
198315std::string Escape ( const std::string& str )
199316{
200317 CURL *curl = curl_easy_init ();
0 commit comments