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:
Mon Mar 25 05:23:49 2013 +0000
Revision:
1:9f6a78395432
Child:
2:b96c1e90d120
MiMic repository r191???

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 1:9f6a78395432 45 /**
nyatla 1:9f6a78395432 46 * HeaderParserのステータス定義値。
nyatla 1:9f6a78395432 47 */
nyatla 1:9f6a78395432 48 typedef NyLPC_TUInt8 NyLPC_TcHttpBasicHeaderParser_ST;
nyatla 1:9f6a78395432 49 #define NyLPC_TcHttpBasicHeaderParser_ST_START ((NyLPC_TcHttpBasicHeaderParser_ST)0x01)//HTTPステータスラインか、リクエストライン
nyatla 1:9f6a78395432 50 #define NyLPC_TcHttpBasicHeaderParser_ST_RL_URL ((NyLPC_TcHttpBasicHeaderParser_ST)0x12)//URL
nyatla 1:9f6a78395432 51 #define NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION ((NyLPC_TcHttpBasicHeaderParser_ST)0x13)//VERSION
nyatla 1:9f6a78395432 52 #define NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE ((NyLPC_TcHttpBasicHeaderParser_ST)0x21)//ステータスコード
nyatla 1:9f6a78395432 53 #define NyLPC_TcHttpBasicHeaderParser_ST_SL_REASON ((NyLPC_TcHttpBasicHeaderParser_ST)0x22)//Reason-Phrase
nyatla 1:9f6a78395432 54 #define NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD ((NyLPC_TcHttpBasicHeaderParser_ST)0x31)//MESSAGE
nyatla 1:9f6a78395432 55 #define NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM ((NyLPC_TcHttpBasicHeaderParser_ST)0x32)//MESSAGEパラメータ部
nyatla 1:9f6a78395432 56 #define NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH ((NyLPC_TcHttpBasicHeaderParser_ST)0x33)//MESSAGEContentLength
nyatla 1:9f6a78395432 57 #define NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION ((NyLPC_TcHttpBasicHeaderParser_ST)0x34)//MESSAGEConnection
nyatla 1:9f6a78395432 58 #define NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING ((NyLPC_TcHttpBasicHeaderParser_ST)0x35)//TransferEncoding
nyatla 1:9f6a78395432 59 #define NyLPC_TcHttpBasicHeaderParser_ST_MSG_RANGE ((NyLPC_TcHttpBasicHeaderParser_ST)0x36)//Range
nyatla 1:9f6a78395432 60 #define NyLPC_TcHttpBasicHeaderParser_ST_EOH ((NyLPC_TcHttpBasicHeaderParser_ST)0x7F)//終わり
nyatla 1:9f6a78395432 61 #define NyLPC_TcHttpBasicHeaderParser_ST_ERROR ((NyLPC_TcHttpBasicHeaderParser_ST)0x80)//終わり
nyatla 1:9f6a78395432 62
nyatla 1:9f6a78395432 63
nyatla 1:9f6a78395432 64
nyatla 1:9f6a78395432 65 /*
nyatla 1:9f6a78395432 66 文字コードの定義
nyatla 1:9f6a78395432 67 */
nyatla 1:9f6a78395432 68 #define HTTP_SP 0x20
nyatla 1:9f6a78395432 69 #define HTTP_LF 0x0A
nyatla 1:9f6a78395432 70 #define HTTP_CR 0x0D
nyatla 1:9f6a78395432 71 #define HTTP_DM ':'
nyatla 1:9f6a78395432 72
nyatla 1:9f6a78395432 73
nyatla 1:9f6a78395432 74 /*
nyatla 1:9f6a78395432 75 プライベート関数
nyatla 1:9f6a78395432 76 */
nyatla 1:9f6a78395432 77 #define NyLPC_TcHttpBasicHeaderParser_ST_isError(i_v) ((i_v)==NyLPC_TcHttpBasicHeaderParser_ST_ERROR)
nyatla 1:9f6a78395432 78
nyatla 1:9f6a78395432 79 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_Connection(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 80 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_ContentLength(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 81 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage1(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 82 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 83 static NyLPC_TcHttpBasicHeaderParser_ST parseRequestUrl(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 84 static NyLPC_TcHttpBasicHeaderParser_ST parseMessageParam(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 85 static NyLPC_TcHttpBasicHeaderParser_ST parseStartLine(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 86 static NyLPC_TcHttpBasicHeaderParser_ST parseStatusCode(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 87 static NyLPC_TcHttpBasicHeaderParser_ST parseReason(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c);
nyatla 1:9f6a78395432 88 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_TransferEncoding(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out);
nyatla 1:9f6a78395432 89
nyatla 1:9f6a78395432 90
nyatla 1:9f6a78395432 91 static NyLPC_TBool parseHttpVersionStr(NyLPC_TcStr_t* i_str,NyLPC_THttpVersion* o_out);
nyatla 1:9f6a78395432 92 static NyLPC_TBool parseRequestMethodStr(NyLPC_TcStr_t* i_str,NyLPC_THttpMethodType* o_out);
nyatla 1:9f6a78395432 93
nyatla 1:9f6a78395432 94 static NyLPC_TBool testHeader(struct NyLPC_THttpBasicHeader* i_header,NyLPC_TUInt16* o_error);
nyatla 1:9f6a78395432 95
nyatla 1:9f6a78395432 96
nyatla 1:9f6a78395432 97 /*----------------------------------------
nyatla 1:9f6a78395432 98 デフォルトハンドラ
nyatla 1:9f6a78395432 99 ----------------------------------------*/
nyatla 1:9f6a78395432 100
nyatla 1:9f6a78395432 101 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 102 {
nyatla 1:9f6a78395432 103 (void)i_inst;
nyatla 1:9f6a78395432 104 (void)i_name;
nyatla 1:9f6a78395432 105 (void)i_c;
nyatla 1:9f6a78395432 106 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 107 }
nyatla 1:9f6a78395432 108 static NyLPC_TBool default_urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 109 {
nyatla 1:9f6a78395432 110 (void)i_inst;
nyatla 1:9f6a78395432 111 (void)i_c;
nyatla 1:9f6a78395432 112 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 113 }
nyatla 1:9f6a78395432 114 /**
nyatla 1:9f6a78395432 115 * デフォルトハンドラ
nyatla 1:9f6a78395432 116 */
nyatla 1:9f6a78395432 117 static const struct NyLPC_TcHttpBasicHeaderParser_Handler _default_handler=
nyatla 1:9f6a78395432 118 {
nyatla 1:9f6a78395432 119 default_message_handler,
nyatla 1:9f6a78395432 120 default_urlHandler
nyatla 1:9f6a78395432 121 };
nyatla 1:9f6a78395432 122
nyatla 1:9f6a78395432 123
nyatla 1:9f6a78395432 124
nyatla 1:9f6a78395432 125 /*----------------------------------------
nyatla 1:9f6a78395432 126 Public/Protected関数
nyatla 1:9f6a78395432 127 ----------------------------------------*/
nyatla 1:9f6a78395432 128
nyatla 1:9f6a78395432 129
nyatla 1:9f6a78395432 130 void NyLPC_cHttpBasicHeaderParser_initialize(NyLPC_TcHttpBasicHeaderParser_t* i_inst)
nyatla 1:9f6a78395432 131 {
nyatla 1:9f6a78395432 132 NyLPC_cStr_initialize(&(i_inst->_wsb),i_inst->_wsb_buf,NyLPC_cHttpBasicHeaderParser_SIZE_OF_WBS);
nyatla 1:9f6a78395432 133 i_inst->_handler=&_default_handler;
nyatla 1:9f6a78395432 134 }
nyatla 1:9f6a78395432 135
nyatla 1:9f6a78395432 136 /**
nyatla 1:9f6a78395432 137 * ストリームから読み出して、パースします。
nyatla 1:9f6a78395432 138 */
nyatla 1:9f6a78395432 139 NyLPC_TBool NyLPC_cHttpBasicHeaderParser_parse(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TcHttpStream_t* i_stream,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 140 {
nyatla 1:9f6a78395432 141 NyLPC_TcHttpBasicHeaderParser_ST st;
nyatla 1:9f6a78395432 142 const char* rp_base;
nyatla 1:9f6a78395432 143 NyLPC_TInt32 rsize;
nyatla 1:9f6a78395432 144 char c;
nyatla 1:9f6a78395432 145 int i;
nyatla 1:9f6a78395432 146
nyatla 1:9f6a78395432 147 //出力構造体を初期化
nyatla 1:9f6a78395432 148 st=NyLPC_TcHttpBasicHeaderParser_ST_START;
nyatla 1:9f6a78395432 149 o_out->connection=NyLPC_THttpMessgeHeader_Connection_NONE;
nyatla 1:9f6a78395432 150 o_out->content_length=NyLPC_THttpContentLength_INVALID_LENGTH;
nyatla 1:9f6a78395432 151 o_out->transfer_encoding=NyLPC_THttpMessgeHeader_TransferEncoding_NONE;
nyatla 1:9f6a78395432 152
nyatla 1:9f6a78395432 153 for(;;){
nyatla 1:9f6a78395432 154 //タイムアウト付でストリームから読み出し。
nyatla 1:9f6a78395432 155 rsize=NyLPC_iHttpPtrStream_pread(i_stream,(const void**)(&rp_base));
nyatla 1:9f6a78395432 156 if(rsize<=0){
nyatla 1:9f6a78395432 157 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 158 }
nyatla 1:9f6a78395432 159 for(i=0;i<rsize;i++){
nyatla 1:9f6a78395432 160 c=*(rp_base+i);
nyatla 1:9f6a78395432 161 switch(st)
nyatla 1:9f6a78395432 162 {
nyatla 1:9f6a78395432 163 case NyLPC_TcHttpBasicHeaderParser_ST_START:
nyatla 1:9f6a78395432 164 st=parseStartLine(i_inst,c,o_out);
nyatla 1:9f6a78395432 165 break;
nyatla 1:9f6a78395432 166 case NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM:
nyatla 1:9f6a78395432 167 st=parseMessageParam(i_inst,c,o_out);
nyatla 1:9f6a78395432 168 break;
nyatla 1:9f6a78395432 169 case NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD:
nyatla 1:9f6a78395432 170 st=parseMessage1(i_inst,c,o_out);
nyatla 1:9f6a78395432 171 break;
nyatla 1:9f6a78395432 172 case NyLPC_TcHttpBasicHeaderParser_ST_RL_URL:
nyatla 1:9f6a78395432 173 st=parseRequestUrl(i_inst,c,o_out);
nyatla 1:9f6a78395432 174 break;
nyatla 1:9f6a78395432 175 case NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION:
nyatla 1:9f6a78395432 176 st=parseVersion(i_inst,c,NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD,o_out);
nyatla 1:9f6a78395432 177 break;
nyatla 1:9f6a78395432 178 case NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE:
nyatla 1:9f6a78395432 179 st=parseStatusCode(i_inst,c,o_out);
nyatla 1:9f6a78395432 180 break;
nyatla 1:9f6a78395432 181 case NyLPC_TcHttpBasicHeaderParser_ST_SL_REASON:
nyatla 1:9f6a78395432 182 st=parseReason(i_inst,c);
nyatla 1:9f6a78395432 183 break;
nyatla 1:9f6a78395432 184 case NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH:
nyatla 1:9f6a78395432 185 st=parseMessage_ContentLength(i_inst,c,o_out);
nyatla 1:9f6a78395432 186 break;
nyatla 1:9f6a78395432 187 case NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION:
nyatla 1:9f6a78395432 188 st=parseMessage_Connection(i_inst,c,o_out);
nyatla 1:9f6a78395432 189 break;
nyatla 1:9f6a78395432 190 case NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING:
nyatla 1:9f6a78395432 191 st=parseMessage_TransferEncoding(i_inst,c,o_out);
nyatla 1:9f6a78395432 192 break;
nyatla 1:9f6a78395432 193 default:
nyatla 1:9f6a78395432 194 i_inst->_rcode=500;
nyatla 1:9f6a78395432 195 st=NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 196 }
nyatla 1:9f6a78395432 197 //エラー起こしたら終了。
nyatla 1:9f6a78395432 198 if(NyLPC_TcHttpBasicHeaderParser_ST_isError(st)){
nyatla 1:9f6a78395432 199 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 200 }
nyatla 1:9f6a78395432 201 //パース成功
nyatla 1:9f6a78395432 202 if(st==NyLPC_TcHttpBasicHeaderParser_ST_EOH){
nyatla 1:9f6a78395432 203 //整合性チェック
nyatla 1:9f6a78395432 204 if(!testHeader(o_out,&i_inst->_rcode)){
nyatla 1:9f6a78395432 205 st=NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 206 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 207 }
nyatla 1:9f6a78395432 208 //シーク
nyatla 1:9f6a78395432 209 NyLPC_iHttpPtrStream_rseek(i_stream,i+1);
nyatla 1:9f6a78395432 210 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 211 }
nyatla 1:9f6a78395432 212 }
nyatla 1:9f6a78395432 213 //シーク
nyatla 1:9f6a78395432 214 NyLPC_iHttpPtrStream_rseek(i_stream,(NyLPC_TUInt16)rsize);
nyatla 1:9f6a78395432 215 }
nyatla 1:9f6a78395432 216 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 217 }
nyatla 1:9f6a78395432 218
nyatla 1:9f6a78395432 219
nyatla 1:9f6a78395432 220
nyatla 1:9f6a78395432 221 /*----------------------------------------
nyatla 1:9f6a78395432 222 private関数
nyatla 1:9f6a78395432 223 ----------------------------------------*/
nyatla 1:9f6a78395432 224 /**
nyatla 1:9f6a78395432 225 ヘッダの整合性をとる。
nyatla 1:9f6a78395432 226 */
nyatla 1:9f6a78395432 227 static NyLPC_TBool testHeader(struct NyLPC_THttpBasicHeader* i_header,NyLPC_TUInt16* o_error)
nyatla 1:9f6a78395432 228 {
nyatla 1:9f6a78395432 229 switch(i_header->startline.req.version){
nyatla 1:9f6a78395432 230 case NyLPC_THttpVersion_09:
nyatla 1:9f6a78395432 231 if(i_header->type==NyLPC_THttpHeaderType_REQUEST){
nyatla 1:9f6a78395432 232 //Requestの時だけmethodチェック
nyatla 1:9f6a78395432 233 //GETだけ
nyatla 1:9f6a78395432 234 if(i_header->startline.req.method!=NyLPC_THttpMethodType_GET){
nyatla 1:9f6a78395432 235 *o_error=400;
nyatla 1:9f6a78395432 236 break;
nyatla 1:9f6a78395432 237 }
nyatla 1:9f6a78395432 238 }
nyatla 1:9f6a78395432 239 //TEは受け付けない。
nyatla 1:9f6a78395432 240 if(i_header->transfer_encoding!=NyLPC_THttpMessgeHeader_TransferEncoding_NONE){
nyatla 1:9f6a78395432 241 *o_error=400;
nyatla 1:9f6a78395432 242 break;
nyatla 1:9f6a78395432 243 }
nyatla 1:9f6a78395432 244 //ContentLength=0,Connection=Closedに修正。
nyatla 1:9f6a78395432 245 i_header->content_length=0;
nyatla 1:9f6a78395432 246 i_header->connection=NyLPC_THttpMessgeHeader_Connection_CLOSE;
nyatla 1:9f6a78395432 247 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 248 case NyLPC_THttpVersion_10:
nyatla 1:9f6a78395432 249 //TEは受け付けない。
nyatla 1:9f6a78395432 250 if(i_header->transfer_encoding!=NyLPC_THttpMessgeHeader_TransferEncoding_NONE){
nyatla 1:9f6a78395432 251 *o_error=406;
nyatla 1:9f6a78395432 252 break;
nyatla 1:9f6a78395432 253 }
nyatla 1:9f6a78395432 254 //ContentLengthが無いときは0
nyatla 1:9f6a78395432 255 if(i_header->content_length==NyLPC_THttpContentLength_INVALID_LENGTH){
nyatla 1:9f6a78395432 256 i_header->content_length=0;
nyatla 1:9f6a78395432 257 }
nyatla 1:9f6a78395432 258 //Connection=Closedに修正。(1.0のKeepaliveは難しいから無視)
nyatla 1:9f6a78395432 259 i_header->connection=NyLPC_THttpMessgeHeader_Connection_CLOSE;
nyatla 1:9f6a78395432 260 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 261 case NyLPC_THttpVersion_11:
nyatla 1:9f6a78395432 262 if(i_header->content_length==NyLPC_THttpContentLength_INVALID_LENGTH){
nyatla 1:9f6a78395432 263 //Contentlength無しのChunked指定はOK
nyatla 1:9f6a78395432 264 if(i_header->transfer_encoding!=NyLPC_THttpMessgeHeader_TransferEncoding_CHUNKED){
nyatla 1:9f6a78395432 265 //Chunkedが無い場合はContent-Lengthは0と仮定
nyatla 1:9f6a78395432 266 i_header->content_length=0;
nyatla 1:9f6a78395432 267 }
nyatla 1:9f6a78395432 268 }
nyatla 1:9f6a78395432 269 //ContentLengthあるのにChunkedとは何事
nyatla 1:9f6a78395432 270 if(i_header->transfer_encoding!=NyLPC_THttpMessgeHeader_TransferEncoding_NONE){
nyatla 1:9f6a78395432 271 *o_error=400;
nyatla 1:9f6a78395432 272 break;
nyatla 1:9f6a78395432 273 }
nyatla 1:9f6a78395432 274 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 275 case NyLPC_THttpVersion_UNKNOWN:
nyatla 1:9f6a78395432 276 //おい馬鹿やめろ
nyatla 1:9f6a78395432 277 *o_error=505;
nyatla 1:9f6a78395432 278 break;
nyatla 1:9f6a78395432 279 default:
nyatla 1:9f6a78395432 280 *o_error=500;
nyatla 1:9f6a78395432 281 break;
nyatla 1:9f6a78395432 282 }
nyatla 1:9f6a78395432 283 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 284 }
nyatla 1:9f6a78395432 285
nyatla 1:9f6a78395432 286 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_TransferEncoding(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 287 {
nyatla 1:9f6a78395432 288
nyatla 1:9f6a78395432 289 //先頭のスペース除外
nyatla 1:9f6a78395432 290 if(NyLPC_cStr_len(&(i_inst->_wsb))==0){
nyatla 1:9f6a78395432 291 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 292 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING;//変化なし
nyatla 1:9f6a78395432 293 }
nyatla 1:9f6a78395432 294 }
nyatla 1:9f6a78395432 295 if(i_c==HTTP_CR){
nyatla 1:9f6a78395432 296 //CRの無視
nyatla 1:9f6a78395432 297 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING;//変化なし
nyatla 1:9f6a78395432 298 }else if(i_c==HTTP_LF){
nyatla 1:9f6a78395432 299 //大文字化
nyatla 1:9f6a78395432 300 NyLPC_cStr_toUpper(&(i_inst->_wsb));
nyatla 1:9f6a78395432 301 //close?
nyatla 1:9f6a78395432 302 o_out->transfer_encoding=NyLPC_cStr_isEqual(&(i_inst->_wsb),"CHUNKED")?NyLPC_THttpMessgeHeader_TransferEncoding_CHUNKED:NyLPC_THttpMessgeHeader_TransferEncoding_UNKNOWN;
nyatla 1:9f6a78395432 303 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 304 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;
nyatla 1:9f6a78395432 305 }
nyatla 1:9f6a78395432 306 if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){
nyatla 1:9f6a78395432 307 i_inst->_rcode=500;
nyatla 1:9f6a78395432 308 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 309 }
nyatla 1:9f6a78395432 310 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING;//変化なし;
nyatla 1:9f6a78395432 311 Error:
nyatla 1:9f6a78395432 312 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 313 }
nyatla 1:9f6a78395432 314
nyatla 1:9f6a78395432 315
nyatla 1:9f6a78395432 316 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_Connection(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 317 {
nyatla 1:9f6a78395432 318
nyatla 1:9f6a78395432 319 //先頭のスペース除外
nyatla 1:9f6a78395432 320 if(NyLPC_cStr_len(&(i_inst->_wsb))==0){
nyatla 1:9f6a78395432 321 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 322 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION;//変化なし
nyatla 1:9f6a78395432 323 }
nyatla 1:9f6a78395432 324 }
nyatla 1:9f6a78395432 325 if(i_c==HTTP_CR){
nyatla 1:9f6a78395432 326 //CRの無視
nyatla 1:9f6a78395432 327 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION;//変化なし
nyatla 1:9f6a78395432 328 }else if(i_c==HTTP_LF){
nyatla 1:9f6a78395432 329 //大文字化
nyatla 1:9f6a78395432 330 NyLPC_cStr_toUpper(&(i_inst->_wsb));
nyatla 1:9f6a78395432 331 //close?
nyatla 1:9f6a78395432 332 if(NyLPC_cStr_isEqual(&(i_inst->_wsb),"CLOSE")){
nyatla 1:9f6a78395432 333 o_out->connection=NyLPC_THttpMessgeHeader_Connection_CLOSE;
nyatla 1:9f6a78395432 334 }else if(NyLPC_cStr_isEqual(&(i_inst->_wsb),"KEEP-ALIVE")){
nyatla 1:9f6a78395432 335 o_out->connection=NyLPC_THttpMessgeHeader_Connection_KEEPALIVE;
nyatla 1:9f6a78395432 336 }else{
nyatla 1:9f6a78395432 337 o_out->connection=NyLPC_THttpMessgeHeader_Connection_UNKNOWN;
nyatla 1:9f6a78395432 338 }
nyatla 1:9f6a78395432 339 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 340 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;
nyatla 1:9f6a78395432 341 }
nyatla 1:9f6a78395432 342 if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){
nyatla 1:9f6a78395432 343 i_inst->_rcode=500;
nyatla 1:9f6a78395432 344 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 345 }
nyatla 1:9f6a78395432 346 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION;//変化なし;
nyatla 1:9f6a78395432 347 Error:
nyatla 1:9f6a78395432 348 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 349 }
nyatla 1:9f6a78395432 350
nyatla 1:9f6a78395432 351
nyatla 1:9f6a78395432 352 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage_ContentLength(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 353 {
nyatla 1:9f6a78395432 354 char* e;
nyatla 1:9f6a78395432 355 char* p;
nyatla 1:9f6a78395432 356
nyatla 1:9f6a78395432 357 //先頭のスペース除外
nyatla 1:9f6a78395432 358 if(NyLPC_cStr_len(&(i_inst->_wsb))==0)
nyatla 1:9f6a78395432 359 {
nyatla 1:9f6a78395432 360 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 361 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH;//変化なし
nyatla 1:9f6a78395432 362 }
nyatla 1:9f6a78395432 363 }
nyatla 1:9f6a78395432 364 if(i_c==HTTP_CR){
nyatla 1:9f6a78395432 365 //CRの無視
nyatla 1:9f6a78395432 366 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH;//変化なし
nyatla 1:9f6a78395432 367 }else if(i_c==HTTP_LF){
nyatla 1:9f6a78395432 368 p=NyLPC_cStr_str(&(i_inst->_wsb));
nyatla 1:9f6a78395432 369 o_out->content_length=strtol(p,&e,10);
nyatla 1:9f6a78395432 370 if(e==p){
nyatla 1:9f6a78395432 371 i_inst->_rcode=400;
nyatla 1:9f6a78395432 372 NyLPC_OnErrorGoto(Error);//ギャー
nyatla 1:9f6a78395432 373 }
nyatla 1:9f6a78395432 374 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 375 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;
nyatla 1:9f6a78395432 376 }
nyatla 1:9f6a78395432 377 if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){
nyatla 1:9f6a78395432 378 i_inst->_rcode=500;
nyatla 1:9f6a78395432 379 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 380 }
nyatla 1:9f6a78395432 381 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH;//変化なし;
nyatla 1:9f6a78395432 382 Error:
nyatla 1:9f6a78395432 383 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 384 }
nyatla 1:9f6a78395432 385
nyatla 1:9f6a78395432 386 static NyLPC_TcHttpBasicHeaderParser_ST parseStatusCode(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 387 {
nyatla 1:9f6a78395432 388 NyLPC_TcStr_t* ws=&(i_inst->_wsb);
nyatla 1:9f6a78395432 389 char* e;
nyatla 1:9f6a78395432 390 char* p;
nyatla 1:9f6a78395432 391
nyatla 1:9f6a78395432 392 //先頭のスペース除外
nyatla 1:9f6a78395432 393 if(NyLPC_cStr_len(ws)==0)
nyatla 1:9f6a78395432 394 {
nyatla 1:9f6a78395432 395 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 396 return NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE;//変化なし
nyatla 1:9f6a78395432 397 }
nyatla 1:9f6a78395432 398 }
nyatla 1:9f6a78395432 399 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 400 //SPで終了
nyatla 1:9f6a78395432 401 p=NyLPC_cStr_str(ws);
nyatla 1:9f6a78395432 402 o_out->startline.res.status=(strtol(p,&e,10));
nyatla 1:9f6a78395432 403 if(e==p){
nyatla 1:9f6a78395432 404 i_inst->_rcode=400;
nyatla 1:9f6a78395432 405 NyLPC_OnErrorGoto(Error);//ギャー
nyatla 1:9f6a78395432 406 }
nyatla 1:9f6a78395432 407 NyLPC_cStr_clear(ws);
nyatla 1:9f6a78395432 408 return NyLPC_TcHttpBasicHeaderParser_ST_SL_REASON;
nyatla 1:9f6a78395432 409 }
nyatla 1:9f6a78395432 410 if(!NyLPC_cStr_put(ws,i_c)){
nyatla 1:9f6a78395432 411 i_inst->_rcode=500;
nyatla 1:9f6a78395432 412 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 413 }
nyatla 1:9f6a78395432 414 return NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE;//変化なし;
nyatla 1:9f6a78395432 415 Error:
nyatla 1:9f6a78395432 416 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 417 }
nyatla 1:9f6a78395432 418 static NyLPC_TcHttpBasicHeaderParser_ST parseReason(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c)
nyatla 1:9f6a78395432 419 {
nyatla 1:9f6a78395432 420 NyLPC_TcStr_t* ws=&(i_inst->_wsb);
nyatla 1:9f6a78395432 421 //LFくるまで飛ばす。
nyatla 1:9f6a78395432 422 switch(i_c){
nyatla 1:9f6a78395432 423 case HTTP_LF:
nyatla 1:9f6a78395432 424 NyLPC_cStr_clear(ws);
nyatla 1:9f6a78395432 425 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;
nyatla 1:9f6a78395432 426 default:
nyatla 1:9f6a78395432 427 break;
nyatla 1:9f6a78395432 428 }
nyatla 1:9f6a78395432 429 //URLパーサへ通知
nyatla 1:9f6a78395432 430 return NyLPC_TcHttpBasicHeaderParser_ST_SL_REASON;//変化なし
nyatla 1:9f6a78395432 431 }
nyatla 1:9f6a78395432 432 static NyLPC_TcHttpBasicHeaderParser_ST parseMessageParam(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 433 {
nyatla 1:9f6a78395432 434 NyLPC_TcStr_t* ws=&(i_inst->_wsb);
nyatla 1:9f6a78395432 435 //先頭のスペース除外
nyatla 1:9f6a78395432 436 if(NyLPC_cStr_len(ws)==0){
nyatla 1:9f6a78395432 437 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 438 return NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM;//変化なし
nyatla 1:9f6a78395432 439 }else{
nyatla 1:9f6a78395432 440 NyLPC_cStr_put(ws,'C');//開始フラグ
nyatla 1:9f6a78395432 441 }
nyatla 1:9f6a78395432 442 }
nyatla 1:9f6a78395432 443 switch(i_c){
nyatla 1:9f6a78395432 444 case HTTP_CR:
nyatla 1:9f6a78395432 445 return NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM;//変化なし
nyatla 1:9f6a78395432 446 case HTTP_LF:
nyatla 1:9f6a78395432 447 //メッセージフィールドの終端を通知
nyatla 1:9f6a78395432 448 if(!i_inst->_handler->messageHandler(i_inst,NULL,0,o_out)){
nyatla 1:9f6a78395432 449 i_inst->_rcode=500;
nyatla 1:9f6a78395432 450 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 451 }
nyatla 1:9f6a78395432 452 NyLPC_cStr_clear(ws);
nyatla 1:9f6a78395432 453 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;
nyatla 1:9f6a78395432 454 default:
nyatla 1:9f6a78395432 455 //メッセージフィールドの追記
nyatla 1:9f6a78395432 456 if(!i_inst->_handler->messageHandler(i_inst,NULL,i_c,o_out)){
nyatla 1:9f6a78395432 457 i_inst->_rcode=500;
nyatla 1:9f6a78395432 458 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 459 }
nyatla 1:9f6a78395432 460 break;
nyatla 1:9f6a78395432 461 }
nyatla 1:9f6a78395432 462 //URLパーサへ通知
nyatla 1:9f6a78395432 463 return NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM;//変化なし
nyatla 1:9f6a78395432 464 Error:
nyatla 1:9f6a78395432 465 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 466 }
nyatla 1:9f6a78395432 467
nyatla 1:9f6a78395432 468 static NyLPC_TcHttpBasicHeaderParser_ST parseMessage1(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 469 {
nyatla 1:9f6a78395432 470 const static char* KNOWN_MSG[]={"CONNECTION","CONTENT-LENGTH","TRANSFER-ENCODING",NULL};
nyatla 1:9f6a78395432 471 int i;
nyatla 1:9f6a78395432 472
nyatla 1:9f6a78395432 473 switch(i_c){
nyatla 1:9f6a78395432 474 case HTTP_DM:
nyatla 1:9f6a78395432 475 //メッセージの名前確定。遷移先判定
nyatla 1:9f6a78395432 476 //ヘッダ名を大文字にする。
nyatla 1:9f6a78395432 477 NyLPC_cStr_toUpper(&(i_inst->_wsb));
nyatla 1:9f6a78395432 478 for(i=0;KNOWN_MSG[i]!=NULL;i++){
nyatla 1:9f6a78395432 479 if(NyLPC_cStr_isEqual(&(i_inst->_wsb),KNOWN_MSG[i])){
nyatla 1:9f6a78395432 480 //確定。
nyatla 1:9f6a78395432 481 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 482 switch(i){
nyatla 1:9f6a78395432 483 case 0://CONNECTION
nyatla 1:9f6a78395432 484 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONNECTION;
nyatla 1:9f6a78395432 485 case 1://CONTENT-LENGTH
nyatla 1:9f6a78395432 486 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_CONTENTLENGTH;
nyatla 1:9f6a78395432 487 case 2://TRANSFER-ENCODING
nyatla 1:9f6a78395432 488 return NyLPC_TcHttpBasicHeaderParser_ST_MSG_TRANSFERENCODING;
nyatla 1:9f6a78395432 489 default://エラー
nyatla 1:9f6a78395432 490 break;
nyatla 1:9f6a78395432 491 }
nyatla 1:9f6a78395432 492 i_inst->_rcode=500;
nyatla 1:9f6a78395432 493 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 494 }
nyatla 1:9f6a78395432 495 }
nyatla 1:9f6a78395432 496 //メッセージフィールドの名前を通知
nyatla 1:9f6a78395432 497 if(!i_inst->_handler->messageHandler(i_inst,(NyLPC_TChar*)&(i_inst->_wsb),0,o_out)){
nyatla 1:9f6a78395432 498 i_inst->_rcode=500;
nyatla 1:9f6a78395432 499 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 500 }
nyatla 1:9f6a78395432 501 //カスタムヘッダ解析へ。
nyatla 1:9f6a78395432 502 return NyLPC_TcHttpBasicHeaderParser_ST_MSGPARAM;
nyatla 1:9f6a78395432 503 case HTTP_CR:
nyatla 1:9f6a78395432 504 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;//変化なし
nyatla 1:9f6a78395432 505 case HTTP_LF:
nyatla 1:9f6a78395432 506 //1文字で終了ならパースエンド。バリデーションチェックへ
nyatla 1:9f6a78395432 507 if(NyLPC_cStr_len(&(i_inst->_wsb))==0){
nyatla 1:9f6a78395432 508 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 509 return NyLPC_TcHttpBasicHeaderParser_ST_EOH;
nyatla 1:9f6a78395432 510 }
nyatla 1:9f6a78395432 511 //これはひどい。
nyatla 1:9f6a78395432 512 i_inst->_rcode=400;
nyatla 1:9f6a78395432 513 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 514 default:
nyatla 1:9f6a78395432 515 break;
nyatla 1:9f6a78395432 516 }
nyatla 1:9f6a78395432 517 if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){
nyatla 1:9f6a78395432 518 i_inst->_rcode=500;
nyatla 1:9f6a78395432 519 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 520 }
nyatla 1:9f6a78395432 521 return NyLPC_TcHttpBasicHeaderParser_ST_MSGHEAD;//変化なし;
nyatla 1:9f6a78395432 522 Error:
nyatla 1:9f6a78395432 523 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 524 }
nyatla 1:9f6a78395432 525
nyatla 1:9f6a78395432 526 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 527 {
nyatla 1:9f6a78395432 528 //先頭のスペース除外
nyatla 1:9f6a78395432 529 if(NyLPC_cStr_len(&(i_inst->_wsb))==0){
nyatla 1:9f6a78395432 530 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 531 return NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION;//変化なし
nyatla 1:9f6a78395432 532 }
nyatla 1:9f6a78395432 533 }
nyatla 1:9f6a78395432 534 if(i_c==HTTP_CR){
nyatla 1:9f6a78395432 535 //CRの無視
nyatla 1:9f6a78395432 536 return NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION;//変化なし
nyatla 1:9f6a78395432 537 }else if(i_c==HTTP_LF){
nyatla 1:9f6a78395432 538 //LFで確定
nyatla 1:9f6a78395432 539 if(!parseHttpVersionStr(&(i_inst->_wsb),&(o_out->startline.req.version))){
nyatla 1:9f6a78395432 540 i_inst->_rcode=505;
nyatla 1:9f6a78395432 541 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 542 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 543 }
nyatla 1:9f6a78395432 544 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 545 return i_next;//遷移(エラーの時はそのままエラーコードが渡る。)
nyatla 1:9f6a78395432 546 }
nyatla 1:9f6a78395432 547 if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){
nyatla 1:9f6a78395432 548 //追記処理しっぱい
nyatla 1:9f6a78395432 549 i_inst->_rcode=500;
nyatla 1:9f6a78395432 550 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 551 }
nyatla 1:9f6a78395432 552 return NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION;//変化なし
nyatla 1:9f6a78395432 553 Error:
nyatla 1:9f6a78395432 554 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 555 }
nyatla 1:9f6a78395432 556
nyatla 1:9f6a78395432 557 /**
nyatla 1:9f6a78395432 558 URLパーサ。登録した関数に転送する?
nyatla 1:9f6a78395432 559 */
nyatla 1:9f6a78395432 560 static NyLPC_TcHttpBasicHeaderParser_ST parseRequestUrl(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 561 {
nyatla 1:9f6a78395432 562 //先頭のスペース除外
nyatla 1:9f6a78395432 563 if(NyLPC_cStr_len(&(i_inst->_wsb))==0){
nyatla 1:9f6a78395432 564 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 565 return NyLPC_TcHttpBasicHeaderParser_ST_RL_URL;//変化なし
nyatla 1:9f6a78395432 566 }else{
nyatla 1:9f6a78395432 567 NyLPC_cStr_put(&(i_inst->_wsb),'C');//開始フラグ
nyatla 1:9f6a78395432 568 }
nyatla 1:9f6a78395432 569 }
nyatla 1:9f6a78395432 570 //次のスペースがくるまで。
nyatla 1:9f6a78395432 571 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 572 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 573 //URLハンドラへ通知
nyatla 1:9f6a78395432 574 if(!i_inst->_handler->urlHandler(i_inst,0,o_out)){
nyatla 1:9f6a78395432 575 i_inst->_rcode=500;
nyatla 1:9f6a78395432 576 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 577 }
nyatla 1:9f6a78395432 578 return NyLPC_TcHttpBasicHeaderParser_ST_RL_VERSION;
nyatla 1:9f6a78395432 579 }
nyatla 1:9f6a78395432 580 //URLパーサへ通知
nyatla 1:9f6a78395432 581 if(!i_inst->_handler->urlHandler(i_inst,i_c,o_out)){
nyatla 1:9f6a78395432 582 i_inst->_rcode=500;
nyatla 1:9f6a78395432 583 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 584 }
nyatla 1:9f6a78395432 585 return NyLPC_TcHttpBasicHeaderParser_ST_RL_URL;//変化なし
nyatla 1:9f6a78395432 586 Error:
nyatla 1:9f6a78395432 587 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 588 }
nyatla 1:9f6a78395432 589
nyatla 1:9f6a78395432 590 /**
nyatla 1:9f6a78395432 591 Methodパーサ
nyatla 1:9f6a78395432 592 [:HTTPMETHOD:]を得る。
nyatla 1:9f6a78395432 593 */
nyatla 1:9f6a78395432 594 static NyLPC_TcHttpBasicHeaderParser_ST parseStartLine(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TChar i_c,struct NyLPC_THttpBasicHeader* o_out)
nyatla 1:9f6a78395432 595 {
nyatla 1:9f6a78395432 596 if(i_c==HTTP_SP){
nyatla 1:9f6a78395432 597 //SPがデリミタ
nyatla 1:9f6a78395432 598 //HTTPステータスを試す。
nyatla 1:9f6a78395432 599 if(parseHttpVersionStr(&(i_inst->_wsb),&(o_out->startline.res.version))){
nyatla 1:9f6a78395432 600 //これはHTTPステータス
nyatla 1:9f6a78395432 601 o_out->type=NyLPC_THttpHeaderType_RESPONSE;
nyatla 1:9f6a78395432 602 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 603 return NyLPC_TcHttpBasicHeaderParser_ST_SL_STATUSCODE;
nyatla 1:9f6a78395432 604 }
nyatla 1:9f6a78395432 605 //HTTPリクエストを試す。
nyatla 1:9f6a78395432 606 if(!parseRequestMethodStr(&(i_inst->_wsb),&(o_out->startline.req.method))){
nyatla 1:9f6a78395432 607 i_inst->_rcode=400;
nyatla 1:9f6a78395432 608 NyLPC_OnErrorGoto(ERROR);
nyatla 1:9f6a78395432 609 }
nyatla 1:9f6a78395432 610 //これはHTTPリクエスト
nyatla 1:9f6a78395432 611 o_out->type=NyLPC_THttpHeaderType_REQUEST;
nyatla 1:9f6a78395432 612 NyLPC_cStr_clear(&(i_inst->_wsb));
nyatla 1:9f6a78395432 613 return NyLPC_TcHttpBasicHeaderParser_ST_RL_URL;
nyatla 1:9f6a78395432 614 }
nyatla 1:9f6a78395432 615 if(!NyLPC_cStr_put(&(i_inst->_wsb),i_c)){
nyatla 1:9f6a78395432 616 i_inst->_rcode=500;
nyatla 1:9f6a78395432 617 NyLPC_OnErrorGoto(ERROR);
nyatla 1:9f6a78395432 618 }
nyatla 1:9f6a78395432 619 return NyLPC_TcHttpBasicHeaderParser_ST_START;//変化なし
nyatla 1:9f6a78395432 620 ERROR:
nyatla 1:9f6a78395432 621 return NyLPC_TcHttpBasicHeaderParser_ST_ERROR;
nyatla 1:9f6a78395432 622 }
nyatla 1:9f6a78395432 623
nyatla 1:9f6a78395432 624 static NyLPC_TBool parseRequestMethodStr(NyLPC_TcStr_t* i_str,NyLPC_THttpMethodType* o_out)
nyatla 1:9f6a78395432 625 {
nyatla 1:9f6a78395432 626 static const char* METHOD[]={
nyatla 1:9f6a78395432 627 "GET","POST","HEAD",NULL};
nyatla 1:9f6a78395432 628 static const NyLPC_THttpMethodType MT[]={
nyatla 1:9f6a78395432 629 NyLPC_THttpMethodType_GET,NyLPC_THttpMethodType_POST,NyLPC_THttpMethodType_HEAD,0x00};
nyatla 1:9f6a78395432 630 int i;
nyatla 1:9f6a78395432 631
nyatla 1:9f6a78395432 632 //解析処理
nyatla 1:9f6a78395432 633 for(i=0;METHOD[i]!=0x00;i++){
nyatla 1:9f6a78395432 634 NyLPC_cStr_toUpper(i_str);//大文字化
nyatla 1:9f6a78395432 635 if(NyLPC_cStr_isEqual(i_str,METHOD[i])){
nyatla 1:9f6a78395432 636 *o_out=MT[i];
nyatla 1:9f6a78395432 637 return NyLPC_TBool_TRUE;
nyatla 1:9f6a78395432 638 }
nyatla 1:9f6a78395432 639 }
nyatla 1:9f6a78395432 640 NyLPC_OnErrorGoto(ERROR);
nyatla 1:9f6a78395432 641 ERROR:
nyatla 1:9f6a78395432 642 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 643 }
nyatla 1:9f6a78395432 644
nyatla 1:9f6a78395432 645
nyatla 1:9f6a78395432 646
nyatla 1:9f6a78395432 647 static NyLPC_TBool parseHttpVersionStr(NyLPC_TcStr_t* i_str,NyLPC_THttpVersion* o_out)
nyatla 1:9f6a78395432 648 {
nyatla 1:9f6a78395432 649 NyLPC_TChar* p;
nyatla 1:9f6a78395432 650 char* e;
nyatla 1:9f6a78395432 651 long ma,mi;
nyatla 1:9f6a78395432 652
nyatla 1:9f6a78395432 653 p=NyLPC_cStr_str(i_str);
nyatla 1:9f6a78395432 654 if(NyLPC_cStr_len(i_str)<6){
nyatla 1:9f6a78395432 655 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 656 }
nyatla 1:9f6a78395432 657 if(strncmp(p,"HTTP/",5)!=0){
nyatla 1:9f6a78395432 658 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 659 }
nyatla 1:9f6a78395432 660 p+=5;
nyatla 1:9f6a78395432 661 ma=strtol(p,&e,10);
nyatla 1:9f6a78395432 662 if(p==e){
nyatla 1:9f6a78395432 663 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 664 }
nyatla 1:9f6a78395432 665 p=e;//.をチェック
nyatla 1:9f6a78395432 666 if(*p!='.'){
nyatla 1:9f6a78395432 667 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 668 }
nyatla 1:9f6a78395432 669 p++;
nyatla 1:9f6a78395432 670 mi=strtoul(p,&e,10);
nyatla 1:9f6a78395432 671 if(p==e){
nyatla 1:9f6a78395432 672 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 673 }
nyatla 1:9f6a78395432 674 if(ma<0 ||mi<0){
nyatla 1:9f6a78395432 675 NyLPC_OnErrorGoto(Error);
nyatla 1:9f6a78395432 676 }
nyatla 1:9f6a78395432 677 switch(ma){
nyatla 1:9f6a78395432 678 case 0:
nyatla 1:9f6a78395432 679 if(mi>=9){
nyatla 1:9f6a78395432 680 //HTTP0.9相当
nyatla 1:9f6a78395432 681 *o_out=NyLPC_THttpVersion_09;
nyatla 1:9f6a78395432 682 }
nyatla 1:9f6a78395432 683 break;
nyatla 1:9f6a78395432 684 case 1:
nyatla 1:9f6a78395432 685 if(mi==0){
nyatla 1:9f6a78395432 686 //HTTP1.0
nyatla 1:9f6a78395432 687 *o_out=NyLPC_THttpVersion_10;
nyatla 1:9f6a78395432 688 }else if(mi>=1){
nyatla 1:9f6a78395432 689 //HTTP1.1
nyatla 1:9f6a78395432 690 *o_out=NyLPC_THttpVersion_11;
nyatla 1:9f6a78395432 691 }else{
nyatla 1:9f6a78395432 692 *o_out=NyLPC_THttpVersion_UNKNOWN;
nyatla 1:9f6a78395432 693 }
nyatla 1:9f6a78395432 694 break;
nyatla 1:9f6a78395432 695 default:
nyatla 1:9f6a78395432 696 //お前など知らん
nyatla 1:9f6a78395432 697 *o_out=NyLPC_THttpVersion_UNKNOWN;
nyatla 1:9f6a78395432 698 break;
nyatla 1:9f6a78395432 699 }
nyatla 1:9f6a78395432 700 return NyLPC_TBool_TRUE;//変化なし
nyatla 1:9f6a78395432 701 Error:
nyatla 1:9f6a78395432 702 return NyLPC_TBool_FALSE;
nyatla 1:9f6a78395432 703 }
nyatla 1:9f6a78395432 704