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:
Fri Sep 27 12:47:51 2013 +0000
Revision:
58:03b89038b21a
Parent:
57:bc4330dfa62f
add classes; checked:modwebsocket; unchecked:tcpsocket,udpsocket,httpclient.;

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