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