static int8_t on_post_wifi_request(uint8_t cid, GSwifi::GSREQUESTSTATE state) { if (state == GSwifi::GSREQUESTSTATE_BODY_START) { keys.clear(); return 0; } while (! gs.bufferEmpty()) { char letter = gs.bufferGet(); keys.put( letter ); } if (state == GSwifi::GSREQUESTSTATE_RECEIVED) { int8_t result = keys.putDone(); if (result != 0) { keys.clear(); gs.writeHead(cid, 400); } else { keys.dump(); keys.save(); gs.writeHead(cid, 200); } gs.writeEnd(); ring_put( &commands, COMMAND_CLOSE ); ring_put( &commands, cid ); if (result == 0) { gs.setRegDomain( keys.regdomain ); ring_put( &commands, COMMAND_CONNECT ); } } }
static int8_t on_post_messages_request(int8_t cid, GSwifi::GSREQUESTSTATE state) { while (! gs.bufferEmpty()) { char letter = gs.bufferGet(); parse_json( letter ); } if (state == GSwifi::GSREQUESTSTATE_RECEIVED) { // should be xmitting or idle (xmit finished) if (IrCtrl.state == IR_WRITING) { HTTPLOG_PRINTLN("!E7"); // invalid json gs.writeHead(cid, 400); gs.writeEnd(); } else { gs.writeHead(cid, 200); gs.writeEnd(); } ring_put( &commands, COMMAND_CLOSE ); ring_put( &commands, cid ); #ifdef USE_INTERNET TIMER_START( suspend_polling_timer, SUSPEND_GET_MESSAGES_INTERVAL ); #endif } return 0; }
static int8_t on_get_messages_response(int8_t cid, uint16_t status_code, GSwifi::GSREQUESTSTATE state) { HTTPLOG_PRINT(P("< G /m ")); HTTPLOG_PRINTLN(status_code); if (status_code != 200) { gs.bufferClear(); } switch (status_code) { case 200: while (! gs.bufferEmpty()) { char letter = gs.bufferGet(); parse_json( letter ); } if (state == GSwifi::GSREQUESTSTATE_RECEIVED) { // should not be WRITING here, should be XMITTING or IDLE (xmit finished) if (IrCtrl.state == IR_WRITING) { // prevent from locking in WRITING state forever IR_state( IR_IDLE ); } ring_put( &commands, COMMAND_CLOSE ); ring_put( &commands, cid ); if ((polling_cid == cid) || (polling_cid == CID_UNDEFINED)) { polling_cid = CID_UNDEFINED; ring_put( &commands, COMMAND_START_POLLING ); } // if polling_cid != cid // there's already an ongoing polling request, so request again when that one finishes } break; case HTTP_STATUSCODE_CLIENT_TIMEOUT: polling_cid = CID_UNDEFINED; ring_put( &commands, COMMAND_CLOSE ); ring_put( &commands, cid ); irkit_httpclient_start_polling( 5 ); break; case HTTP_STATUSCODE_DISCONNECT: polling_cid = CID_UNDEFINED; irkit_httpclient_start_polling( 5 ); break; // heroku responds with 503 if longer than 30sec, // or when deploy occurs case 503: default: if (state == GSwifi::GSREQUESTSTATE_RECEIVED) { ring_put( &commands, COMMAND_CLOSE ); ring_put( &commands, cid ); irkit_httpclient_start_polling( 5 ); } break; } return 0; }
static int8_t on_post_keys_response(int8_t cid, uint16_t status_code, GSwifi::GSREQUESTSTATE state) { HTTPLOG_PRINT(P("< P /k ")); HTTPLOG_PRINTLN(status_code); if (status_code != 200) { gs.bufferClear(); } if (state != GSwifi::GSREQUESTSTATE_RECEIVED) { return 0; } gs.writeHead( post_keys_cid, status_code ); switch (status_code) { case 200: while (! gs.bufferEmpty()) { char letter = gs.bufferGet(); gs.write( letter ); } gs.writeEnd(); break; default: gs.writeEnd(); break; } ring_put( &commands, COMMAND_CLOSE ); ring_put( &commands, cid ); ring_put( &commands, COMMAND_CLOSE ); if (ring_isfull( &commands )) { HTTPLOG_PRINTLN("!E8"); return -1; } ring_put( &commands, post_keys_cid ); return 0; }