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: 32618 $ 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 14 /**< 同時に作成できる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