This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

libMiMic(MiMic library for mbed)は、WebService機能を提供するSDKです。 mbedでWebAPIに対応したネットワークデバイスを簡単に作ることが出来ます。

libMiMicはMiMic projectで開発しています。MiMic projectについてはこちらをご覧ください。 http://nyatla.jp/mimic/wp/

構成

libMiMicはmbedRTOS上で動作し、ユーザアプリケーションにAPIを提供します。コアAPIはC言語で記述されていますが、使用頻度の高いものについてはmbed向けのC++APIが準備されています。

/media/uploads/nyatla/libmimic-sdk.png

※libMiMicはmbedの標準イーサネットドライバをしようしていません。

標準イーサネットドライバと同時に使用することはできません。

  • MiMicIP - IPv4スタックです。レテンシとメモリ消費量を抑えたuipベースのライブラリです。
  • ARP/ICMP/UDP/TCP - 基礎的なソケットAPIを提供します。APIは独自です。
  • HTTP/1.1 Server - HTTP/1.1に対応したサーバです。マルチセッション・Chunked・持続性接続に対応しています。
  • HTTP Modules - HTTP/1.1の機能モジュールです。以下のモジュールがあります。
    • ROM file provider - ROMに格納したファイルイメージを公開します。
    • File system provider - mbedファイルシステムを公開します。
    • Onchip configuration - プログラムフラッシュを利用して設定を保存します。
    • MiMicVM processor - RPCリクエスト(MiMicVM)を処理します。
    • FileUpload - ファイルアップロードを受け取ります。
    • URL decoder - HTTPリクエストを解析します。
    • UPnP handler -UPnPメッセージを処理します。
    • WebSocket - Websocketサーバです。
  • mDNS - マルチキャストDNSサービスです。
  • UPnP - UPnP/1.0の機能を提供します。UPnP handlerと協調して動作します。(現在はデバイス探索(SSDP)・デスクリプション(Description)のみ実装してあります。)
  • DHCP/APIPA - ゼロコンフィギュレーション用のモジュールです。
  • HTTP/1.1 Client
  • mbed C++ class library - mbed向けのC++CPIです。C言語のものより簡単です。

対応機種

  • mbed(mbed LPC1768)
  • LPCXpresso1769

プログラム

Import programMiMicRemoteMCU-for-Mbed

MiMic RemoteMCU for mbed. This program provides MCU control API over REST API. It can control MCU from Javascript,PHP or any HTTP rest client directly. And, The application has self development environment.

Import programMbedFileServer

The program publishes files at local directory and SD filesystem. It is a full-fledged webServer somewhat.

サンプル

Import programMiMicSimpleHttpd

This is a simplest HTTP server made ​​of libMiMic. It will echo back a request path.

Import programUPnPBasicDevice

Simplest UPnP basic device example. This program to run UPnP basic device on the mbed.

Import programWebSocketSample

MiMicSDK Websocket module sample program.

Import programHttpClientSamlpe

A http client sample program.

Import programTcpSocketClientSamlpe

MiMicSDK Tcp client socket sample program.

Import programUdpSocketSamlpe

Udp socket sample program. This program will send back the received packet.

チュートリアル

English

libMiMic(MiMic library for mbed) is SDK which provides Webservice functions. It can be created networking device easily using mbed.

See more MiMic information, See MiMic project website. http://nyatla.jp/mimic/wp/

Structure

libMiMic run on mbed RTOS and provides networking API to user application. This library has C++ class API for the mbed, and low-level C language API.

/media/uploads/nyatla/libmimic-sdk.png

For WebService general, it can be written in a simple C + + API.

libMiMic does not have the standard Ethernet driver of mbed. It is not possible that will be used with the standard Ethernet driver.

  • MiMicIP - IPv4 protocol stack. This is based uip which is reduced memory and latency.
  • ARP / ICMP / UDP / TCP - Those are provide basic IP protocols.
  • HTTP/1.1 Server - The Http server compatible HTTP/1.1. It supports multi-session, chunked transport, persistent connection.
  • HTTP Modules - There are addon-module for HTTP server. The following modules.
    • ROM file module - Publish the file images in ROM.
    • File system module - Publish thefiles in mbed file system.
    • Onchip configuration module - To save the network settings to the program flash via REST.
    • MiMicVM module - To handle the (MiMicVM) RPC request.
    • FileUpload module - Accept a file via HTTP POST.
    • URL dedoce module - A versatility URL decoder.
    • UPnP handle module - To handle UPnP messages.
    • UPnP - This provides UPnP/1.0 device functions. It works together with UPnP handler.
    • Websocket - websocket (version13) server
  • mDNS Service - DNS-SD protocol server.
  • UPnP - This provides UPnP/1.0 device functions which works with UPnP handler. (You have been implemented (SSDP) ? description only (Description) device search now.) It is a module zero configuration for - DHCP / APIPA. mbed C + + class library - C of mbed for + + is the CPI. It is simple than that of the C language.
  • DHCP/APIPA - It support zero-cpnfigulation.
  • mbed C++ class library. Almost APIs for Web applications are available.
  • HTTP/1.1 Client

Supported target

  • mbed(mbed LPC1768)
  • LPCXpresso1769

Application

Import programMiMicRemoteMCU-for-Mbed

MiMic RemoteMCU for mbed. This program provides MCU control API over REST API. It can control MCU from Javascript,PHP or any HTTP rest client directly. And, The application has self development environment.

Import programMbedFileServer

The program publishes files at local directory and SD filesystem. It is a full-fledged webServer somewhat.

Sample

Import programMiMicSimpleHttpd

This is a simplest HTTP server made ​​of libMiMic. It will echo back a request path.

Import programUPnPBasicDevice

Simplest UPnP basic device example. This program to run UPnP basic device on the mbed.

Import programWebSocketSample

MiMicSDK Websocket module sample program.

Import programHttpClientSamlpe

A http client sample program.

Import programTcpSocketClientSamlpe

MiMicSDK Tcp client socket sample program.

Import programUdpSocketSamlpe

Udp socket sample program. This program will send back the received packet.

Tutorial

Committer:
nyatla
Date:
Wed Mar 27 12:07:47 2013 +0000
Revision:
2:b96c1e90d120
Parent:
1:9f6a78395432
???????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 1:9f6a78395432 1 /*********************************************************************************
nyatla 1:9f6a78395432 2 * PROJECT: MiMic
nyatla 1:9f6a78395432 3 * --------------------------------------------------------------------------------
nyatla 1:9f6a78395432 4 *
nyatla 1:9f6a78395432 5 * This file is part of MiMic
nyatla 1:9f6a78395432 6 * Copyright (C)2011 Ryo Iizuka
nyatla 1:9f6a78395432 7 *
nyatla 1:9f6a78395432 8 * MiMic is free software: you can redistribute it and/or modify
nyatla 1:9f6a78395432 9 * it under the terms of the GNU Lesser General Public License as published
nyatla 1:9f6a78395432 10 * by the Free Software Foundation, either version 3 of the License, or
nyatla 1:9f6a78395432 11 * (at your option) any later version.
nyatla 1:9f6a78395432 12 *
nyatla 1:9f6a78395432 13 * This program is distributed in the hope that it will be useful,
nyatla 1:9f6a78395432 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nyatla 1:9f6a78395432 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nyatla 1:9f6a78395432 16 * GNU General Public License for more details.
nyatla 1:9f6a78395432 17 *
nyatla 1:9f6a78395432 18 * You should have received a copy of the GNU Lesser General Public License
nyatla 1:9f6a78395432 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
nyatla 1:9f6a78395432 20 *
nyatla 1:9f6a78395432 21 * For further information please contact.
nyatla 1:9f6a78395432 22 * http://nyatla.jp/
nyatla 1:9f6a78395432 23 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
nyatla 1:9f6a78395432 24 *
nyatla 1:9f6a78395432 25 *********************************************************************************/
nyatla 1:9f6a78395432 26 #include "NyLPC_cHttpBasicHeaderParser_protected.h"
nyatla 1:9f6a78395432 27 #include <stdlib.h>
nyatla 1:9f6a78395432 28
nyatla 1:9f6a78395432 29 NyLPC_TBool NyLPC_THttpBasicHeader_isPersistent(const struct NyLPC_THttpBasicHeader* i_struct)
nyatla 1:9f6a78395432 30 {
nyatla 1:9f6a78395432 31 switch(i_struct->type)
nyatla 1:9f6a78395432 32 {
nyatla 1:9f6a78395432 33 case NyLPC_THttpHeaderType_REQUEST:
nyatla 1:9f6a78395432 34 return (i_struct->connection!=NyLPC_THttpMessgeHeader_Connection_CLOSE)&&(i_struct->startline.req.version==NyLPC_THttpVersion_11);
nyatla 1:9f6a78395432 35 case NyLPC_THttpHeaderType_RESPONSE:
nyatla 1:9f6a78395432 36 default:
nyatla 1:9f6a78395432 37 break;
nyatla 1:9f6a78395432 38 }
nyatla 1:9f6a78395432 39 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 40 }
nyatla 1:9f6a78395432 41
nyatla 1:9f6a78395432 42
nyatla 1:9f6a78395432 43
nyatla 1:9f6a78395432 44
nyatla 2:b96c1e90d120 45
nyatla 1:9f6a78395432 46
nyatla 1:9f6a78395432 47
nyatla 1:9f6a78395432 48
nyatla 1:9f6a78395432 49 /*
nyatla 1:9f6a78395432 50 文字コードの定義
nyatla 1:9f6a78395432 51 */
nyatla 1:9f6a78395432 52 #define HTTP_SP 0x20
nyatla 1:9f6a78395432 53 #define HTTP_LF 0x0A
nyatla 1:9f6a78395432 54 #define HTTP_CR 0x0D
nyatla 1:9f6a78395432 55 #define HTTP_DM ':'
nyatla 1:9f6a78395432 56
nyatla 1:9f6a78395432 57
nyatla 2:b96c1e90d120 58
nyatla 1:9f6a78395432 59
nyatla 1:9f6a78395432 60 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_Connection(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 61 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_ContentLength(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 62 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage1(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 63 static NyLPC_TcHttpBasicHeaderParser_ST parseVersion(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,NyLPC_TcHttpBasicHeaderParser_ST i_next,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 64 static NyLPC_TcHttpBasicHeaderParser_ST parseRequestUrl(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 65 static NyLPC_TcHttpBasicHeaderParser_ST parseMessageParam(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 66 static NyLPC_TcHttpBasicHeaderParser_ST parseStartLine(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 67 static NyLPC_TcHttpBasicHeaderParser_ST parseStatusCode(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 68 static NyLPC_TcHttpBasicHeaderParser_ST parseReason(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c);
nyatla 1:9f6a78395432 69 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_TransferEncoding(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 70
nyatla 1:9f6a78395432 71
nyatla 1:9f6a78395432 72 static NyLPC_TBool parseHttpVersionStr(NyLPC_TcStr_t* i_str,NyLPC_THttpVersion* o_out);
nyatla 1:9f6a78395432 73 static NyLPC_TBool parseRequestMethodStr(NyLPC_TcStr_t* i_str,NyLPC_THttpMethodType* o_out);
nyatla 1:9f6a78395432 74
nyatla 1:9f6a78395432 75 static NyLPC_TBool testHeader(struct NyLPC_THttpBasicHeader* i_header,NyLPC_TUInt16* o_error);
nyatla 1:9f6a78395432 76
nyatla 1:9f6a78395432 77
nyatla 1:9f6a78395432 78 /*----------------------------------------
nyatla 1:9f6a78395432 79 デフォルトハンドラ
nyatla 1:9f6a78395432 80 ----------------------------------------*/
nyatla 1:9f6a78395432 81
nyatla 1:9f6a78395432 82 static NyLPC_TBool default_message_handler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,const NyLPC_TChar* i_name,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 83 {
nyatla 1:9f6a78395432 84 (void)i_inst;
nyatla 1:9f6a78395432 85 (void)i_name;
nyatla 1:9f6a78395432 86 (void)i_c;
nyatla 1:9f6a78395432 87 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 88 }
nyatla 1:9f6a78395432 89 static NyLPC_TBool default_urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 90 {
nyatla 1:9f6a78395432 91 (void)i_inst;
nyatla 1:9f6a78395432 92 (void)i_c;
nyatla 1:9f6a78395432 93 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 94 }
nyatla 1:9f6a78395432 95 /**
nyatla 1:9f6a78395432 96 * デフォルトハンドラ
nyatla 1:9f6a78395432 97 */
nyatla 1:9f6a78395432 98 static const struct NyLPC_TcHttpBasicHeaderParser_Handler _default_handler=
nyatla 1:9f6a78395432 99 {
nyatla 2:b96c1e90d120 100 default_message_handler,
nyatla 2:b96c1e90d120 101 default_urlHandler
nyatla 1:9f6a78395432 102 };
nyatla 1:9f6a78395432 103
nyatla 1:9f6a78395432 104
nyatla 1:9f6a78395432 105
nyatla 1:9f6a78395432 106 /*----------------------------------------
nyatla 1:9f6a78395432 107 Public/Protected関数
nyatla 1:9f6a78395432 108 ----------------------------------------*/
nyatla 1:9f6a78395432 109
nyatla 1:9f6a78395432 110
nyatla 2:b96c1e90d120 111 void NyLPC_cHttpBasicHeaderParser_initialize(NyLPC_TcHttpBasicHeaderParser_t* i_inst,const struct NyLPC_TcHttpBasicHeaderParser_Handler* i_handler)
nyatla 1:9f6a78395432 112 {
nyatla 1:9f6a78395432 113 NyLPC_cStr_initialize(&(i_inst->_wsb),i_inst->_wsb_buf,NyLPC_cHttpBasicHeaderParser_SIZE_OF_WBS);
nyatla 2:b96c1e90d120 114 i_inst->_handler=(i_handler==NULL?&_default_handler:i_handler);
nyatla 2:b96c1e90d120 115 }
nyatla 2:b96c1e90d120 116
nyatla 2:b96c1e90d120 117 /**
nyatla 2:b96c1e90d120 118 * parserの初期化
nyatla 2:b96c1e90d120 119 */
nyatla 2:b96c1e90d120 120 void NyLPC_cHttpBasicHeaderParser_parseInit(NyLPC_TcHttpBasicHeaderParser_t* i_inst,struct NyLPC_THttpBasicHeader* o_out)
nyatla 2:b96c1e90d120 121 {
nyatla 2:b96c1e90d120 122 //出力構造体を初期化
nyatla 2:b96c1e90d120 123 o_out->connection=NyLPC_THttpMessgeHeader_Connection_NONE;
nyatla 2:b96c1e90d120 124 o_out->content_length=NyLPC_THttpContentLength_INVALID_LENGTH;
nyatla 2:b96c1e90d120 125 o_out->transfer_encoding=NyLPC_THttpMessgeHeader_TransferEncoding_NONE;
nyatla 2:b96c1e90d120 126 i_inst->_st=NyLPC_TcHttpBasicHeaderParser_ST_START;
nyatla 2:b96c1e90d120 127 }
nyatla 2:b96c1e90d120 128 /**
nyatla 2:b96c1e90d120 129 * parseCharがNyLPC_TcHttpBasicHeaderParser_ST_EOHを返却したらコールすること。
nyatla 2:b96c1e90d120 130 */
nyatla 2:b96c1e90d120 131 NyLPC_TBool NyLPC_cHttpBasicHeaderParser_parseFinish(NyLPC_TcHttpBasicHeaderParser_t* i_inst,struct NyLPC_THttpBasicHeader* o_out)
nyatla 2:b96c1e90d120 132 {
nyatla 2:b96c1e90d120 133 if(i_inst->_st!=NyLPC_TcHttpBasicHeaderParser_ST_EOH)
nyatla 2:b96c1e90d120 134 {
nyatla 2:b96c1e90d120 135 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 136 }
nyatla 2:b96c1e90d120 137 //整合性チェック
nyatla 2:b96c1e90d120 138 if(!testHeader(o_out,&i_inst->_rcode)){
nyatla 2:b96c1e90d120 139 i_inst->_st=NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 2:b96c1e90d120 140 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 141 }
nyatla 2:b96c1e90d120 142 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 143 }
nyatla 2:b96c1e90d120 144 /**
nyatla 2:b96c1e90d120 145 * 文字列をパースします。
nyatla 2:b96c1e90d120 146 * コール前にNyLPC_cHttpBasicHeaderParser_parseInitでパーサを開始してください。
nyatla 2:b96c1e90d120 147 * @return
nyatla 2:b96c1e90d120 148 * パースした文字列の長さ。-1の場合はエラー。
nyatla 2:b96c1e90d120 149 * TRUEの場合、NyLPC_cHttpBasicHeaderParser_getParseStatus関数で状態をチェックして、後続の処理を選択してください。
nyatla 2:b96c1e90d120 150 */
nyatla 2:b96c1e90d120 151 NyLPC_TInt32 NyLPC_cHttpBasicHeaderParser_parseChar(NyLPC_TcHttpBasicHeaderParser_t* i_inst,const NyLPC_TChar* i_c,NyLPC_TInt32 i_size,struct NyLPC_THttpBasicHeader* o_out)
nyatla 2:b96c1e90d120 152 {
nyatla 2:b96c1e90d120 153 int i;
nyatla 2:b96c1e90d120 154 NyLPC_TChar c;
nyatla 2:b96c1e90d120 155 //Errorチェック
nyatla 2:b96c1e90d120 156 if(NyLPC_TcHttpBasicHeaderParser_ST_ERROR==i_inst->_st)
nyatla 2:b96c1e90d120 157 {
nyatla 2:b96c1e90d120 158 return 0;
nyatla 2:b96c1e90d120 159 }
nyatla 2:b96c1e90d120 160 for(i=0;i<i_size;i++){
nyatla 2:b96c1e90d120 161 c=*(i_c+i);
nyatla 2:b96c1e90d120 162 switch(i_inst->_st)
nyatla 2:b96c1e90d120 163 {
nyatla 2:b96c1e90d120 164 case NyLPC_TcHttpBasicHeaderParser_ST_START:
nyatla 2:b96c1e90d120 165 i_inst->_st=parseStartLine(i_inst,c,o_out);
nyatla 2:b96c1e90d120 166 break;
nyatla 2:b96c1e90d120 167 case NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM:
nyatla 2:b96c1e90d120 168 i_inst->_st=parseMessageParam(i_inst,c,o_out);
nyatla 2:b96c1e90d120 169 break;
nyatla 2:b96c1e90d120 170 case NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD:
nyatla 2:b96c1e90d120 171 i_inst->_st=parseMessage1(i_inst,c,o_out);
nyatla 2:b96c1e90d120 172 break;
nyatla 2:b96c1e90d120 173 case NyLPC_TcHttpBasicHeaderParser_ST_RL_URL:
nyatla 2:b96c1e90d120 174 i_inst->_st=parseRequestUrl(i_inst,c,o_out);
nyatla 2:b96c1e90d120 175 break;
nyatla 2:b96c1e90d120 176 case NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION:
nyatla 2:b96c1e90d120 177 i_inst->_st=parseVersion(i_inst,c,NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD,o_out);
nyatla 2:b96c1e90d120 178 break;
nyatla 2:b96c1e90d120 179 case NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE:
nyatla 2:b96c1e90d120 180 i_inst->_st=parseStatusCode(i_inst,c,o_out);
nyatla 2:b96c1e90d120 181 break;
nyatla 2:b96c1e90d120 182 case NyLPC_TcHttpBasicHeaderParser_ST_SL_REASON:
nyatla 2:b96c1e90d120 183 i_inst->_st=parseReason(i_inst,c);
nyatla 2:b96c1e90d120 184 break;
nyatla 2:b96c1e90d120 185 case NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH:
nyatla 2:b96c1e90d120 186 i_inst->_st=parseMessage_ContentLength(i_inst,c,o_out);
nyatla 2:b96c1e90d120 187 break;
nyatla 2:b96c1e90d120 188 case NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION:
nyatla 2:b96c1e90d120 189 i_inst->_st=parseMessage_Connection(i_inst,c,o_out);
nyatla 2:b96c1e90d120 190 break;
nyatla 2:b96c1e90d120 191 case NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING:
nyatla 2:b96c1e90d120 192 i_inst->_st=parseMessage_TransferEncoding(i_inst,c,o_out);
nyatla 2:b96c1e90d120 193 break;
nyatla 2:b96c1e90d120 194 default:
nyatla 2:b96c1e90d120 195 i_inst->_rcode=500;
nyatla 2:b96c1e90d120 196 i_inst->_st=NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 2:b96c1e90d120 197 }
nyatla 2:b96c1e90d120 198 if(NyLPC_TcHttpBasicHeaderParser_ST_isError(i_inst->_st)){
nyatla 2:b96c1e90d120 199 //エラー起こしたら終了。
nyatla 2:b96c1e90d120 200 return i;
nyatla 2:b96c1e90d120 201 }else if(i_inst->_st==NyLPC_TcHttpBasicHeaderParser_ST_EOH){
nyatla 2:b96c1e90d120 202 //ヘッダ終端なら終了。
nyatla 2:b96c1e90d120 203 return i+1;
nyatla 2:b96c1e90d120 204 }
nyatla 2:b96c1e90d120 205 }
nyatla 2:b96c1e90d120 206 return i_size;
nyatla 2:b96c1e90d120 207 }
nyatla 2:b96c1e90d120 208
nyatla 2:b96c1e90d120 209
nyatla 1:9f6a78395432 210
nyatla 1:9f6a78395432 211 /**
nyatla 1:9f6a78395432 212 * ストリームから読み出して、パースします。
nyatla 2:b96c1e90d120 213 * コール前にNyLPC_cHttpBasicHeaderParser_parseInitでパーサを開始してください。
nyatla 2:b96c1e90d120 214 * @return
nyatla 2:b96c1e90d120 215 * FALSE-失敗/TRUE-成功
nyatla 2:b96c1e90d120 216 * 関数が成功した場合、NyLPC_cHttpBasicHeaderParser_parseFinishでパーサを閉じることが出来ます。
nyatla 1:9f6a78395432 217 */
nyatla 2:b96c1e90d120 218 NyLPC_TBool NyLPC_cHttpBasicHeaderParser_parseStream(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TcHttpStream_t* i_stream,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 219 {
nyatla 1:9f6a78395432 220 const char* rp_base;
nyatla 1:9f6a78395432 221 NyLPC_TInt32 rsize;
nyatla 1:9f6a78395432 222 for(;;){
nyatla 1:9f6a78395432 223 //タイムアウト付でストリームから読み出し。
nyatla 1:9f6a78395432 224 rsize=NyLPC_iHttpPtrStream_pread(i_stream,(const void**)(&rp_base));
nyatla 1:9f6a78395432 225 if(rsize<=0){
nyatla 1:9f6a78395432 226 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 227 }
nyatla 2:b96c1e90d120 228 rsize=NyLPC_cHttpBasicHeaderParser_parseChar(i_inst,rp_base,rsize,o_out);
nyatla 2:b96c1e90d120 229 if(i_inst->_st==NyLPC_TcHttpBasicHeaderParser_ST_ERROR){
nyatla 2:b96c1e90d120 230 //パース失敗
nyatla 2:b96c1e90d120 231 NyLPC_iHttpPtrStream_rseek(i_stream,rsize);
nyatla 2:b96c1e90d120 232 return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 233 }
nyatla 2:b96c1e90d120 234 if(i_inst->_st==NyLPC_TcHttpBasicHeaderParser_ST_EOH){
nyatla 1:9f6a78395432 235 //パース成功
nyatla 2:b96c1e90d120 236 NyLPC_iHttpPtrStream_rseek(i_stream,rsize);
nyatla 2:b96c1e90d120 237 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 238 }
nyatla 1:9f6a78395432 239 NyLPC_iHttpPtrStream_rseek(i_stream,(NyLPC_TUInt16)rsize);
nyatla 1:9f6a78395432 240 }
nyatla 1:9f6a78395432 241 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 242 }
nyatla 1:9f6a78395432 243
nyatla 1:9f6a78395432 244
nyatla 2:b96c1e90d120 245 ///**
nyatla 2:b96c1e90d120 246 // * ストリームから読み出して、パースします。
nyatla 2:b96c1e90d120 247 // */
nyatla 2:b96c1e90d120 248 //NyLPC_TBool NyLPC_cHttpBasicHeaderParser_parse(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TcHttpStream_t* i_stream,struct NyLPC_THttpBasicHeader* o_out)
nyatla 2:b96c1e90d120 249 //{
nyatla 2:b96c1e90d120 250 // NyLPC_TcHttpBasicHeaderParser_ST st;
nyatla 2:b96c1e90d120 251 // const char* rp_base;
nyatla 2:b96c1e90d120 252 // NyLPC_TInt32 rsize;
nyatla 2:b96c1e90d120 253 // char c;
nyatla 2:b96c1e90d120 254 // int i;
nyatla 2:b96c1e90d120 255 //
nyatla 2:b96c1e90d120 256 // //出力構造体を初期化
nyatla 2:b96c1e90d120 257 // st=NyLPC_TcHttpBasicHeaderParser_ST_START;
nyatla 2:b96c1e90d120 258 // o_out->connection=NyLPC_THttpMessgeHeader_Connection_NONE;
nyatla 2:b96c1e90d120 259 // o_out->content_length=NyLPC_THttpContentLength_INVALID_LENGTH;
nyatla 2:b96c1e90d120 260 // o_out->transfer_encoding=NyLPC_THttpMessgeHeader_TransferEncoding_NONE;
nyatla 2:b96c1e90d120 261 //
nyatla 2:b96c1e90d120 262 // for(;;){
nyatla 2:b96c1e90d120 263 // //タイムアウト付でストリームから読み出し。
nyatla 2:b96c1e90d120 264 // rsize=NyLPC_iHttpPtrStream_pread(i_stream,(const void**)(&rp_base));
nyatla 2:b96c1e90d120 265 // if(rsize<=0){
nyatla 2:b96c1e90d120 266 // return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 267 // }
nyatla 2:b96c1e90d120 268 // for(i=0;i<rsize;i++){
nyatla 2:b96c1e90d120 269 // c=*(rp_base+i);
nyatla 2:b96c1e90d120 270 // switch(st)
nyatla 2:b96c1e90d120 271 // {
nyatla 2:b96c1e90d120 272 // case NyLPC_TcHttpBasicHeaderParser_ST_START:
nyatla 2:b96c1e90d120 273 // st=parseStartLine(i_inst,c,o_out);
nyatla 2:b96c1e90d120 274 // break;
nyatla 2:b96c1e90d120 275 // case NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM:
nyatla 2:b96c1e90d120 276 // st=parseMessageParam(i_inst,c,o_out);
nyatla 2:b96c1e90d120 277 // break;
nyatla 2:b96c1e90d120 278 // case NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD:
nyatla 2:b96c1e90d120 279 // st=parseMessage1(i_inst,c,o_out);
nyatla 2:b96c1e90d120 280 // break;
nyatla 2:b96c1e90d120 281 // case NyLPC_TcHttpBasicHeaderParser_ST_RL_URL:
nyatla 2:b96c1e90d120 282 // st=parseRequestUrl(i_inst,c,o_out);
nyatla 2:b96c1e90d120 283 // break;
nyatla 2:b96c1e90d120 284 // case NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION:
nyatla 2:b96c1e90d120 285 // st=parseVersion(i_inst,c,NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD,o_out);
nyatla 2:b96c1e90d120 286 // break;
nyatla 2:b96c1e90d120 287 // case NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE:
nyatla 2:b96c1e90d120 288 // st=parseStatusCode(i_inst,c,o_out);
nyatla 2:b96c1e90d120 289 // break;
nyatla 2:b96c1e90d120 290 // case NyLPC_TcHttpBasicHeaderParser_ST_SL_REASON:
nyatla 2:b96c1e90d120 291 // st=parseReason(i_inst,c);
nyatla 2:b96c1e90d120 292 // break;
nyatla 2:b96c1e90d120 293 // case NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH:
nyatla 2:b96c1e90d120 294 // st=parseMessage_ContentLength(i_inst,c,o_out);
nyatla 2:b96c1e90d120 295 // break;
nyatla 2:b96c1e90d120 296 // case NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION:
nyatla 2:b96c1e90d120 297 // st=parseMessage_Connection(i_inst,c,o_out);
nyatla 2:b96c1e90d120 298 // break;
nyatla 2:b96c1e90d120 299 // case NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING:
nyatla 2:b96c1e90d120 300 // st=parseMessage_TransferEncoding(i_inst,c,o_out);
nyatla 2:b96c1e90d120 301 // break;
nyatla 2:b96c1e90d120 302 // default:
nyatla 2:b96c1e90d120 303 // i_inst->_rcode=500;
nyatla 2:b96c1e90d120 304 // st=NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 2:b96c1e90d120 305 // }
nyatla 2:b96c1e90d120 306 // //エラー起こしたら終了。
nyatla 2:b96c1e90d120 307 // if(NyLPC_TcHttpBasicHeaderParser_ST_isError(st)){
nyatla 2:b96c1e90d120 308 // return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 309 // }
nyatla 2:b96c1e90d120 310 // //パース成功
nyatla 2:b96c1e90d120 311 // if(st==NyLPC_TcHttpBasicHeaderParser_ST_EOH){
nyatla 2:b96c1e90d120 312 // //整合性チェック
nyatla 2:b96c1e90d120 313 // if(!testHeader(o_out,&i_inst->_rcode)){
nyatla 2:b96c1e90d120 314 // st=NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 2:b96c1e90d120 315 // return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 316 // }
nyatla 2:b96c1e90d120 317 // //シーク
nyatla 2:b96c1e90d120 318 // NyLPC_iHttpPtrStream_rseek(i_stream,i+1);
nyatla 2:b96c1e90d120 319 // return NyLPC_TBool_TRUE;
nyatla 2:b96c1e90d120 320 // }
nyatla 2:b96c1e90d120 321 // }
nyatla 2:b96c1e90d120 322 // //シーク
nyatla 2:b96c1e90d120 323 // NyLPC_iHttpPtrStream_rseek(i_stream,(NyLPC_TUInt16)rsize);
nyatla 2:b96c1e90d120 324 // }
nyatla 2:b96c1e90d120 325 // return NyLPC_TBool_FALSE;
nyatla 2:b96c1e90d120 326 //}
nyatla 2:b96c1e90d120 327
nyatla 2:b96c1e90d120 328
nyatla 1:9f6a78395432 329
nyatla 1:9f6a78395432 330 /*----------------------------------------
nyatla 1:9f6a78395432 331 private関数
nyatla 1:9f6a78395432 332 ----------------------------------------*/
nyatla 1:9f6a78395432 333 /**
nyatla 1:9f6a78395432 334 ヘッダの整合性をとる。
nyatla 1:9f6a78395432 335 */
nyatla 1:9f6a78395432 336 static NyLPC_TBool testHeader(struct NyLPC_THttpBasicHeader* i_header,NyLPC_TUInt16* o_error)
nyatla 1:9f6a78395432 337 {
nyatla 1:9f6a78395432 338 switch(i_header->startline.req.version){
nyatla 1:9f6a78395432 339 case NyLPC_THttpVersion_09:
nyatla 1:9f6a78395432 340 if(i_header->type==NyLPC_THttpHeaderType_REQUEST){
nyatla 1:9f6a78395432 341 //Requestの時だけmethodチェック
nyatla 1:9f6a78395432 342 //GETだけ
nyatla 1:9f6a78395432 343 if(i_header->startline.req.method!=NyLPC_THttpMethodType_GET){
nyatla 1:9f6a78395432 344 *o_error=400;
nyatla 1:9f6a78395432 345 break;
nyatla 1:9f6a78395432 346 }
nyatla 1:9f6a78395432 347 }
nyatla 1:9f6a78395432 348 //TEは受け付けない。
nyatla 1:9f6a78395432 349 if(i_header->transfer_encoding!=NyLPC_THttpMessgeHeader_TransferEncoding_NONE){
nyatla 1:9f6a78395432 350 *o_error=400;
nyatla 1:9f6a78395432 351 break;
nyatla 1:9f6a78395432 352 }
nyatla 1:9f6a78395432 353 //ContentLength=0,Connection=Closedに修正。
nyatla 1:9f6a78395432 354 i_header->content_length=0;
nyatla 1:9f6a78395432 355 i_header->connection=NyLPC_THttpMessgeHeader_Connection_CLOSE;
nyatla 1:9f6a78395432 356 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 357 case NyLPC_THttpVersion_10:
nyatla 1:9f6a78395432 358 //TEは受け付けない。
nyatla 1:9f6a78395432 359 if(i_header->transfer_encoding!=NyLPC_THttpMessgeHeader_TransferEncoding_NONE){
nyatla 1:9f6a78395432 360 *o_error=406;
nyatla 1:9f6a78395432 361 break;
nyatla 1:9f6a78395432 362 }
nyatla 1:9f6a78395432 363 //ContentLengthが無いときは0
nyatla 1:9f6a78395432 364 if(i_header->content_length==NyLPC_THttpContentLength_INVALID_LENGTH){
nyatla 1:9f6a78395432 365 i_header->content_length=0;
nyatla 1:9f6a78395432 366 }
nyatla 1:9f6a78395432 367 //Connection=Closedに修正。(1.0のKeepaliveは難しいから無視)
nyatla 1:9f6a78395432 368 i_header->connection=NyLPC_THttpMessgeHeader_Connection_CLOSE;
nyatla 1:9f6a78395432 369 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 370 case NyLPC_THttpVersion_11:
nyatla 1:9f6a78395432 371 if(i_header->content_length==NyLPC_THttpContentLength_INVALID_LENGTH){
nyatla 1:9f6a78395432 372 //Contentlength無しのChunked指定はOK
nyatla 1:9f6a78395432 373 if(i_header->transfer_encoding!=NyLPC_THttpMessgeHeader_TransferEncoding_CHUNKED){
nyatla 1:9f6a78395432 374 //Chunkedが無い場合はContent-Lengthは0と仮定
nyatla 1:9f6a78395432 375 i_header->content_length=0;
nyatla 1:9f6a78395432 376 }
nyatla 1:9f6a78395432 377 }
nyatla 1:9f6a78395432 378 //ContentLengthあるのにChunkedとは何事
nyatla 1:9f6a78395432 379 if(i_header->transfer_encoding!=NyLPC_THttpMessgeHeader_TransferEncoding_NONE){
nyatla 1:9f6a78395432 380 *o_error=400;
nyatla 1:9f6a78395432 381 break;
nyatla 1:9f6a78395432 382 }
nyatla 1:9f6a78395432 383 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 384 case NyLPC_THttpVersion_UNKNOWN:
nyatla 1:9f6a78395432 385 //おい馬鹿やめろ
nyatla 1:9f6a78395432 386 *o_error=505;
nyatla 1:9f6a78395432 387 break;
nyatla 1:9f6a78395432 388 default:
nyatla 1:9f6a78395432 389 *o_error=500;
nyatla 1:9f6a78395432 390 break;
nyatla 1:9f6a78395432 391 }
nyatla 1:9f6a78395432 392 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 393 }
nyatla 1:9f6a78395432 394
nyatla 1:9f6a78395432 395 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_TransferEncoding(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 396 {
nyatla 1:9f6a78395432 397
nyatla 1:9f6a78395432 398 //先頭のスペース除外
nyatla 1:9f6a78395432 399 if(NyLPC_cStr_len(&(i_inst->_wsb))==0){
nyatla 1:9f6a78395432 400 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 401 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING;//変化なし
nyatla 1:9f6a78395432 402 }
nyatla 1:9f6a78395432 403 }
nyatla 1:9f6a78395432 404 if(i_c==HTTP_CR){
nyatla 1:9f6a78395432 405 //CRの無視
nyatla 1:9f6a78395432 406 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING;//変化なし
nyatla 1:9f6a78395432 407 }else if(i_c==HTTP_LF){
nyatla 1:9f6a78395432 408 //大文字化
nyatla 1:9f6a78395432 409 NyLPC_cStr_toUpper(&(i_inst->_wsb));
nyatla 1:9f6a78395432 410 //close?
nyatla 1:9f6a78395432 411 o_out->transfer_encoding=NyLPC_cStr_isEqual(&(i_inst->_wsb),"CHUNKED")?NyLPC_THttpMessgeHeader_TransferEncoding_CHUNKED:NyLPC_THttpMessgeHeader_TransferEncoding_UNKNOWN;
nyatla 1:9f6a78395432 412 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 413 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;
nyatla 1:9f6a78395432 414 }
nyatla 1:9f6a78395432 415 if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){
nyatla 1:9f6a78395432 416 i_inst->_rcode=500;
nyatla 1:9f6a78395432 417 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 418 }
nyatla 1:9f6a78395432 419 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING;//変化なし;
nyatla 1:9f6a78395432 420 Error:
nyatla 1:9f6a78395432 421 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 422 }
nyatla 1:9f6a78395432 423
nyatla 1:9f6a78395432 424
nyatla 1:9f6a78395432 425 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_Connection(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 426 {
nyatla 1:9f6a78395432 427
nyatla 1:9f6a78395432 428 //先頭のスペース除外
nyatla 1:9f6a78395432 429 if(NyLPC_cStr_len(&(i_inst->_wsb))==0){
nyatla 1:9f6a78395432 430 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 431 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION;//変化なし
nyatla 1:9f6a78395432 432 }
nyatla 1:9f6a78395432 433 }
nyatla 1:9f6a78395432 434 if(i_c==HTTP_CR){
nyatla 1:9f6a78395432 435 //CRの無視
nyatla 1:9f6a78395432 436 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION;//変化なし
nyatla 1:9f6a78395432 437 }else if(i_c==HTTP_LF){
nyatla 1:9f6a78395432 438 //大文字化
nyatla 1:9f6a78395432 439 NyLPC_cStr_toUpper(&(i_inst->_wsb));
nyatla 1:9f6a78395432 440 //close?
nyatla 1:9f6a78395432 441 if(NyLPC_cStr_isEqual(&(i_inst->_wsb),"CLOSE")){
nyatla 1:9f6a78395432 442 o_out->connection=NyLPC_THttpMessgeHeader_Connection_CLOSE;
nyatla 1:9f6a78395432 443 }else if(NyLPC_cStr_isEqual(&(i_inst->_wsb),"KEEP-ALIVE")){
nyatla 1:9f6a78395432 444 o_out->connection=NyLPC_THttpMessgeHeader_Connection_KEEPALIVE;
nyatla 1:9f6a78395432 445 }else{
nyatla 1:9f6a78395432 446 o_out->connection=NyLPC_THttpMessgeHeader_Connection_UNKNOWN;
nyatla 1:9f6a78395432 447 }
nyatla 1:9f6a78395432 448 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 449 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;
nyatla 1:9f6a78395432 450 }
nyatla 1:9f6a78395432 451 if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){
nyatla 1:9f6a78395432 452 i_inst->_rcode=500;
nyatla 1:9f6a78395432 453 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 454 }
nyatla 1:9f6a78395432 455 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION;//変化なし;
nyatla 1:9f6a78395432 456 Error:
nyatla 1:9f6a78395432 457 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 458 }
nyatla 1:9f6a78395432 459
nyatla 1:9f6a78395432 460
nyatla 1:9f6a78395432 461 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_ContentLength(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 462 {
nyatla 1:9f6a78395432 463 char* e;
nyatla 1:9f6a78395432 464 char* p;
nyatla 1:9f6a78395432 465
nyatla 1:9f6a78395432 466 //先頭のスペース除外
nyatla 1:9f6a78395432 467 if(NyLPC_cStr_len(&(i_inst->_wsb))==0)
nyatla 1:9f6a78395432 468 {
nyatla 1:9f6a78395432 469 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 470 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH;//変化なし
nyatla 1:9f6a78395432 471 }
nyatla 1:9f6a78395432 472 }
nyatla 1:9f6a78395432 473 if(i_c==HTTP_CR){
nyatla 1:9f6a78395432 474 //CRの無視
nyatla 1:9f6a78395432 475 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH;//変化なし
nyatla 1:9f6a78395432 476 }else if(i_c==HTTP_LF){
nyatla 1:9f6a78395432 477 p=NyLPC_cStr_str(&(i_inst->_wsb));
nyatla 1:9f6a78395432 478 o_out->content_length=strtol(p,&e,10);
nyatla 1:9f6a78395432 479 if(e==p){
nyatla 1:9f6a78395432 480 i_inst->_rcode=400;
nyatla 1:9f6a78395432 481 NyLPC_OnErrorGoto(Error);//ギャー
nyatla 1:9f6a78395432 482 }
nyatla 1:9f6a78395432 483 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 484 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;
nyatla 1:9f6a78395432 485 }
nyatla 1:9f6a78395432 486 if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){
nyatla 1:9f6a78395432 487 i_inst->_rcode=500;
nyatla 1:9f6a78395432 488 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 489 }
nyatla 1:9f6a78395432 490 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH;//変化なし;
nyatla 1:9f6a78395432 491 Error:
nyatla 1:9f6a78395432 492 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 493 }
nyatla 1:9f6a78395432 494
nyatla 1:9f6a78395432 495 static NyLPC_TcHttpBasicHeaderParser_ST parseStatusCode(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 496 {
nyatla 1:9f6a78395432 497 NyLPC_TcStr_t* ws=&(i_inst->_wsb);
nyatla 1:9f6a78395432 498 char* e;
nyatla 1:9f6a78395432 499 char* p;
nyatla 1:9f6a78395432 500
nyatla 1:9f6a78395432 501 //先頭のスペース除外
nyatla 1:9f6a78395432 502 if(NyLPC_cStr_len(ws)==0)
nyatla 1:9f6a78395432 503 {
nyatla 1:9f6a78395432 504 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 505 return NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE;//変化なし
nyatla 1:9f6a78395432 506 }
nyatla 1:9f6a78395432 507 }
nyatla 1:9f6a78395432 508 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 509 //SPで終了
nyatla 1:9f6a78395432 510 p=NyLPC_cStr_str(ws);
nyatla 1:9f6a78395432 511 o_out->startline.res.status=(strtol(p,&e,10));
nyatla 1:9f6a78395432 512 if(e==p){
nyatla 1:9f6a78395432 513 i_inst->_rcode=400;
nyatla 1:9f6a78395432 514 NyLPC_OnErrorGoto(Error);//ギャー
nyatla 1:9f6a78395432 515 }
nyatla 1:9f6a78395432 516 NyLPC_cStr_clear(ws);
nyatla 1:9f6a78395432 517 return NyLPC_TcHttpBasicHeaderParser_ST_SL_REASON;
nyatla 1:9f6a78395432 518 }
nyatla 1:9f6a78395432 519 if(!NyLPC_cStr_put(ws,i_c)){
nyatla 1:9f6a78395432 520 i_inst->_rcode=500;
nyatla 1:9f6a78395432 521 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 522 }
nyatla 1:9f6a78395432 523 return NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE;//変化なし;
nyatla 1:9f6a78395432 524 Error:
nyatla 1:9f6a78395432 525 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 526 }
nyatla 1:9f6a78395432 527 static NyLPC_TcHttpBasicHeaderParser_ST parseReason(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c)
nyatla 1:9f6a78395432 528 {
nyatla 1:9f6a78395432 529 NyLPC_TcStr_t* ws=&(i_inst->_wsb);
nyatla 1:9f6a78395432 530 //LFくるまで飛ばす。
nyatla 1:9f6a78395432 531 switch(i_c){
nyatla 1:9f6a78395432 532 case HTTP_LF:
nyatla 1:9f6a78395432 533 NyLPC_cStr_clear(ws);
nyatla 1:9f6a78395432 534 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;
nyatla 1:9f6a78395432 535 default:
nyatla 1:9f6a78395432 536 break;
nyatla 1:9f6a78395432 537 }
nyatla 1:9f6a78395432 538 //URLパーサへ通知
nyatla 1:9f6a78395432 539 return NyLPC_TcHttpBasicHeaderParser_ST_SL_REASON;//変化なし
nyatla 1:9f6a78395432 540 }
nyatla 1:9f6a78395432 541 static NyLPC_TcHttpBasicHeaderParser_ST parseMessageParam(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 542 {
nyatla 1:9f6a78395432 543 NyLPC_TcStr_t* ws=&(i_inst->_wsb);
nyatla 1:9f6a78395432 544 //先頭のスペース除外
nyatla 1:9f6a78395432 545 if(NyLPC_cStr_len(ws)==0){
nyatla 1:9f6a78395432 546 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 547 return NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM;//変化なし
nyatla 1:9f6a78395432 548 }else{
nyatla 1:9f6a78395432 549 NyLPC_cStr_put(ws,'C');//開始フラグ
nyatla 1:9f6a78395432 550 }
nyatla 1:9f6a78395432 551 }
nyatla 1:9f6a78395432 552 switch(i_c){
nyatla 1:9f6a78395432 553 case HTTP_CR:
nyatla 1:9f6a78395432 554 return NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM;//変化なし
nyatla 1:9f6a78395432 555 case HTTP_LF:
nyatla 1:9f6a78395432 556 //メッセージフィールドの終端を通知
nyatla 1:9f6a78395432 557 if(!i_inst->_handler->messageHandler(i_inst,NULL,0,o_out)){
nyatla 1:9f6a78395432 558 i_inst->_rcode=500;
nyatla 1:9f6a78395432 559 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 560 }
nyatla 1:9f6a78395432 561 NyLPC_cStr_clear(ws);
nyatla 1:9f6a78395432 562 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;
nyatla 1:9f6a78395432 563 default:
nyatla 1:9f6a78395432 564 //メッセージフィールドの追記
nyatla 1:9f6a78395432 565 if(!i_inst->_handler->messageHandler(i_inst,NULL,i_c,o_out)){
nyatla 1:9f6a78395432 566 i_inst->_rcode=500;
nyatla 1:9f6a78395432 567 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 568 }
nyatla 1:9f6a78395432 569 break;
nyatla 1:9f6a78395432 570 }
nyatla 1:9f6a78395432 571 //URLパーサへ通知
nyatla 1:9f6a78395432 572 return NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM;//変化なし
nyatla 1:9f6a78395432 573 Error:
nyatla 1:9f6a78395432 574 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 575 }
nyatla 1:9f6a78395432 576
nyatla 1:9f6a78395432 577 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage1(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 578 {
nyatla 1:9f6a78395432 579 const static char* KNOWN_MSG[]={"CONNECTION","CONTENT-LENGTH","TRANSFER-ENCODING",NULL};
nyatla 1:9f6a78395432 580 int i;
nyatla 1:9f6a78395432 581
nyatla 1:9f6a78395432 582 switch(i_c){
nyatla 1:9f6a78395432 583 case HTTP_DM:
nyatla 1:9f6a78395432 584 //メッセージの名前確定。遷移先判定
nyatla 1:9f6a78395432 585 //ヘッダ名を大文字にする。
nyatla 1:9f6a78395432 586 NyLPC_cStr_toUpper(&(i_inst->_wsb));
nyatla 1:9f6a78395432 587 for(i=0;KNOWN_MSG[i]!=NULL;i++){
nyatla 1:9f6a78395432 588 if(NyLPC_cStr_isEqual(&(i_inst->_wsb),KNOWN_MSG[i])){
nyatla 1:9f6a78395432 589 //確定。
nyatla 1:9f6a78395432 590 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 591 switch(i){
nyatla 1:9f6a78395432 592 case 0://CONNECTION
nyatla 1:9f6a78395432 593 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION;
nyatla 1:9f6a78395432 594 case 1://CONTENT-LENGTH
nyatla 1:9f6a78395432 595 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH;
nyatla 1:9f6a78395432 596 case 2://TRANSFER-ENCODING
nyatla 1:9f6a78395432 597 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING;
nyatla 1:9f6a78395432 598 default://エラー
nyatla 1:9f6a78395432 599 break;
nyatla 1:9f6a78395432 600 }
nyatla 1:9f6a78395432 601 i_inst->_rcode=500;
nyatla 1:9f6a78395432 602 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 603 }
nyatla 1:9f6a78395432 604 }
nyatla 1:9f6a78395432 605 //メッセージフィールドの名前を通知
nyatla 1:9f6a78395432 606 if(!i_inst->_handler->messageHandler(i_inst,(NyLPC_TChar*)&(i_inst->_wsb),0,o_out)){
nyatla 1:9f6a78395432 607 i_inst->_rcode=500;
nyatla 1:9f6a78395432 608 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 609 }
nyatla 1:9f6a78395432 610 //カスタムヘッダ解析へ。
nyatla 1:9f6a78395432 611 return NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM;
nyatla 1:9f6a78395432 612 case HTTP_CR:
nyatla 1:9f6a78395432 613 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;//変化なし
nyatla 1:9f6a78395432 614 case HTTP_LF:
nyatla 1:9f6a78395432 615 //1文字で終了ならパースエンド。バリデーションチェックへ
nyatla 1:9f6a78395432 616 if(NyLPC_cStr_len(&(i_inst->_wsb))==0){
nyatla 1:9f6a78395432 617 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 618 return NyLPC_TcHttpBasicHeaderParser_ST_EOH;
nyatla 1:9f6a78395432 619 }
nyatla 1:9f6a78395432 620 //これはひどい。
nyatla 1:9f6a78395432 621 i_inst->_rcode=400;
nyatla 1:9f6a78395432 622 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 623 default:
nyatla 1:9f6a78395432 624 break;
nyatla 1:9f6a78395432 625 }
nyatla 1:9f6a78395432 626 if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){
nyatla 1:9f6a78395432 627 i_inst->_rcode=500;
nyatla 1:9f6a78395432 628 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 629 }
nyatla 1:9f6a78395432 630 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;//変化なし;
nyatla 1:9f6a78395432 631 Error:
nyatla 1:9f6a78395432 632 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 633 }
nyatla 1:9f6a78395432 634
nyatla 1:9f6a78395432 635 static NyLPC_TcHttpBasicHeaderParser_ST parseVersion(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,NyLPC_TcHttpBasicHeaderParser_ST i_next,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 636 {
nyatla 1:9f6a78395432 637 //先頭のスペース除外
nyatla 1:9f6a78395432 638 if(NyLPC_cStr_len(&(i_inst->_wsb))==0){
nyatla 1:9f6a78395432 639 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 640 return NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION;//変化なし
nyatla 1:9f6a78395432 641 }
nyatla 1:9f6a78395432 642 }
nyatla 1:9f6a78395432 643 if(i_c==HTTP_CR){
nyatla 1:9f6a78395432 644 //CRの無視
nyatla 1:9f6a78395432 645 return NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION;//変化なし
nyatla 1:9f6a78395432 646 }else if(i_c==HTTP_LF){
nyatla 1:9f6a78395432 647 //LFで確定
nyatla 1:9f6a78395432 648 if(!parseHttpVersionStr(&(i_inst->_wsb),&(o_out->startline.req.version))){
nyatla 1:9f6a78395432 649 i_inst->_rcode=505;
nyatla 1:9f6a78395432 650 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 651 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 652 }
nyatla 1:9f6a78395432 653 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 654 return i_next;//遷移(エラーの時はそのままエラーコードが渡る。)
nyatla 1:9f6a78395432 655 }
nyatla 1:9f6a78395432 656 if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){
nyatla 1:9f6a78395432 657 //追記処理しっぱい
nyatla 1:9f6a78395432 658 i_inst->_rcode=500;
nyatla 1:9f6a78395432 659 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 660 }
nyatla 1:9f6a78395432 661 return NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION;//変化なし
nyatla 1:9f6a78395432 662 Error:
nyatla 1:9f6a78395432 663 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 664 }
nyatla 1:9f6a78395432 665
nyatla 1:9f6a78395432 666 /**
nyatla 1:9f6a78395432 667 URLパーサ。登録した関数に転送する?
nyatla 1:9f6a78395432 668 */
nyatla 1:9f6a78395432 669 static NyLPC_TcHttpBasicHeaderParser_ST parseRequestUrl(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 670 {
nyatla 1:9f6a78395432 671 //先頭のスペース除外
nyatla 1:9f6a78395432 672 if(NyLPC_cStr_len(&(i_inst->_wsb))==0){
nyatla 1:9f6a78395432 673 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 674 return NyLPC_TcHttpBasicHeaderParser_ST_RL_URL;//変化なし
nyatla 1:9f6a78395432 675 }else{
nyatla 1:9f6a78395432 676 NyLPC_cStr_put(&(i_inst->_wsb),'C');//開始フラグ
nyatla 1:9f6a78395432 677 }
nyatla 1:9f6a78395432 678 }
nyatla 1:9f6a78395432 679 //次のスペースがくるまで。
nyatla 1:9f6a78395432 680 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 681 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 682 //URLハンドラへ通知
nyatla 1:9f6a78395432 683 if(!i_inst->_handler->urlHandler(i_inst,0,o_out)){
nyatla 1:9f6a78395432 684 i_inst->_rcode=500;
nyatla 1:9f6a78395432 685 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 686 }
nyatla 1:9f6a78395432 687 return NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION;
nyatla 1:9f6a78395432 688 }
nyatla 1:9f6a78395432 689 //URLパーサへ通知
nyatla 1:9f6a78395432 690 if(!i_inst->_handler->urlHandler(i_inst,i_c,o_out)){
nyatla 1:9f6a78395432 691 i_inst->_rcode=500;
nyatla 1:9f6a78395432 692 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 693 }
nyatla 1:9f6a78395432 694 return NyLPC_TcHttpBasicHeaderParser_ST_RL_URL;//変化なし
nyatla 1:9f6a78395432 695 Error:
nyatla 1:9f6a78395432 696 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 697 }
nyatla 1:9f6a78395432 698
nyatla 1:9f6a78395432 699 /**
nyatla 1:9f6a78395432 700 Methodパーサ
nyatla 1:9f6a78395432 701 [:HTTPMETHOD:]を得る。
nyatla 1:9f6a78395432 702 */
nyatla 1:9f6a78395432 703 static NyLPC_TcHttpBasicHeaderParser_ST parseStartLine(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 704 {
nyatla 1:9f6a78395432 705 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 706 //SPがデリミタ
nyatla 1:9f6a78395432 707 //HTTPステータスを試す。
nyatla 1:9f6a78395432 708 if(parseHttpVersionStr(&(i_inst->_wsb),&(o_out->startline.res.version))){
nyatla 1:9f6a78395432 709 //これはHTTPステータス
nyatla 1:9f6a78395432 710 o_out->type=NyLPC_THttpHeaderType_RESPONSE;
nyatla 1:9f6a78395432 711 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 712 return NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE;
nyatla 1:9f6a78395432 713 }
nyatla 1:9f6a78395432 714 //HTTPリクエストを試す。
nyatla 1:9f6a78395432 715 if(!parseRequestMethodStr(&(i_inst->_wsb),&(o_out->startline.req.method))){
nyatla 1:9f6a78395432 716 i_inst->_rcode=400;
nyatla 1:9f6a78395432 717 NyLPC_OnErrorGoto(ERROR);
nyatla 1:9f6a78395432 718 }
nyatla 1:9f6a78395432 719 //これはHTTPリクエスト
nyatla 1:9f6a78395432 720 o_out->type=NyLPC_THttpHeaderType_REQUEST;
nyatla 1:9f6a78395432 721 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 722 return NyLPC_TcHttpBasicHeaderParser_ST_RL_URL;
nyatla 1:9f6a78395432 723 }
nyatla 1:9f6a78395432 724 if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){
nyatla 1:9f6a78395432 725 i_inst->_rcode=500;
nyatla 1:9f6a78395432 726 NyLPC_OnErrorGoto(ERROR);
nyatla 1:9f6a78395432 727 }
nyatla 1:9f6a78395432 728 return NyLPC_TcHttpBasicHeaderParser_ST_START;//変化なし
nyatla 1:9f6a78395432 729 ERROR:
nyatla 1:9f6a78395432 730 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 731 }
nyatla 1:9f6a78395432 732
nyatla 1:9f6a78395432 733 static NyLPC_TBool parseRequestMethodStr(NyLPC_TcStr_t* i_str,NyLPC_THttpMethodType* o_out)
nyatla 1:9f6a78395432 734 {
nyatla 1:9f6a78395432 735 static const char* METHOD[]={
nyatla 1:9f6a78395432 736 "GET","POST","HEAD",NULL};
nyatla 1:9f6a78395432 737 static const NyLPC_THttpMethodType MT[]={
nyatla 1:9f6a78395432 738 NyLPC_THttpMethodType_GET,NyLPC_THttpMethodType_POST,NyLPC_THttpMethodType_HEAD,0x00};
nyatla 1:9f6a78395432 739 int i;
nyatla 1:9f6a78395432 740
nyatla 1:9f6a78395432 741 //解析処理
nyatla 1:9f6a78395432 742 for(i=0;METHOD[i]!=0x00;i++){
nyatla 1:9f6a78395432 743 NyLPC_cStr_toUpper(i_str);//大文字化
nyatla 1:9f6a78395432 744 if(NyLPC_cStr_isEqual(i_str,METHOD[i])){
nyatla 1:9f6a78395432 745 *o_out=MT[i];
nyatla 1:9f6a78395432 746 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 747 }
nyatla 1:9f6a78395432 748 }
nyatla 1:9f6a78395432 749 NyLPC_OnErrorGoto(ERROR);
nyatla 1:9f6a78395432 750 ERROR:
nyatla 1:9f6a78395432 751 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 752 }
nyatla 1:9f6a78395432 753
nyatla 1:9f6a78395432 754
nyatla 1:9f6a78395432 755
nyatla 1:9f6a78395432 756 static NyLPC_TBool parseHttpVersionStr(NyLPC_TcStr_t* i_str,NyLPC_THttpVersion* o_out)
nyatla 1:9f6a78395432 757 {
nyatla 1:9f6a78395432 758 NyLPC_TChar* p;
nyatla 1:9f6a78395432 759 char* e;
nyatla 1:9f6a78395432 760 long ma,mi;
nyatla 1:9f6a78395432 761
nyatla 1:9f6a78395432 762 p=NyLPC_cStr_str(i_str);
nyatla 1:9f6a78395432 763 if(NyLPC_cStr_len(i_str)<6){
nyatla 1:9f6a78395432 764 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 765 }
nyatla 1:9f6a78395432 766 if(strncmp(p,"HTTP/",5)!=0){
nyatla 1:9f6a78395432 767 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 768 }
nyatla 1:9f6a78395432 769 p+=5;
nyatla 1:9f6a78395432 770 ma=strtol(p,&e,10);
nyatla 1:9f6a78395432 771 if(p==e){
nyatla 1:9f6a78395432 772 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 773 }
nyatla 1:9f6a78395432 774 p=e;//.をチェック
nyatla 1:9f6a78395432 775 if(*p!='.'){
nyatla 1:9f6a78395432 776 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 777 }
nyatla 1:9f6a78395432 778 p++;
nyatla 1:9f6a78395432 779 mi=strtoul(p,&e,10);
nyatla 1:9f6a78395432 780 if(p==e){
nyatla 1:9f6a78395432 781 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 782 }
nyatla 1:9f6a78395432 783 if(ma<0 ||mi<0){
nyatla 1:9f6a78395432 784 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 785 }
nyatla 1:9f6a78395432 786 switch(ma){
nyatla 1:9f6a78395432 787 case 0:
nyatla 1:9f6a78395432 788 if(mi>=9){
nyatla 1:9f6a78395432 789 //HTTP0.9相当
nyatla 1:9f6a78395432 790 *o_out=NyLPC_THttpVersion_09;
nyatla 1:9f6a78395432 791 }
nyatla 1:9f6a78395432 792 break;
nyatla 1:9f6a78395432 793 case 1:
nyatla 1:9f6a78395432 794 if(mi==0){
nyatla 1:9f6a78395432 795 //HTTP1.0
nyatla 1:9f6a78395432 796 *o_out=NyLPC_THttpVersion_10;
nyatla 1:9f6a78395432 797 }else if(mi>=1){
nyatla 1:9f6a78395432 798 //HTTP1.1
nyatla 1:9f6a78395432 799 *o_out=NyLPC_THttpVersion_11;
nyatla 1:9f6a78395432 800 }else{
nyatla 1:9f6a78395432 801 *o_out=NyLPC_THttpVersion_UNKNOWN;
nyatla 1:9f6a78395432 802 }
nyatla 1:9f6a78395432 803 break;
nyatla 1:9f6a78395432 804 default:
nyatla 1:9f6a78395432 805 //お前など知らん
nyatla 1:9f6a78395432 806 *o_out=NyLPC_THttpVersion_UNKNOWN;
nyatla 1:9f6a78395432 807 break;
nyatla 1:9f6a78395432 808 }
nyatla 1:9f6a78395432 809 return NyLPC_TBool_TRUE;//変化なし
nyatla 1:9f6a78395432 810 Error:
nyatla 1:9f6a78395432 811 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 812 }