« ESP8266でI2Cを使ってみる | トップページ | ESP8266のArduinoでvectorでエラーになる »

2015年7月10日 (金)

ESP8266のArduinoのSDWebServerがうまく動かない訳

ESP8266XのArduinoのSDWebServerがうまく動かない訳

Arduino IDE にESP8266のIDEをインストールするとサンプルスケッチに"SDWeServer"が追加されている。
このスケッチのssidとpasswordとSSを変更・定義すると動作するわけですが、上手く動作しません。
WebサーバーはSDカードのルートをWebのルートとして動作する。
その時SDWebServerがHTTPヘッダーのContent-Length、Connection、Access-Control-Allow-Originを返すようセットしているのですが、ESPWebServerのsend()は、このヘッダーを送った後自分でも独自に作って送るため2重に送信してしまう。
こおためFireFoxとChrmeでは表示できない。IEは表示できる。
Windows10のMicrosft Edgeも表示する。ヘッダーが異常なのに表示するんだ!セキュリティ大丈夫かな?

SDWebServerでヘッダーを返さないと長さ0のヘッダーになるのでエラーなしでFireFoxとChrmeとIEは何も表示しない。Edgeはテストしてない。

ESPWebServer.cppの

void ESP8266WebServer::sendHeader(String name, String value, bool first) {
  String headerLine = name;
  headerLine += ": ";
  headerLine += value;
  headerLine += "\r\n";

  if (first) {
    _responseHeaders = headerLine + _responseHeaders;
  }
  else {
    _responseHeaders += headerLine;
  }
}

で_responseHeadersに追加するとき、すでにあるnameの行を削除してから追加すればよい。

他にも上手く動かないのがある、IEだと動くのかなあ。

上記記事は Arduion IDE 1.6.4 に ESP8266 の 1.6.4-673-g8cd3697 で記述。ESPWebServer.cpp は以下のフォルダにある。

C:\Users\xxxxx\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.4-673-g8cd3697\libraries\ESP8266WebServer\src\ESPWebServer.cpp

2015/9/1 現在 Arduino IDE と ESP8266 をインストールすると Arduion IDE 1.6.5 に ESP8266 の 1.6.5-947-g39819f0 がインストールされる。この ESPWebServer.cpp では send() が修正されているが動作確認はまだです。

C:\Users\xxxxx\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-947-g39819f0\libraries\ESP8266WebServer\src\ESPWebServer.cpp

確認できたら追記します。・・・ で確認しました。

void ESP8266WebServer::send(int code, const char* content_type, const String& content) は sendHeader("Content-Length", len.c_str()); のみ対処している。

でした。これによりFierFoxでは動作することを確認しました。

« ESP8266でI2Cを使ってみる | トップページ | ESP8266のArduinoでvectorでエラーになる »

Arduino」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/569662/61866028

この記事へのトラックバック一覧です: ESP8266のArduinoのSDWebServerがうまく動かない訳:

« ESP8266でI2Cを使ってみる | トップページ | ESP8266のArduinoでvectorでエラーになる »