summaryrefslogtreecommitdiff
path: root/indra/llmessage/llhttpclient.h
blob: 3d0646e5fe9b53b436f5fc9c7166ca47845b767d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/** 
 * @file llhttpclient.h
 * @brief Declaration of classes for making HTTP client requests.
 *
 * $LicenseInfo:firstyear=2006&license=viewergpl$
 * 
 * Copyright (c) 2006-2009, Linden Research, Inc.
 * 
 * Second Life Viewer Source Code
 * The source code in this file ("Source Code") is provided by Linden Lab
 * to you under the terms of the GNU General Public License, version 2.0
 * ("GPL"), unless you have obtained a separate licensing agreement
 * ("Other License"), formally executed by you and Linden Lab.  Terms of
 * the GPL can be found in doc/GPL-license.txt in this distribution, or
 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
 * 
 * There are special exceptions to the terms and conditions of the GPL as
 * it is applied to this Source Code. View the full text of the exception
 * in the file doc/FLOSS-exception.txt in this software distribution, or
 * online at
 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
 * 
 * By copying, modifying or distributing this software, you acknowledge
 * that you have read and understood your obligations described above,
 * and agree to abide by those obligations.
 * 
 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 * COMPLETENESS OR PERFORMANCE.
 * $/LicenseInfo$
 */

#ifndef LL_LLHTTPCLIENT_H
#define LL_LLHTTPCLIENT_H

/**
 * These classes represent the HTTP client framework.
 */

#include <string>

#include <boost/intrusive_ptr.hpp>

#include "llassettype.h"
#include "llcurl.h"
#include "lliopipe.h"

extern const F32 HTTP_REQUEST_EXPIRY_SECS;

class LLUUID;
class LLPumpIO;
class LLSD;


class LLHTTPClient
{
public:
	// class Responder moved to LLCurl

	// For convenience
	typedef LLCurl::Responder Responder;
	typedef LLCurl::ResponderPtr ResponderPtr;

	/** @name non-blocking API */
	//@{
	static void head(
		const std::string& url,
		ResponderPtr,
		const LLSD& headers = LLSD(),
		const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
	static void getByteRange(const std::string& url, S32 offset, S32 bytes, ResponderPtr, const LLSD& headers=LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
	static void get(const std::string& url, ResponderPtr, const LLSD& headers = LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
	static void get(const std::string& url, const LLSD& query, ResponderPtr, const LLSD& headers = LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);

	static void put(
		const std::string& url,
		const LLSD& body,
		ResponderPtr,
		const LLSD& headers = LLSD(),
		const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
	static void getHeaderOnly(const std::string& url, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
	static void getHeaderOnly(const std::string& url, ResponderPtr, const LLSD& headers, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);

	static void post(
		const std::string& url,
		const LLSD& body,
		ResponderPtr,
		const LLSD& headers = LLSD(),
		const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
	/** Takes ownership of data and deletes it when sent */
	static void postRaw(
		const std::string& url,
		const U8* data,
		S32 size,
		ResponderPtr responder,
		const LLSD& headers = LLSD(),
		const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
	static void postFile(
		const std::string& url,
		const std::string& filename,
		ResponderPtr,
		const LLSD& headers = LLSD(),
		const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
	static void postFile(
		const std::string& url,
		const LLUUID& uuid,
		LLAssetType::EType asset_type,
		ResponderPtr responder,
		const LLSD& headers = LLSD(),
		const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);

	static void del(
		const std::string& url,
		ResponderPtr responder,
		const LLSD& headers = LLSD(),
		const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
		///< sends a DELETE method, but we can't call it delete in c++
	
	/**
	 * @brief Send a MOVE webdav method
	 *
	 * @param url The complete serialized (and escaped) url to get.
	 * @param destination The complete serialized destination url.
	 * @param responder The responder that will handle the result.
	 * @param headers A map of key:value headers to pass to the request
	 * @param timeout The number of seconds to give the server to respond.
	 */
	static void move(
		const std::string& url,
		const std::string& destination,
		ResponderPtr responder,
		const LLSD& headers = LLSD(),
		const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);

	//@}

	/**
	 * @brief Blocking HTTP get that returns an LLSD map of status and body.
	 *
	 * @param url the complete serialized (and escaped) url to get
	 * @return An LLSD of { 'status':status, 'body':payload }
	 */
	static LLSD blockingGet(const std::string& url);

	/**
	 * @brief Blocking HTTP POST that returns an LLSD map of status and body.
	 *
	 * @param url the complete serialized (and escaped) url to get
	 * @param body the LLSD post body
	 * @return An LLSD of { 'status':status (an int), 'body':payload (an LLSD) }
	 */
	static LLSD blockingPost(const std::string& url, const LLSD& body);

	
	static void setPump(LLPumpIO& pump);
		///< must be called before any of the above calls are made
	static bool hasPump();
		///< for testing
};

#endif // LL_LLHTTPCLIENT_H