//ws int ICACHE_FLASH_ATTR http_websocket_HANDSHAKE(http_connection *c){ http_reset_buffer(c); int ret = http_write(c," HTTP/1.1 101 Switching Protocols") && http_end_line(c) && http_end_headers(c); }
int ICACHE_FLASH_ATTR http_HEADER(http_connection *c,const char *header,const char *value){ NODE_DBG("Writing header: %s : %s",header,value); return http_write(c,header) && http_write(c,": ") && http_write(c,value) && http_end_line(c); }
int ICACHE_FLASH_ATTR http_response_STATUS(http_connection *c,const char * status){ return http_response_start(c) && http_write(c,status) && http_end_line(c) && //default headers http_HEADER(c,HTTP_SERVER,HTTP_DEFAULT_SERVER) && http_HEADER(c,HTTP_CONNECTION,"Close"); }
//REQUEST int ICACHE_FLASH_ATTR http_request_start(http_connection *c,const char *method,const char *path){ http_reset_buffer(c); int ret = http_write(c,method) && http_write(c," ") && http_write(c,path) && http_write(c," HTTP/1.0") && http_end_line(c) && http_HEADER(c,HTTP_CONNECTION,"Close"); NODE_DBG("Request: %s",c->output.buffer); }
static int http_find_next_line(char *s, int len, char **ret) { char *r, *e; for (e = s; len >= 2 && NULL == (r = http_end_line(e, len)); e++, len--); if (len >= 2) { *ret = r; return 0; } else { assert(len == 1 || len == 0); *ret = e+len; return 1; } }
inline static int get_http_version(char *s, int len, char **ret, int *minor_version) { char *c; char http_str[] = "HTTP/1."; int http_sz = sizeof(http_str)-1; // -1 for \n c = remove_whitespace(s, len); if (memcmp_fail_loc(c, http_str, len, http_sz, ret) || 0 == (len - (*ret-s))) { *minor_version = -1; return 1; } c += http_sz; *minor_version = ((int)*c) - (int)'0'; c++; if (http_end_line(c, len - (c-s))) c += 2; *ret = c; return 0; }
int ICACHE_FLASH_ATTR http_end_headers(http_connection *c){ //write cached headers int j=0; while(j< MAX_HEADERS){ if(c->output.headers[j].key!=NULL){ //write header http_HEADER(c,c->output.headers[j].key,c->output.headers[j].value); //free header os_free(c->output.headers[j].value); c->output.headers[j].value=NULL; c->output.headers[j].key=NULL; } j++; } //write final empty line return http_end_line(c); }