ESP8266 webserver http标题与Content-Encoding有关

时间:2016-09-20 21:40:23

标签: http gzip esp8266

我遇到了gzip标头问题。我有ARduino Due + ESP8266 + SD卡屏蔽。我也在使用https://github.com/itead/ITEADLIB_Arduino_WeeESP8266/tree/develop有一个HTML文件被gzip压缩并保存在SD卡上。基本的Web服务器操作正在运行。我的问题是http标头。

ESP8266:

AT Version: 0.60.0.0(Jan 29 2016 15:10:17)
SDK version:1.5.2(7eee54f4)
Ai-Thinker Technology Co. Ltd

如果我不发送“Content-Encoding:gzip”,则会提供gzip压缩内容,但会显示为乱码文本。如果我发送gzip标头,那么在标头之后,ESP返回错误“链接无效”。它无法发送内容。

任何人都知道这里有什么问题?

有很多代码,大部分代码都在工作。以下是与此问题相关的相关部分。

在循环中,我检查是否有可用的客户端。如果有,那么我得到标题,获取文件名,并根据文件名和扩展名提供标题和内容。

发送标头的代码:

bool sendHeader(uint8_t mux_id,String header){
  byte plain[header.length()];
  header.getBytes(plain, header.length()+1);
  return (wifi.send(mux_id, plain, header.length()+1));
}

void code200(uint8_t mux_id, char* filename) {

  sendHeader(mux_id,"HTTP/1.1 200 OK\r\n");
  sendHeader(mux_id, "Access-Control-Allow-Origin: *\r\n");
  sendHeader(mux_id,"Content-Type: text/html\r\n");
  if (strstr(filename, "test.htm") != 0 ) {
    //No gzip header
  }
  else if ((strstr(filename, ".htm") != 0 || strstr(filename, ".css") != 0) && strstr(filename, "index") == 0) {
    sendHeader(mux_id,"Content-Encoding: gzip\r\n");
  }
  sendHeader(mux_id,"Cache-Control: no-cache\r\n");
  sendHeader(mux_id,"Connection: close\r\n");
  sendHeader(mux_id,"\r\n\r\n");

}

发送html内容的代码。

code200(mux_id, filename);// See above.
webFile = SD.open(filename);
if (webFile) {
  byte buff[512];
  uint32_t c;
  while (true) {
    int c = webFile.read((char*)buff, 512);
    if (!c)
      break;
      wifi.send(mux_id, buff,c );
  }
  webFile.close();
}
break;

0 个答案:

没有答案