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: 25662 $
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 
89     /* その他 */
90     NHTTP_ER_GET_DEFAULT_PROXY  = NHTTP_ER_CODE(80),    /**< デフォルトProxy値の取得に失敗 */
91 
92     NHTTP_ER_MAX                    /**< エラー最大値(ライブラリ内部でのみ使用) */
93 } NHTTPError;
94 
95 
96 
97 
98 /**
99  * HTTPリクエストのメソッド
100  */
101 typedef enum nhttp_req_method {
102     NHTTP_REQMETHOD_NONE,   /**< メソッド無し(ライブラリ内部でのみ使用) */
103     NHTTP_REQMETHOD_GET,    /**< GETメソッド */
104     NHTTP_REQMETHOD_POST,   /**< POSTメソッド */
105     NHTTP_REQMETHOD_HEAD,   /**< HEADメソッド */
106     NHTTP_REQMETHOD_MAX     /**< 最大値(ライブラリ内部でのみ使用) */
107 } NHTTPReqMethod;
108 
109 
110 /**
111  * POSTデータのエンコーディングタイプ
112  */
113 typedef enum nhttp_encoding_type {
114     NHTTP_ENCODING_TYPE_AUTO,       /**< 自動設定(default) */
115     NHTTP_ENCODING_TYPE_URL,        /**< application/x-www-form-urlencoded */
116     NHTTP_ENCODING_TYPE_MULTIPART,  /**< multipart/form-data */
117     NHTTP_ENCODING_TYPE_MAX         /**< 最大値(ライブラリ内部でのみ使用) */
118 } NHTTPEncodingType;
119 
120 /**
121  * POSTデータのタイプ
122  */
123 typedef enum nhttp_postdata_type {
124     NHTTP_POST_DATA_TYPE_URLENCODE,      /**< URLENCODE形式 */
125     NHTTP_POST_DATA_TYPE_MULTIPART,      /**< MULTIPART形式 */
126     NHTTP_POST_DATA_TYPE_RAW,            /**< RAW形式 */
127     NHTTP_POST_DATA_TYPE_MAX             /**< 最大値(ライブラリ内部でのみ使用) */
128 } NHTTPPostDataType;
129 
130 
131 
132 /**
133  * 接続ハンドルコールバックイベント
134  */
135 typedef enum nhttp_connection_event {
136     NHTTP_CONN_EV_NONE,             /**< イベント無し(ライブラリ内部でのみ使用) */
137     NHTTP_CONN_EV_POST_SEND,        /**< POSTストリーミング送信開始 */
138     NHTTP_CONN_EV_POST_SEND_ALL,    /**< POSTストリーミング送信開始(全データ指定モード) */
139     NHTTP_CONN_EV_HEADER_RECV_DONE, /**< ヘッダ受信完了 */
140     NHTTP_CONN_EV_BODY_RECV_FULL,   /**< ボディ受信バッファの満了 */
141     NHTTP_CONN_EV_BODY_RECV_DONE,   /**< ボディ受信完了 */
142     NHTTP_CONN_EV_COMPLETE,         /**< 接続ハンドル処理完了 */
143     NHTTP_CONN_EV_MAX               /**< イベント最大値(ライブラリ内部でのみ使用) */
144 } NHTTPConnectionEvent;
145 
146 
147 /**
148  * 接続ハンドルの状態
149  * (状態変更にはNHTTPi_SetConnStatus()を使用すること)
150  */
151 typedef enum nhttp_conn_status {
152     NHTTP_CONNST_CREATED = 0,       /**< 初期状態 */
153     NHTTP_CONNST_INITIALIZED,       /**< 初期化完了 */
154     NHTTP_CONNST_ENQUEUED_LSN,      /**< リスナースレッドのキューに入っている */
155     NHTTP_CONNST_IN_LSN,            /**< リスナースレッドで処理中 */
156     NHTTP_CONNST_ENQUEUED_COMM,     /**< 通信スレッドのキューに入っている */
157     NHTTP_CONNST_CONNECTING,        /**< 接続処理中 */
158     NHTTP_CONNST_SENDING,           /**< データ送信中 */
159     NHTTP_CONNST_RECEIVING_HEADER,  /**< ヘッダ受信中 */
160     NHTTP_CONNST_RECEIVING_BODY,    /**< ボディ受信中 */
161     NHTTP_CONNST_RECEIVED,          /**< 受信終了 */
162     NHTTP_CONNST_FINISHED           /**< 処理終了 */
163 } NHTTPConnStatus;
164 
165 
166 /*=======================================================================*
167     マクロ定義
168  *=======================================================================*/
169 
170 
171 /*=======================================================================*
172     型定義
173  *=======================================================================*/
174 
175 /* メモリアロケータ */
176 typedef void *(*NHTTPAlloc) (u32 name, u32 size, u32 align); /**< メモリ取得関数 */
177 typedef void (*NHTTPFree) (u32 name, void *ptr); /**< メモリ解放関数 */
178 
179 /* その他 */
180 typedef s32 NHTTPConnectionHandle;      /**< 接続ハンドルID */
181 
182 /**
183  * 接続ハンドルコールバック
184  */
185 typedef s32 (*NHTTPConnectionCallback)(NHTTPConnectionHandle handle, NHTTPConnectionEvent event, void *arg);
186 
187 
188 /*=======================================================================*
189     構造体定義
190  *=======================================================================*/
191 
192 /**
193  * NHTTPライブラリ設定パラメータ
194  */
195 typedef struct nhttp_config {
196     NHTTPAlloc alloc;       /**< メモリ確保関数ポインタ */
197     NHTTPFree free;         /**< メモリ解放関数ポインタ */
198     u32 threadPrio;         /**< スレッド優先度(0-31) */
199     u32 threadNum;          /**< 通信スレッド数 */
200     u32 queueDepth;         /**< 接続ハンドル受け渡しキューの段数 */
201     u32 singleHostMax;      /**< 同一ホスト最大同時接続数 */
202 } NHTTPConfig;
203 
204 
205 /**
206  * POSTストリーミング送信コールバック用データ
207  */
208 typedef struct nhttp_post_send_arg {
209     const char *label;  /**< ラベル */
210     char *buf;          /**< データの先頭ポインタ */
211     u32 size;           /**< データの長さ */
212     u32 offset;         /**< 送信済みデータ長 */
213 } NHTTPPostSendArg;
214 
215 /**
216  * POSTストリーミング送信コールバック用データ
217  */
218 typedef struct nhttp_post_send_all_data_arg {
219     char *label;        /**< ラベルの先頭ポインタ */
220     char *buf;          /**< データの先頭ポインタ */
221     u32 size;           /**< データの長さ */
222     u32 offset;         /**< 送信済みデータ長 */
223     BOOL isBinary;      /**< バイナリデータか否か*/
224 } NHTTPPostSendAllDataArg;
225 
226 
227 /**
228  * ボディ受信用バッファ関連コールバック用データ
229  */
230 typedef struct nhttp_body_buf_arg {
231     char *buf;          /**< データの先頭ポインタ */
232     u32 size;           /**< データの長さ */
233     u32 offset;         /**< 送信済みデータ長 */
234 } NHTTPBodyBufArg;
235 
236 
237 /*=======================================================================*
238     関数プロトタイプ宣言
239  *=======================================================================*/
240 
241 /* 初期化・終了 */
242 s32 NHTTP_Startup(const NHTTPConfig *config);
243 s32 NHTTP_Cleanup(void);
244 
245 /* 情報取得 */
246 void *NHTTP_CallAlloc(u32 name, u32 size, u32 align);
247 void NHTTP_CallFree(u32 name, void *ptr);
248 
249 /* 接続ハンドル */
250 NHTTPConnectionHandle NHTTP_CreateConnection(const char *url, NHTTPReqMethod method, char *bodyBuf, u32 bufLen, NHTTPConnectionCallback callback, void *userParam);
251 s32 NHTTP_DestroyConnection(NHTTPConnectionHandle handle);
252 s32 NHTTP_StartConnection(NHTTPConnectionHandle handle);
253 s32 NHTTP_StartConnectionAsync(NHTTPConnectionHandle handle);
254 s32 NHTTP_CancelConnection(NHTTPConnectionHandle handle);
255 s32 NHTTP_WaitForConnection(NHTTPConnectionHandle handle);
256 s32 NHTTP_GetConnectionStatus(NHTTPConnectionHandle handle);
257 s32 NHTTP_GetConnectionProgress(NHTTPConnectionHandle handle, u32 *received, u32 *contentLen);
258 s32 NHTTP_GetConnectionError(NHTTPConnectionHandle handle);
259 s32 NHTTP_GetConnectionSSLError(NHTTPConnectionHandle handle);
260 void *NHTTP_GetUserParam(NHTTPConnectionHandle handle);
261 
262 /* SSL証明書設定 */
263 s32 NHTTP_SetVerifyOption(NHTTPConnectionHandle handle, u32 verifyOption);
264 s32 NHTTP_SetRootCA(NHTTPConnectionHandle handle, u8 *rootCAData, int rootCASize);
265 s32 NHTTP_SetInternalRootCA(NHTTPConnectionHandle handle, u32 internalCaCertId);
266 s32 NHTTP_SetRootCaStore(NHTTPConnectionHandle handle, NSSLCertStoreId rootCAId);
267 s32 NHTTP_SetClientCert(NHTTPConnectionHandle handle, u8 *clientCertData, int clientCertSize, u8 *privateKeyData, int privateKeySize);
268 s32 NHTTP_SetInternalClientCert(NHTTPConnectionHandle handle, u32 internalClientCertId);
269 s32 NHTTP_SetClientCertId(NHTTPConnectionHandle handle, NSSLCertId clientCertId);
270 s32 NHTTP_RemoveClientCert(NHTTPConnectionHandle handle);
271 s32 NHTTP_RemoveRootCA(NHTTPConnectionHandle handle);
272 s32 NHTTP_SetRootCADefault(NHTTPConnectionHandle handle);
273 s32 NHTTP_SetClientCertDefault(NHTTPConnectionHandle handle);
274 s32 NHTTP_DisableVerifyOptionForDebug(NHTTPConnectionHandle handle, u32 verifyOption);
275 
276 /* 接続設定 */
277 s32 NHTTP_SetProxy(NHTTPConnectionHandle handle, const char *proxy, u16 port, const char *userName, const char *password);
278 s32 NHTTP_SetProxyDefault(NHTTPConnectionHandle handle);
279 s32 NHTTP_SetBasicAuthorization(NHTTPConnectionHandle handle, const char *userName, const char *password);
280 s32 NHTTP_SetSocketBufferSize(NHTTPConnectionHandle handle, u32 size);
281 s32 NHTTP_SetSocketSendBufferSize(NHTTPConnectionHandle handle, u32 size);
282 
283 /* HTTPリクエスト設定 - nhttp_req.c */
284 s32 NHTTP_AddHeaderField(NHTTPConnectionHandle handle, const char *label, const char *value);
285 #ifdef NHTTP_POST_BY_CLIENT_HEAP_MODE
286 void* NHTTP_RemoveExistingAddedPostData(NHTTPConnectionHandle handle, const char *label);
287 void* NHTTP_RemovePostDataHead(NHTTPConnectionHandle handle);
288 void* NHTTP_GetPostDataRaw(NHTTPConnectionHandle handle);
289 size_t NHTTP_CalculateElementSize(const char* label, u32 valueLen);
290 s32 NHTTP_AddPostDataAscii(NHTTPConnectionHandle handle, const char *label, const char *value, void* memory);
291 s32 NHTTP_AddPostDataBinary(NHTTPConnectionHandle handle, const char *label, const void *value, u32 length, void* memory);
292 s32 NHTTP_AddPostDataRaw(NHTTPConnectionHandle handle, const void *value, u32 length, void* memory);
293 #else
294 s32 NHTTP_AddPostDataAscii(NHTTPConnectionHandle handle, const char *label, const char *value);
295 s32 NHTTP_AddPostDataBinary(NHTTPConnectionHandle handle, const char *label, const void *value, u32 length);
296 s32 NHTTP_AddPostDataRaw(NHTTPConnectionHandle handle, const void *value, u32 length);
297 #endif
298 s32 NHTTP_SetPostDataEncoding(NHTTPConnectionHandle handle, NHTTPEncodingType type);
299 s32 NHTTP_SetPostDataLazySet(NHTTPConnectionHandle handle, NHTTPPostDataType dataType);
300 
301 /* HTTPレスポンス取得 - nhttp_res.c */
302 s32 NHTTP_GetBodyBuffer(NHTTPConnectionHandle handle, char **bodyBuffer, u32 *size);
303 s32 NHTTP_AllocBodyBuffer(NHTTPConnectionHandle handle, u32 size);
304 s32 NHTTP_FreeBodyBuffer(NHTTPConnectionHandle handle);
305 s32 NHTTP_GetHeaderField(NHTTPConnectionHandle, const char *label, char *value, u32 maxLen);
306 s32 NHTTP_GetHeaderAll(NHTTPConnectionHandle handle, char *value, u32 maxLen);
307 s32 NHTTP_GetResultCode(NHTTPConnectionHandle handle);
308 
309 
310 #ifdef __cplusplus
311 } /* extern "C" */
312 #endif
313 
314 #endif /* NHTTP_H_ */
315