/*---------------------------------------------------------------------------* Project: Horizon File: nhttp.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 28955 $ *---------------------------------------------------------------------------*/ #ifndef NHTTP_H_ #define NHTTP_H_ #include #ifdef __cplusplus extern "C" { #endif /*=======================================================================* 定数定義 *=======================================================================*/ /** * ライブラリ設定値 */ #define NHTTP_CONNECTION_MAX 32 /**< 同時に作成できるHTTPコネクションの最大数 */ /** * エラーコード */ #define NHTTP_ER_BASE 0xffffe000 #define NHTTP_ER_CODE(code) ((s32)(NHTTP_ER_BASE|(code))) typedef enum nhttp_error { NHTTP_ER_NONE = 0, /**< エラー無し */ NHTTP_ER_INVALID_STATUS = NHTTP_ER_CODE(1), /**< 不正なステータス */ NHTTP_ER_INVALID_PARAM = NHTTP_ER_CODE(2), /**< 不正なパラメータ */ NHTTP_ER_NOMEM = NHTTP_ER_CODE(3), /**< メモリの動的取得失敗 */ NHTTP_ER_CREATE_EVENT = NHTTP_ER_CODE(4), /**< イベント生成失敗 */ NHTTP_ER_CREATE_MUTEX = NHTTP_ER_CODE(5), /**< ミューテックス生成失敗 */ NHTTP_ER_CREATE_QUEUE = NHTTP_ER_CODE(6), /**< メッセージキュー生成失敗 */ NHTTP_ER_CREATE_THREAD = NHTTP_ER_CODE(7), /**< スレッド生成失敗 */ /* メッセージキュー */ NHTTP_ER_MSGQ_SEND_LSN = NHTTP_ER_CODE(10), /**< リスナースレッドメッセージキューへの送信失敗 */ NHTTP_ER_MSGQ_RECV_LSN = NHTTP_ER_CODE(11), /**< リスナースレッドメッセージキュー受信失敗 */ NHTTP_ER_MSGQ_RECV_COMM = NHTTP_ER_CODE(12), /**< 通信スレッドメッセージキュー受信失敗 */ /* 接続ハンドル */ NHTTP_ER_CONN_NOMORE = NHTTP_ER_CODE(20), /**< 接続ハンドル登録最大数越え */ NHTTP_ER_CONN_NOSUCH = NHTTP_ER_CODE(21), /**< 該当接続ハンドルなし */ NHTTP_ER_CONN_STATUS = NHTTP_ER_CODE(22), /**< 接続ハンドル不正ステータス */ NHTTP_ER_CONN_ADD = NHTTP_ER_CODE(23), /**< 接続ハンドル登録失敗 */ NHTTP_ER_CONN_CANCELED = NHTTP_ER_CODE(24), /**< 接続ハンドルキャンセル */ NHTTP_ER_CONN_HOST_MAX = NHTTP_ER_CODE(25), /**< 同一ホストへの最大同時接続数越え */ /* リクエスト */ NHTTP_ER_REQ_URL = NHTTP_ER_CODE(30), /**< 不正なURL */ NHTTP_ER_REQ_CONNMSG_PORT = NHTTP_ER_CODE(31), /**< CONNECT送信用ポート番号不正 */ NHTTP_ER_REQ_UNKNOWN_METHOD = NHTTP_ER_CODE(32), /**< 認識できないメソッド */ /* レスポンス */ NHTTP_ER_RES_HEADER = NHTTP_ER_CODE(40), /**< 不正なHTTPヘッダ */ NHTTP_ER_RES_NONEWLINE = NHTTP_ER_CODE(41), /**< HTTPヘッダ次行なし */ NHTTP_ER_RES_BODYBUF = NHTTP_ER_CODE(42), /**< HTTPボディ受信バッファエラー */ /* POST */ NHTTP_ER_POST_ADDED_ANOTHER = NHTTP_ER_CODE(50), /**< POSTデータ追加失敗(別タイプPOSTが既存) */ NHTTP_ER_POST_BOUNDARY = NHTTP_ER_CODE(51), /**< Boundaryが正しく設定できない */ NHTTP_ER_POST_SEND = NHTTP_ER_CODE(52), /**< POSTリクエスト送信失敗 */ NHTTP_ER_POST_UNKNOWN_ENCTYPE = NHTTP_ER_CODE(53), /**< 不明なエンコードタイプ */ NHTTP_ER_POST_NODATA = NHTTP_ER_CODE(54), /**< 送信データ設定無し */ /* SSL */ NHTTP_ER_SSL = NHTTP_ER_CODE(60), /**< SSLエラー */ NHTTP_ER_SSL_CERT_EXIST = NHTTP_ER_CODE(61), /**< SSL 証明書設定済み(再登録前に削除が必要) */ /* ソケット */ NHTTP_ER_SOC_DNS = NHTTP_ER_CODE(70), /**< DNS名前解決失敗 */ NHTTP_ER_SOC_SEND = NHTTP_ER_CODE(71), /**< ソケットデータ送信失敗 */ NHTTP_ER_SOC_RECV = NHTTP_ER_CODE(72), /**< ソケットデータ受信失敗 */ NHTTP_ER_SOC_CONN = NHTTP_ER_CODE(73), /**< ソケット接続失敗 */ NHTTP_ER_SOC_KEEPALIVE_DISCONNECTED = NHTTP_ER_CODE(74), /**< キープアライブ通信がサーバ側から切断された */ /* その他 */ NHTTP_ER_GET_DEFAULT_PROXY = NHTTP_ER_CODE(80), /**< デフォルトProxy値の取得に失敗 */ NHTTP_ER_MAX /**< エラー最大値(ライブラリ内部でのみ使用) */ } NHTTPError; /** * HTTPリクエストのメソッド */ typedef enum nhttp_req_method { NHTTP_REQMETHOD_NONE, /**< メソッド無し(ライブラリ内部でのみ使用) */ NHTTP_REQMETHOD_GET, /**< GETメソッド */ NHTTP_REQMETHOD_POST, /**< POSTメソッド */ NHTTP_REQMETHOD_HEAD, /**< HEADメソッド */ NHTTP_REQMETHOD_MAX /**< 最大値(ライブラリ内部でのみ使用) */ } NHTTPReqMethod; /** * POSTデータのエンコーディングタイプ */ typedef enum nhttp_encoding_type { NHTTP_ENCODING_TYPE_AUTO, /**< 自動設定(default) */ NHTTP_ENCODING_TYPE_URL, /**< application/x-www-form-urlencoded */ NHTTP_ENCODING_TYPE_MULTIPART, /**< multipart/form-data */ NHTTP_ENCODING_TYPE_MAX /**< 最大値(ライブラリ内部でのみ使用) */ } NHTTPEncodingType; /** * POSTデータのタイプ */ typedef enum nhttp_postdata_type { NHTTP_POST_DATA_TYPE_URLENCODE, /**< URLENCODE形式 */ NHTTP_POST_DATA_TYPE_MULTIPART, /**< MULTIPART形式 */ NHTTP_POST_DATA_TYPE_RAW, /**< RAW形式 */ NHTTP_POST_DATA_TYPE_MAX /**< 最大値(ライブラリ内部でのみ使用) */ } NHTTPPostDataType; /** * 接続ハンドルコールバックイベント */ typedef enum nhttp_connection_event { NHTTP_CONN_EV_NONE, /**< イベント無し(ライブラリ内部でのみ使用) */ NHTTP_CONN_EV_POST_SEND, /**< POSTストリーミング送信開始 */ NHTTP_CONN_EV_POST_SEND_ALL, /**< POSTストリーミング送信開始(全データ指定モード) */ NHTTP_CONN_EV_HEADER_RECV_DONE, /**< ヘッダ受信完了 */ NHTTP_CONN_EV_BODY_RECV_FULL, /**< ボディ受信バッファの満了 */ NHTTP_CONN_EV_BODY_RECV_DONE, /**< ボディ受信完了 */ NHTTP_CONN_EV_COMPLETE, /**< 接続ハンドル処理完了 */ NHTTP_CONN_EV_MAX /**< イベント最大値(ライブラリ内部でのみ使用) */ } NHTTPConnectionEvent; /** * 接続ハンドルの状態 * (状態変更にはNHTTPi_SetConnStatus()を使用すること) */ typedef enum nhttp_conn_status { NHTTP_CONNST_CREATED = 0, /**< 初期状態 */ NHTTP_CONNST_INITIALIZED, /**< 初期化完了 */ NHTTP_CONNST_ENQUEUED_LSN, /**< リスナースレッドのキューに入っている */ NHTTP_CONNST_IN_LSN, /**< リスナースレッドで処理中 */ NHTTP_CONNST_ENQUEUED_COMM, /**< 通信スレッドのキューに入っている */ NHTTP_CONNST_CONNECTING, /**< 接続処理中 */ NHTTP_CONNST_SENDING, /**< データ送信中 */ NHTTP_CONNST_RECEIVING_HEADER, /**< ヘッダ受信中 */ NHTTP_CONNST_RECEIVING_BODY, /**< ボディ受信中 */ NHTTP_CONNST_RECEIVED, /**< 受信終了 */ NHTTP_CONNST_FINISHED /**< 処理終了 */ } NHTTPConnStatus; /*=======================================================================* マクロ定義 *=======================================================================*/ /*=======================================================================* 型定義 *=======================================================================*/ /* メモリアロケータ */ typedef void *(*NHTTPAlloc) (u32 name, u32 size, u32 align); /**< メモリ取得関数 */ typedef void (*NHTTPFree) (u32 name, void *ptr); /**< メモリ解放関数 */ /* その他 */ typedef s32 NHTTPConnectionHandle; /**< 接続ハンドルID */ /** * 接続ハンドルコールバック */ typedef s32 (*NHTTPConnectionCallback)(NHTTPConnectionHandle handle, NHTTPConnectionEvent event, void *arg); /*=======================================================================* 構造体定義 *=======================================================================*/ /** * NHTTPライブラリ設定パラメータ */ typedef struct nhttp_config { NHTTPAlloc alloc; /**< メモリ確保関数ポインタ */ NHTTPFree free; /**< メモリ解放関数ポインタ */ u32 threadPrio; /**< スレッド優先度(0-31) */ u32 threadNum; /**< 通信スレッド数 */ u32 queueDepth; /**< 接続ハンドル受け渡しキューの段数 */ u32 singleHostMax; /**< 同一ホスト最大同時接続数 */ } NHTTPConfig; /** * POSTストリーミング送信コールバック用データ */ typedef struct nhttp_post_send_arg { const char *label; /**< ラベル */ char *buf; /**< データの先頭ポインタ */ u32 size; /**< データの長さ */ u32 offset; /**< 送信済みデータ長 */ } NHTTPPostSendArg; /** * POSTストリーミング送信コールバック用データ */ typedef struct nhttp_post_send_all_data_arg { char *label; /**< ラベルの先頭ポインタ */ char *buf; /**< データの先頭ポインタ */ u32 size; /**< データの長さ */ u32 offset; /**< 送信済みデータ長 */ BOOL isBinary; /**< バイナリデータか否か*/ } NHTTPPostSendAllDataArg; /** * ボディ受信用バッファ関連コールバック用データ */ typedef struct nhttp_body_buf_arg { char *buf; /**< データの先頭ポインタ */ u32 size; /**< データの長さ */ u32 offset; /**< 送信済みデータ長 */ } NHTTPBodyBufArg; /*=======================================================================* 関数プロトタイプ宣言 *=======================================================================*/ /* 初期化・終了 */ s32 NHTTP_Startup(const NHTTPConfig *config); s32 NHTTP_Cleanup(void); /* 情報取得 */ void *NHTTP_CallAlloc(u32 name, u32 size, u32 align); void NHTTP_CallFree(u32 name, void *ptr); /* Clear DNS caches */ s32 NHTTP_ClearDnsCaches(void); /* 接続ハンドル */ NHTTPConnectionHandle NHTTP_CreateConnection(const char *url, NHTTPReqMethod method, char *bodyBuf, u32 bufLen, NHTTPConnectionCallback callback, void *userParam); s32 NHTTP_DestroyConnection(NHTTPConnectionHandle handle); s32 NHTTP_StartConnection(NHTTPConnectionHandle handle); s32 NHTTP_StartConnectionAsync(NHTTPConnectionHandle handle); s32 NHTTP_CancelConnection(NHTTPConnectionHandle handle); s32 NHTTP_WaitForConnection(NHTTPConnectionHandle handle); s32 NHTTP_GetConnectionStatus(NHTTPConnectionHandle handle); s32 NHTTP_GetConnectionProgress(NHTTPConnectionHandle handle, u32 *received, u32 *contentLen); s32 NHTTP_GetConnectionError(NHTTPConnectionHandle handle); s32 NHTTP_GetConnectionSSLError(NHTTPConnectionHandle handle); void *NHTTP_GetUserParam(NHTTPConnectionHandle handle); /* SSL証明書設定 */ s32 NHTTP_SetVerifyOption(NHTTPConnectionHandle handle, u32 verifyOption); s32 NHTTP_SetRootCA(NHTTPConnectionHandle handle, u8 *rootCAData, int rootCASize); s32 NHTTP_SetInternalRootCA(NHTTPConnectionHandle handle, u32 internalCaCertId); s32 NHTTP_SetRootCaStore(NHTTPConnectionHandle handle, NSSLCertStoreId rootCAId); s32 NHTTP_SetClientCert(NHTTPConnectionHandle handle, u8 *clientCertData, int clientCertSize, u8 *privateKeyData, int privateKeySize); s32 NHTTP_SetInternalClientCert(NHTTPConnectionHandle handle, u32 internalClientCertId); s32 NHTTP_SetClientCertId(NHTTPConnectionHandle handle, NSSLCertId clientCertId); s32 NHTTP_RemoveClientCert(NHTTPConnectionHandle handle); s32 NHTTP_RemoveRootCA(NHTTPConnectionHandle handle); s32 NHTTP_SetRootCADefault(NHTTPConnectionHandle handle); s32 NHTTP_SetClientCertDefault(NHTTPConnectionHandle handle); s32 NHTTP_DisableVerifyOptionForDebug(NHTTPConnectionHandle handle, u32 verifyOption); /* 接続設定 */ s32 NHTTP_SetProxy(NHTTPConnectionHandle handle, const char *proxy, u16 port, const char *userName, const char *password); s32 NHTTP_SetProxyDefault(NHTTPConnectionHandle handle); s32 NHTTP_SetBasicAuthorization(NHTTPConnectionHandle handle, const char *userName, const char *password); s32 NHTTP_SetSocketBufferSize(NHTTPConnectionHandle handle, u32 size); s32 NHTTP_SetSocketSendBufferSize(NHTTPConnectionHandle handle, u32 size); /* HTTPリクエスト設定 - nhttp_req.c */ s32 NHTTP_AddHeaderField(NHTTPConnectionHandle handle, const char *label, const char *value); #ifdef NHTTP_POST_BY_CLIENT_HEAP_MODE s32 NHTTP_RemoveExistingAddedPostData(NHTTPConnectionHandle handle, const char *label, void** memory); s32 NHTTP_RemovePostDataHead(NHTTPConnectionHandle handle, void** memory); s32 NHTTP_GetPostDataRaw(NHTTPConnectionHandle handle, void** memory); size_t NHTTP_CalculateElementSize(const char* label, u32 valueLen); s32 NHTTP_AddPostDataAscii(NHTTPConnectionHandle handle, const char *label, const char *value, void* memory); s32 NHTTP_AddPostDataBinary(NHTTPConnectionHandle handle, const char *label, const void *value, u32 length, void* memory); s32 NHTTP_AddPostDataRaw(NHTTPConnectionHandle handle, const void *value, u32 length, void* memory); #else s32 NHTTP_AddPostDataAscii(NHTTPConnectionHandle handle, const char *label, const char *value); s32 NHTTP_AddPostDataBinary(NHTTPConnectionHandle handle, const char *label, const void *value, u32 length); s32 NHTTP_AddPostDataRaw(NHTTPConnectionHandle handle, const void *value, u32 length); #endif s32 NHTTP_SetPostDataEncoding(NHTTPConnectionHandle handle, NHTTPEncodingType type); s32 NHTTP_SetPostDataLazySet(NHTTPConnectionHandle handle, NHTTPPostDataType dataType); /* HTTPレスポンス取得 - nhttp_res.c */ s32 NHTTP_GetBodyBuffer(NHTTPConnectionHandle handle, char **bodyBuffer, u32 *size); s32 NHTTP_AllocBodyBuffer(NHTTPConnectionHandle handle, u32 size); s32 NHTTP_FreeBodyBuffer(NHTTPConnectionHandle handle); s32 NHTTP_GetHeaderField(NHTTPConnectionHandle, const char *label, char *value, u32 maxLen); s32 NHTTP_GetHeaderAll(NHTTPConnectionHandle handle, char *value, u32 maxLen); s32 NHTTP_GetResultCode(NHTTPConnectionHandle handle); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* NHTTP_H_ */