static void main_thread(void *arg) { WAPEvent *e; WSPMachine *sm; WSP_PDU *pdu; while (run_status == running && (e = gwlist_consume(queue)) != NULL) { wap_event_assert(e); switch (e->type) { case TR_Invoke_Ind: pdu = wsp_pdu_unpack(e->u.TR_Invoke_Ind.user_data); if (pdu == NULL) { warning(0, "WSP: Broken PDU ignored."); wap_event_destroy(e); continue; } break; default: pdu = NULL; break; } sm = find_session_machine(e, pdu); if (sm == NULL) { wap_event_destroy(e); } else { handle_session_event(sm, e, pdu); } wsp_pdu_destroy(pdu); } }
static Octstr *make_connectreply_pdu(WSPMachine *m) { WSP_PDU *pdu; Octstr *os; List *caps; List *reply_headers; pdu = wsp_pdu_create(ConnectReply); pdu->u.ConnectReply.sessionid = m->session_id; caps = make_capabilities_reply(m); pdu->u.ConnectReply.capabilities = wsp_cap_pack_list(caps); wsp_cap_destroy_list(caps); reply_headers = make_reply_headers(m); pdu->u.ConnectReply.headers = wsp_headers_pack(reply_headers, 0, m->encoding_version); http_destroy_headers(reply_headers); os = wsp_pdu_pack(pdu); wsp_pdu_destroy(pdu); return os; }
/* * Feed an event to a WSP push client state machine. Do not report errors to * the caller. */ static void push_client_event_handle(WSPPushClientMachine *cpm, WAPEvent *e) { WAPEvent *wtp_event; WSP_PDU *pdu = NULL; wap_event_assert(e); gw_assert(cpm); if (e->type == TR_Invoke_Ind) { pdu = wsp_pdu_unpack(e->u.TR_Invoke_Ind.user_data); /* * Class 1 tests here * Case 4, no session matching address quadruplet, handled by the session mach- * ine. * Tests from table WSP, page 45. Case 5, a PDU state tables cannot handle. */ if (pdu == NULL || pdu->type != ConfirmedPush) { wap_event_destroy(e); wtp_event = send_abort_to_responder(cpm, PROTOERR); wtp_resp_dispatch_event(wtp_event); return; } } debug("wap.wsp", 0, "WSP_PUSH: WSPPushClientMachine %ld, state %s," " event %s", cpm->client_push_id, name_push_client_state(cpm->state), wap_event_name(e->type)); #define PUSH_CLIENT_STATE_NAME(state) #define ROW(push_state, event_type, condition, action, next_state) \ if (cpm->state == push_state && \ e->type == event_type && \ (condition)) { \ action \ cpm->state = next_state; \ debug("wap.wsp", 0, "WSP_PUSH %ld: new state %s", \ cpm->client_push_id, #next_state); \ } else #include "wsp_push_client_states.def" { error(0, "WSP_PUSH: handle_event: unhandled event!"); debug("wap.wsp", 0, "Unhandled event was:"); wap_event_dump(e); wap_event_destroy(e); return; } wsp_pdu_destroy(pdu); wap_event_destroy(e); if (cpm->state == PUSH_CLIENT_NULL_STATE) push_client_machine_destroy(cpm); }
/* * Pack contact points and application id list into sia content type. It is * defined in ota, p. 18. */ static Octstr *pack_sia(List *headers) { Octstr *sia_content; WSP_PDU *pdu; pdu = wsp_pdu_create(sia); pdu->u.sia.version = CURRENT_VERSION; pdu->u.sia.application_id_list = pack_appid_list(headers); pdu->u.sia.contactpoints = pack_server_address(); sia_content = wsp_pdu_pack(pdu); wsp_pdu_destroy(pdu); http_destroy_headers(headers); return sia_content; }
static Octstr *make_resume_reply_pdu(WSPMachine *m, List *headers) { WSP_PDU *pdu; Octstr *os; pdu = wsp_pdu_create(Reply); /* Not specified for Resume replies */ pdu->u.Reply.status = wsp_convert_http_status_to_wsp_status(HTTP_OK); if (headers == NULL) { headers = http_create_empty_headers(); pdu->u.Reply.headers = wsp_headers_pack(headers, 1, m->encoding_version); http_destroy_headers(headers); } else { pdu->u.Reply.headers = wsp_headers_pack(headers, 1, m->encoding_version); } pdu->u.Reply.data = octstr_create(""); os = wsp_pdu_pack(pdu); wsp_pdu_destroy(pdu); return os; }
int main(int argc, char **argv) { int i; Octstr *packet = NULL; Octstr *newpacket = NULL; WTP_PDU *pdu = NULL; Octstr *wsp_data = NULL; WSP_PDU *wsp = NULL; gwlib_init(); for (i = 1; i < argc; i++) { octstr_destroy(packet); packet = NULL; octstr_destroy(newpacket); newpacket = NULL; octstr_destroy(wsp_data); wsp_data = NULL; wtp_pdu_destroy(pdu); pdu = NULL; wsp_pdu_destroy(wsp); wsp = NULL; packet = octstr_read_file(argv[i]); pdu = wtp_pdu_unpack(packet); if (!pdu) { warning(0, "Unpacking PDU %s failed", argv[i]); continue; } debug("test", 0, "PDU %s:", argv[i]); wtp_pdu_dump(pdu, 0); newpacket = wtp_pdu_pack(pdu); if (!newpacket) { warning(0, "Repacking PDU %s failed", argv[i]); continue; } if (octstr_compare(packet, newpacket) != 0) { error(0, "Repacking PDU %s changed it", argv[i]); debug("test", 0, "Original:"); octstr_dump(packet, 1); debug("test", 0, "New:"); octstr_dump(newpacket, 1); continue; } if (pdu->type == Invoke) { wsp_data = pdu->u.Invoke.user_data; } else if (pdu->type == Result) { wsp_data = pdu->u.Result.user_data; } else { continue; } wsp_data = octstr_duplicate(wsp_data); wsp = wsp_pdu_unpack(wsp_data); if (!wsp) { warning(0, "Unpacking WSP data in %s failed", argv[i]); continue; } wsp_pdu_dump(wsp, 0); octstr_destroy(newpacket); newpacket = wsp_pdu_pack(wsp); if (!newpacket) { warning(0, "Repacking WSP data in %s failed", argv[i]); continue; } if (octstr_compare(wsp_data, newpacket) != 0) { error(0, "Repacking WSP data in %s changed it", argv[i]); debug("test", 0, "Original:"); octstr_dump(wsp_data, 1); debug("test", 0, "New:"); octstr_dump(newpacket, 1); continue; } } octstr_destroy(packet); octstr_destroy(newpacket); wtp_pdu_destroy(pdu); gwlib_shutdown(); return 0; }