●HTTPライブラリ Ver2.00(2002/05/06) ○概要  ZaurusでHTTPを使ってWWWサーバからドキュメントを受信することができま す。HTTPのGETリクエストとそれに対するサーバからのヘッダ、コンテンツ受 信部分のライブラリです。HTMLパーサは含んでいません。 ○インストール方法  ソースをプロジェクトに追加するか、libhttp.aをSZABディレクトリのlibに 入れ、httpapi.hをSZABディレクトリのlibheader\cに入れるかします。後者の 場合にはプロジェクトのリンカオプション(LKFLAGS2)の先頭に -lhttp を追 加する必要があります。 ○API説明  GETリクエスト、サーバからのコンテンツ受信までを一つの関数で行う高レ ベルAPIと、より細かい処理を行うための低レベルAPIがあります。  まずは高レベルAPIを利用してみて、必要ならば高レベルAPIのソースを参考 にしながら低レベルAPIを使うのが良いでしょう。 ・低レベルAPI  アプリケーション側でsocketやconnectを行ってから利用する必要があるも のです。アプリケーション側の処理は増えますが、細かくいろいろなことがで きます。 ------------------------------------------------------------------------- void HttpErrorAlert(HTTPERR httpErr); 【機能】 HTTP APIのエラーコードに応じたアラートを表示する 【引数】 HTTPERR httpErr HTTP APIエラーコード 【戻り値】 なし ------------------------------------------------------------------------- HTTPERR HttpReadBytes(int httpSock,char *buf,ULONG *bufLen,int waitMs); 【機能】 WWWサーバからのレスポンスを指定バイトだけ読む 【引数】 int httpSock socket関数の戻り値 char *buf 読み込み先のバッファ ULONG *bufLen 読み込むバイト数と実際に読み込んだバイト数 int waitMs タイムアウト時間(ms) 【戻り値】 HTTPERR httpErr HTTP APIエラーコード ------------------------------------------------------------------------- HTTPERR HttpRead(int httpSock,char *buf,ULONG *bufLen,int waitMs); 【機能】 WWWサーバからのレスポンスをすべて読む 【引数】 int httpSock socket関数の戻り値 char *buf 読み込み先のバッファ ULONG *bufLen 読み込むバイト数と実際に読み込んだバイト数 int waitMs タイムアウト時間(ms) 【戻り値】 HTTPERR httpErr HTTP APIエラーコード ------------------------------------------------------------------------- HTTPERR HttpSendGet(int httpSock,const char *param) 【機能】 WWWサーバへGETリクエストを送信する 【引数】 int httpSock socket関数の戻り値 const char *param GETリクエストのパラメータ 【戻り値】 HTTPERR httpErr HTTP APIエラーコード ------------------------------------------------------------------------- HTTPERR HttpSendGetExHeader(int httpSock,const char *param, const char *exHeader) 【機能】 WWWサーバへGETリクエストを送信する 【引数】 int httpSock socket関数の戻り値 const char *param GETリクエストのパラメータ const char *exHeader 追加するヘッダ 【戻り値】 HTTPERR httpErr HTTP APIエラーコード ------------------------------------------------------------------------- HTTPERR HttpReadHeader(int httpSock,HTTPHEADER **httpHeader) 【機能】 WWWサーバからのHTTPレスポンスヘッダを読む 結果は確保されたヒープ上へ格納され、そのアドレスがhttpHeaderに格納さ れる。したがって呼び出し側でそのヒープを開放する必要がある。 【引数】 int httpSock socket関数の戻り値 HTTPHEADER **httpHeader ヘッダを読み込んだ結果を保持する構造体の ポインタが格納されるアドレス 【戻り値】 HTTPERR httpErr HTTP APIエラーコード ------------------------------------------------------------------------- ・高レベルAPI  一つの関数呼び出しで指定WWWサーバのドキュメントをバッファに受信する という動作をすべて行ってしまうものです。 ------------------------------------------------------------------------- HTTPERR HttpGetUrl(const char *wwwServer,const char *url, char **urlContent,ULONG *urlContentLen); 【機能】 指定WWWサーバから指定ドキュメントを読み出す 【引数】 const char *wwwServer WWWサーバ(ex."www.sharp.co.jp") const char *url WWWサーバ上の読み出すドキュメント (ex."/index.html") char **urlContent 読み込んだデータを格納したヒープポインタ を格納するアドレス 読み出すドキュメントのサイズにかかわらず ここで指定したサイズのヒープを確保します ドキュメントのサイズがここで指定したサイ ズより大きい場合にはエラーとなります ULONG *urlContentLen 上記バッファの最大長 【戻り値】 HTTPERR httpErr HTTP APIエラーコード ------------------------------------------------------------------------- HTTPERR HttpGetUrlExHeader(const char *wwwServer,const char *url, char **urlContent,ULONG *urlContentLen, const char *exHeader); 【機能】 指定WWWサーバから指定ドキュメントを読み出す 【引数】 const char *wwwServer WWWサーバ(ex."www.sharp.co.jp") const char *url WWWサーバ上の読み出すドキュメント (ex."/index.html") char **urlContent 読み込んだデータを格納したヒープポインタ を格納するアドレス ULONG *urlContentLen 上記バッファの最大長 読み出すドキュメントのサイズにかかわらず ここで指定したサイズのヒープを確保します ドキュメントのサイズがここで指定したサイ ズより大きい場合にはエラーとなります const char *exHeader HTTPのGETリクエスト送信時に追加するヘッ ダ 【戻り値】 HTTPERR httpErr HTTP APIエラーコード ------------------------------------------------------------------------- ・HTTPプロキシ設定API HTTPのプロキシをPPP設定ファイルから読み出したり(独自形式)、プロキ シの設定を行うためのものです。 ------------------------------------------------------------------------- void HttpSetProxy(const char *proxy,USHORT proxyPort); 【機能】 HTTPプロキシを設定する 以降のHttpAPIではこのプロキシが使用されます 【引数】 const char *proxy Proxyサーバ(ex."www.sharp.co.jp") USHORT proxyPort Proxyサーバのポート番号 【戻り値】 なし ------------------------------------------------------------------------- BOOLEAN HttpGetProxyFromPPPConf(const char *pppConf, char *proxy,USHORT *proxyPort); 【機能】 PPP接続設定ファイルからProxyサーバ名とポート番号を読み出す PPP接続設定ファイルの標準規格ではHTTP Proxyの記述はできません(あくま でPPP接続設定なので)。本APIはPPP接続設定ファイルに以下の書式で記述さ れたHTTP Proxy情報を読み出す。':'に続けてポート番号を指定可能(ポート 番号省略時は80とみなす)。 #Proxy_HTTP=www.proxy.ne.jp:3080 【引数】 const char *pppConf PPP接続設定ファイル char *proxy Proxyサーバの読み出し先 (最大HTTP_SERVER_NAME_MAX) USHORT *proxyPort Proxyサーバのポート番号読み出し先 【戻り値】 true 読み出せた false 読み出せない(記述がない場合も含む) ------------------------------------------------------------------------- ・タイムアウト設定API HTTPサーバから一定時間応答がないとタイムアウトエラーになりますが、こ の時間を設定するためのものです。 ------------------------------------------------------------------------- void HttpSetTimeOut(int timeOutMs); 【機能】 タイムアウト値(ms)を設定する デフォルトは30秒(30000ms)です。 【引数】 int timeOutMs タイムアウト値(ms) 【戻り値】 なし ------------------------------------------------------------------------- ・APIその他設定API ------------------------------------------------------------------------- void HttpSetShutDownNotify(BOOLEAN isEnable) 【機能】 サーバからの切断通知をエラーとして扱うかどうかを設定する デフォルトはtrue(エラーとして扱う)です 【引数】 BOOLEAN isEnalbe エラーとして扱うかどうか 【戻り値】 なし ------------------------------------------------------------------------- void HttpSetMovedUrlError(BOOLEAN isError) 【機能】 サーバの移動通知をエラーとして扱うか、正常として扱い移動先のURLを かわりに取得するかを指定します。 デフォルトはfalse、つまりエラーとは扱いません 【引数】 BOOLEAN isError エラーとして扱うかどうか 【戻り値】 なし ------------------------------------------------------------------------- ○簡単な使い方  ここでは、もっとも簡単なHttpGetUrl()についてサンプルコードを示します。 あらかじめPPPconnectを使ってインターネットに接続しておきます。 PPPconnectのための接続設定ファイルは「MOREインターネット設定」などで作 成できます。  その後HttpGetUrl()にて指定WWWサーバの指定ドキュメントを受信します。 WWWサーバの指定ではWWWブラウザなどで指定する"http://"の部分は不要です ので注意してください。  単純にWWWサーバから指定ドキュメントを一括受信するならばこれだけで十 分です。もう少し細かい処理を行いたい場合は、HttpGetUrl()のソースを参考 にして、他の低レベルAPIを利用してください。 #include #include void foo() { char *urlContent = NULL; ULONG urlContentLen; int pppErr; HTTPERR httpErr; if((pppErr = PPPconnect(PPP_OPEN,(void*)NULL,"F0:MPGPPPP.DAT")) != NOERR){ /* 接続できなかった! */ return; } urlContentLen = 20*1024; httpErr = HttpGetUrl("www.excite.co.jp", "/zaurus/bangumi_ma/weather/weekly/kinki/kyoto/JP6120.html", &urlContent,&urlContentLen); PPPconnect(PPP_CLOSE,(void*)NULL,"F0:MPGPPPP.DAT"); /* urlContentが指している先に受信したデータが入っている */ ....; /* 処理が終わったらurlContentは解放する必要がある */ DisposeHeapPtr(urlContent); } ○使用上の注意事項  本ライブラリを利用してのZaurus用MOREアプリケーション開発は自由に行っ ていただいてかまいません。本ライブラリを利用した場合はその旨を明記いた だけると大変うれしいです。  個人的な目的のための利用・再配布は自由に行っていただいてかまいません (ただし転載は無断で行わないでください)。これ以外の目的で再配布する際 には事前に(事後でもかまいませんが)知らせてください(連絡先は文末にあ ります)。 本ライブラリを利用したことにより発生した損害等について、作者は一切責 任を負いません。この点に同意いただける場合のみご利用ください。 ○履歴 Ver2.00(2002/05/06) ・サーバが返したHTTPステータスコードが300番台、つまり移動通知だった場 合に移動先のURLをかわりに取得するようにしました。 ・互換性を保つために、HttpSetMovedUrlError()で移動通知を従来どおりエラー として扱うよう指定できるようにしました。 ・正式なAPIではないのですが、gLogFileにファイルディスクリプタをセット すればこれにログを吐き出させることができます。ログファイルをあらかじ め書き込み可能でopenしておいて、これをgLogFileにセットして使います。 終了後はアプリケーション側でログファイルをcloseしてください。 ・HttpSendGetExHeader()が戻り値を返していなかったバグを修正しました。 ご指摘いただきありがとうございました。推測ですがたまたま正しい戻り値 を返していて表面上問題は起こっていなかったようです。 Ver1.30(2001/12/03) ・SHUTDOWN_NOTIFY(サーバからの切断通知)を無条件にエラーとしていたの が、一部の環境では問題となるためこれを切り替えるためのAPIを追加しま した。 Ver1.20(2001/10/15) ・タイムアウトに関するところがソースやドキュメントに反映されていなかっ たのを修正しました。 ・サーバレスポンスのチェックをちょっと緩めました(サーバによってはこち らが意図していないものを返してくるようなので)。 ○連絡先(感想・要望・質問等もどうぞ) ウクレレとりっぷ ukulele_trip@yahoo.co.jp