1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     nhttp.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 28955 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NHTTP_H_
17 #define NHTTP_H_
18 
19 #include <nn/net/compatible/nssl.h>
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 /*=======================================================================*
26     定数定義
27  *=======================================================================*/
28 /**
29  * ライブラリ設定値
30  */
31 #define NHTTP_CONNECTION_MAX        32          /**< 同時に作成できるHTTPコネクションの最大数 */
32 
33 /**
34  * エラーコード
35  */
36 #define NHTTP_ER_BASE           0xffffe000
37 #define NHTTP_ER_CODE(code)     ((s32)(NHTTP_ER_BASE|(code)))
38 
39 typedef enum nhttp_error {
40     NHTTP_ER_NONE               = 0,                /**< エラー無し */
41     NHTTP_ER_INVALID_STATUS     = NHTTP_ER_CODE(1), /**< 不正なステータス */
42     NHTTP_ER_INVALID_PARAM      = NHTTP_ER_CODE(2), /**< 不正なパラメータ */
43     NHTTP_ER_NOMEM              = NHTTP_ER_CODE(3), /**< メモリの動的取得失敗 */
44     NHTTP_ER_CREATE_EVENT       = NHTTP_ER_CODE(4), /**< イベント生成失敗 */
45     NHTTP_ER_CREATE_MUTEX       = NHTTP_ER_CODE(5), /**< ミューテックス生成失敗 */
46     NHTTP_ER_CREATE_QUEUE       = NHTTP_ER_CODE(6), /**< メッセージキュー生成失敗 */
47     NHTTP_ER_CREATE_THREAD      = NHTTP_ER_CODE(7), /**< スレッド生成失敗 */
48 
49     /* メッセージキュー */
50     NHTTP_ER_MSGQ_SEND_LSN      = NHTTP_ER_CODE(10),    /**< リスナースレッドメッセージキューへの送信失敗 */
51     NHTTP_ER_MSGQ_RECV_LSN      = NHTTP_ER_CODE(11),    /**< リスナースレッドメッセージキュー受信失敗 */
52     NHTTP_ER_MSGQ_RECV_COMM     = NHTTP_ER_CODE(12),    /**< 通信スレッドメッセージキュー受信失敗 */
53 
54     /* 接続ハンドル */
55     NHTTP_ER_CONN_NOMORE        = NHTTP_ER_CODE(20),    /**< 接続ハンドル登録最大数越え */
56     NHTTP_ER_CONN_NOSUCH        = NHTTP_ER_CODE(21),    /**< 該当接続ハンドルなし */
57     NHTTP_ER_CONN_STATUS        = NHTTP_ER_CODE(22),    /**< 接続ハンドル不正ステータス */
58     NHTTP_ER_CONN_ADD           = NHTTP_ER_CODE(23),    /**< 接続ハンドル登録失敗 */
59     NHTTP_ER_CONN_CANCELED      = NHTTP_ER_CODE(24),    /**< 接続ハンドルキャンセル */
60     NHTTP_ER_CONN_HOST_MAX      = NHTTP_ER_CODE(25),    /**< 同一ホストへの最大同時接続数越え */
61 
62     /* リクエスト */
63     NHTTP_ER_REQ_URL            = NHTTP_ER_CODE(30),    /**< 不正なURL */
64     NHTTP_ER_REQ_CONNMSG_PORT   = NHTTP_ER_CODE(31),    /**< CONNECT送信用ポート番号不正 */
65     NHTTP_ER_REQ_UNKNOWN_METHOD = NHTTP_ER_CODE(32),    /**< 認識できないメソッド */
66 
67     /* レスポンス */
68     NHTTP_ER_RES_HEADER         = NHTTP_ER_CODE(40),    /**< 不正なHTTPヘッダ */
69     NHTTP_ER_RES_NONEWLINE      = NHTTP_ER_CODE(41),    /**< HTTPヘッダ次行なし */
70     NHTTP_ER_RES_BODYBUF        = NHTTP_ER_CODE(42),    /**< HTTPボディ受信バッファエラー */
71 
72     /* POST */
73     NHTTP_ER_POST_ADDED_ANOTHER = NHTTP_ER_CODE(50),    /**< POSTデータ追加失敗(別タイプPOSTが既存) */
74     NHTTP_ER_POST_BOUNDARY      = NHTTP_ER_CODE(51),    /**< Boundaryが正しく設定できない */
75     NHTTP_ER_POST_SEND          = NHTTP_ER_CODE(52),    /**< POSTリクエスト送信失敗 */
76     NHTTP_ER_POST_UNKNOWN_ENCTYPE = NHTTP_ER_CODE(53), /**< 不明なエンコードタイプ */
77     NHTTP_ER_POST_NODATA        = NHTTP_ER_CODE(54),    /**< 送信データ設定無し */
78 
79     /* SSL */
80     NHTTP_ER_SSL                = NHTTP_ER_CODE(60),    /**< SSLエラー */
81     NHTTP_ER_SSL_CERT_EXIST     = NHTTP_ER_CODE(61),    /**< SSL 証明書設定済み(再登録前に削除が必要) */
82 
83     /* ソケット */
84     NHTTP_ER_SOC_DNS            = NHTTP_ER_CODE(70),    /**< DNS名前解決失敗 */
85     NHTTP_ER_SOC_SEND           = NHTTP_ER_CODE(71),    /**< ソケットデータ送信失敗 */
86     NHTTP_ER_SOC_RECV           = NHTTP_ER_CODE(72),    /**< ソケットデータ受信失敗 */
87     NHTTP_ER_SOC_CONN           = NHTTP_ER_CODE(73),    /**< ソケット接続失敗 */
88     NHTTP_ER_SOC_KEEPALIVE_DISCONNECTED           = NHTTP_ER_CODE(74),    /**< キープアライブ通信がサーバ側から切断された */
89 
90     /* その他 */
91     NHTTP_ER_GET_DEFAULT_PROXY  = NHTTP_ER_CODE(80),    /**< デフォルトProxy値の取得に失敗 */
92 
93     NHTTP_ER_MAX                    /**< エラー最大値(ライブラリ内部でのみ使用) */
94 } NHTTPError;
95 
96 
97 
98 
99 /**
100  * HTTPリクエストのメソッド
101  */
102 typedef enum nhttp_req_method {
103     NHTTP_REQMETHOD_NONE,   /**< メソッド無し(ライブラリ内部でのみ使用) */
104     NHTTP_REQMETHOD_GET,    /**< GETメソッド */
105     NHTTP_REQMETHOD_POST,   /**< POSTメソッド */
106     NHTTP_REQMETHOD_HEAD,   /**< HEADメソッド */
107     NHTTP_REQMETHOD_MAX     /**< 最大値(ライブラリ内部でのみ使用) */
108 } NHTTPReqMethod;
109 
110 
111 /**
112  * POSTデータのエンコーディングタイプ
113  */
114 typedef enum nhttp_encoding_type {
115     NHTTP_ENCODING_TYPE_AUTO,       /**< 自動設定(default) */
116     NHTTP_ENCODING_TYPE_URL,        /**< application/x-www-form-urlencoded */
117     NHTTP_ENCODING_TYPE_MULTIPART,  /**< multipart/form-data */
118     NHTTP_ENCODING_TYPE_MAX         /**< 最大値(ライブラリ内部でのみ使用) */
119 } NHTTPEncodingType;
120 
121 /**
122  * POSTデータのタイプ
123  */
124 typedef enum nhttp_postdata_type {
125     NHTTP_POST_DATA_TYPE_URLENCODE,      /**< URLENCODE形式 */
126     NHTTP_POST_DATA_TYPE_MULTIPART,      /**< MULTIPART形式 */
127     NHTTP_POST_DATA_TYPE_RAW,            /**< RAW形式 */
128     NHTTP_POST_DATA_TYPE_MAX             /**< 最大値(ライブラリ内部でのみ使用) */
129 } NHTTPPostDataType;
130 
131 
132 
133 /**
134  * 接続ハンドルコールバックイベント
135  */
136 typedef enum nhttp_connection_event {
137     NHTTP_CONN_EV_NONE,             /**< イベント無し(ライブラリ内部でのみ使用) */
138     NHTTP_CONN_EV_POST_SEND,        /**< POSTストリーミング送信開始 */
139     NHTTP_CONN_EV_POST_SEND_ALL,    /**< POSTストリーミング送信開始(全データ指定モード) */
140     NHTTP_CONN_EV_HEADER_RECV_DONE, /**< ヘッダ受信完了 */
141     NHTTP_CONN_EV_BODY_RECV_FULL,   /**< ボディ受信バッファの満了 */
142     NHTTP_CONN_EV_BODY_RECV_DONE,   /**< ボディ受信完了 */
143     NHTTP_CONN_EV_COMPLETE,         /**< 接続ハンドル処理完了 */
144     NHTTP_CONN_EV_MAX               /**< イベント最大値(ライブラリ内部でのみ使用) */
145 } NHTTPConnectionEvent;
146 
147 
148 /**
149  * 接続ハンドルの状態
150  * (状態変更にはNHTTPi_SetConnStatus()を使用すること)
151  */
152 typedef enum nhttp_conn_status {
153     NHTTP_CONNST_CREATED = 0,       /**< 初期状態 */
154     NHTTP_CONNST_INITIALIZED,       /**< 初期化完了 */
155     NHTTP_CONNST_ENQUEUED_LSN,      /**< リスナースレッドのキューに入っている */
156     NHTTP_CONNST_IN_LSN,            /**< リスナースレッドで処理中 */
157     NHTTP_CONNST_ENQUEUED_COMM,     /**< 通信スレッドのキューに入っている */
158     NHTTP_CONNST_CONNECTING,        /**< 接続処理中 */
159     NHTTP_CONNST_SENDING,           /**< データ送信中 */
160     NHTTP_CONNST_RECEIVING_HEADER,  /**< ヘッダ受信中 */
161     NHTTP_CONNST_RECEIVING_BODY,    /**< ボディ受信中 */
162     NHTTP_CONNST_RECEIVED,          /**< 受信終了 */
163     NHTTP_CONNST_FINISHED           /**< 処理終了 */
164 } NHTTPConnStatus;
165 
166 
167 /*=======================================================================*
168     マクロ定義
169  *=======================================================================*/
170 
171 
172 /*=======================================================================*
173     型定義
174  *=======================================================================*/
175 
176 /* メモリアロケータ */
177 typedef void *(*NHTTPAlloc) (u32 name, u32 size, u32 align); /**< メモリ取得関数 */
178 typedef void (*NHTTPFree) (u32 name, void *ptr); /**< メモリ解放関数 */
179 
180 /* その他 */
181 typedef s32 NHTTPConnectionHandle;      /**< 接続ハンドルID */
182 
183 /**
184  * 接続ハンドルコールバック
185  */
186 typedef s32 (*NHTTPConnectionCallback)(NHTTPConnectionHandle handle, NHTTPConnectionEvent event, void *arg);
187 
188 
189 /*=======================================================================*
190     構造体定義
191  *=======================================================================*/
192 
193 /**
194  * NHTTPライブラリ設定パラメータ
195  */
196 typedef struct nhttp_config {
197     NHTTPAlloc alloc;       /**< メモリ確保関数ポインタ */
198     NHTTPFree free;         /**< メモリ解放関数ポインタ */
199     u32 threadPrio;         /**< スレッド優先度(0-31) */
200     u32 threadNum;          /**< 通信スレッド数 */
201     u32 queueDepth;         /**< 接続ハンドル受け渡しキューの段数 */
202     u32 singleHostMax;      /**< 同一ホスト最大同時接続数 */
203 } NHTTPConfig;
204 
205 
206 /**
207  * POSTストリーミング送信コールバック用データ
208  */
209 typedef struct nhttp_post_send_arg {
210     const char *label;  /**< ラベル */
211     char *buf;          /**< データの先頭ポインタ */
212     u32 size;           /**< データの長さ */
213     u32 offset;         /**< 送信済みデータ長 */
214 } NHTTPPostSendArg;
215 
216 /**
217  * POSTストリーミング送信コールバック用データ
218  */
219 typedef struct nhttp_post_send_all_data_arg {
220     char *label;        /**< ラベルの先頭ポインタ */
221     char *buf;          /**< データの先頭ポインタ */
222     u32 size;           /**< データの長さ */
223     u32 offset;         /**< 送信済みデータ長 */
224     BOOL isBinary;      /**< バイナリデータか否か*/
225 } NHTTPPostSendAllDataArg;
226 
227 
228 /**
229  * ボディ受信用バッファ関連コールバック用データ
230  */
231 typedef struct nhttp_body_buf_arg {
232     char *buf;          /**< データの先頭ポインタ */
233     u32 size;           /**< データの長さ */
234     u32 offset;         /**< 送信済みデータ長 */
235 } NHTTPBodyBufArg;
236 
237 
238 /*=======================================================================*
239     関数プロトタイプ宣言
240  *=======================================================================*/
241 
242 /* 初期化・終了 */
243 s32 NHTTP_Startup(const NHTTPConfig *config);
244 s32 NHTTP_Cleanup(void);
245 
246 /* 情報取得 */
247 void *NHTTP_CallAlloc(u32 name, u32 size, u32 align);
248 void NHTTP_CallFree(u32 name, void *ptr);
249 
250 /* Clear DNS caches */
251 s32 NHTTP_ClearDnsCaches(void);
252 
253 /* 接続ハンドル */
254 NHTTPConnectionHandle NHTTP_CreateConnection(const char *url, NHTTPReqMethod method, char *bodyBuf, u32 bufLen, NHTTPConnectionCallback callback, void *userParam);
255 s32 NHTTP_DestroyConnection(NHTTPConnectionHandle handle);
256 s32 NHTTP_StartConnection(NHTTPConnectionHandle handle);
257 s32 NHTTP_StartConnectionAsync(NHTTPConnectionHandle handle);
258 s32 NHTTP_CancelConnection(NHTTPConnectionHandle handle);
259 s32 NHTTP_WaitForConnection(NHTTPConnectionHandle handle);
260 s32 NHTTP_GetConnectionStatus(NHTTPConnectionHandle handle);
261 s32 NHTTP_GetConnectionProgress(NHTTPConnectionHandle handle, u32 *received, u32 *contentLen);
262 s32 NHTTP_GetConnectionError(NHTTPConnectionHandle handle);
263 s32 NHTTP_GetConnectionSSLError(NHTTPConnectionHandle handle);
264 void *NHTTP_GetUserParam(NHTTPConnectionHandle handle);
265 
266 /* SSL証明書設定 */
267 s32 NHTTP_SetVerifyOption(NHTTPConnectionHandle handle, u32 verifyOption);
268 s32 NHTTP_SetRootCA(NHTTPConnectionHandle handle, u8 *rootCAData, int rootCASize);
269 s32 NHTTP_SetInternalRootCA(NHTTPConnectionHandle handle, u32 internalCaCertId);
270 s32 NHTTP_SetRootCaStore(NHTTPConnectionHandle handle, NSSLCertStoreId rootCAId);
271 s32 NHTTP_SetClientCert(NHTTPConnectionHandle handle, u8 *clientCertData, int clientCertSize, u8 *privateKeyData, int privateKeySize);
272 s32 NHTTP_SetInternalClientCert(NHTTPConnectionHandle handle, u32 internalClientCertId);
273 s32 NHTTP_SetClientCertId(NHTTPConnectionHandle handle, NSSLCertId clientCertId);
274 s32 NHTTP_RemoveClientCert(NHTTPConnectionHandle handle);
275 s32 NHTTP_RemoveRootCA(NHTTPConnectionHandle handle);
276 s32 NHTTP_SetRootCADefault(NHTTPConnectionHandle handle);
277 s32 NHTTP_SetClientCertDefault(NHTTPConnectionHandle handle);
278 s32 NHTTP_DisableVerifyOptionForDebug(NHTTPConnectionHandle handle, u32 verifyOption);
279 
280 /* 接続設定 */
281 s32 NHTTP_SetProxy(NHTTPConnectionHandle handle, const char *proxy, u16 port, const char *userName, const char *password);
282 s32 NHTTP_SetProxyDefault(NHTTPConnectionHandle handle);
283 s32 NHTTP_SetBasicAuthorization(NHTTPConnectionHandle handle, const char *userName, const char *password);
284 s32 NHTTP_SetSocketBufferSize(NHTTPConnectionHandle handle, u32 size);
285 s32 NHTTP_SetSocketSendBufferSize(NHTTPConnectionHandle handle, u32 size);
286 
287 /* HTTPリクエスト設定 - nhttp_req.c */
288 s32 NHTTP_AddHeaderField(NHTTPConnectionHandle handle, const char *label, const char *value);
289 #ifdef NHTTP_POST_BY_CLIENT_HEAP_MODE
290 s32 NHTTP_RemoveExistingAddedPostData(NHTTPConnectionHandle handle, const char *label, void** memory);
291 s32 NHTTP_RemovePostDataHead(NHTTPConnectionHandle handle, void** memory);
292 s32 NHTTP_GetPostDataRaw(NHTTPConnectionHandle handle, void** memory);
293 size_t NHTTP_CalculateElementSize(const char* label, u32 valueLen);
294 s32 NHTTP_AddPostDataAscii(NHTTPConnectionHandle handle, const char *label, const char *value, void* memory);
295 s32 NHTTP_AddPostDataBinary(NHTTPConnectionHandle handle, const char *label, const void *value, u32 length, void* memory);
296 s32 NHTTP_AddPostDataRaw(NHTTPConnectionHandle handle, const void *value, u32 length, void* memory);
297 #else
298 s32 NHTTP_AddPostDataAscii(NHTTPConnectionHandle handle, const char *label, const char *value);
299 s32 NHTTP_AddPostDataBinary(NHTTPConnectionHandle handle, const char *label, const void *value, u32 length);
300 s32 NHTTP_AddPostDataRaw(NHTTPConnectionHandle handle, const void *value, u32 length);
301 #endif
302 s32 NHTTP_SetPostDataEncoding(NHTTPConnectionHandle handle, NHTTPEncodingType type);
303 s32 NHTTP_SetPostDataLazySet(NHTTPConnectionHandle handle, NHTTPPostDataType dataType);
304 
305 /* HTTPレスポンス取得 - nhttp_res.c */
306 s32 NHTTP_GetBodyBuffer(NHTTPConnectionHandle handle, char **bodyBuffer, u32 *size);
307 s32 NHTTP_AllocBodyBuffer(NHTTPConnectionHandle handle, u32 size);
308 s32 NHTTP_FreeBodyBuffer(NHTTPConnectionHandle handle);
309 s32 NHTTP_GetHeaderField(NHTTPConnectionHandle, const char *label, char *value, u32 maxLen);
310 s32 NHTTP_GetHeaderAll(NHTTPConnectionHandle handle, char *value, u32 maxLen);
311 s32 NHTTP_GetResultCode(NHTTPConnectionHandle handle);
312 
313 
314 #ifdef __cplusplus
315 } /* extern "C" */
316 #endif
317 
318 #endif /* NHTTP_H_ */
319