/* kills the data */ static void stream_send_bytearr(liChunkQueue *out, guint8 type, guint16 requestid, GByteArray *data) { if (data->len > G_MAXUINT16) { stream_send_data(out, type, requestid, (const gchar*) data->data, data->len); g_byte_array_free(data, TRUE); } else { guint8 padlen = stream_send_fcgi_record(out, type, requestid, data->len); append_padding(data, padlen); li_chunkqueue_append_bytearr(out, data); } }
static void fastcgi_send_begin(fastcgi_connection *fcon) { GByteArray *buf = g_byte_array_sized_new(16); guint16 w; stream_build_fcgi_record(buf, FCGI_BEGIN_REQUEST, fcon->requestid, 8); w = htons(FCGI_RESPONDER); g_byte_array_append(buf, (const guint8*) &w, sizeof(w)); l_byte_array_append_c(buf, 0); /* TODO: FCGI_KEEP_CONN */ append_padding(buf, 5); li_chunkqueue_append_bytearr(fcon->fcgi_out, buf); }
static void stream_send_data(liChunkQueue *out, guint8 type, guint16 requestid, const gchar *data, size_t datalen) { while (datalen > 0) { guint16 tosend = (datalen > G_MAXUINT16) ? G_MAXUINT16 : datalen; guint8 padlen = stream_send_fcgi_record(out, type, requestid, tosend); GByteArray *tmpa = g_byte_array_sized_new(tosend + padlen); g_byte_array_append(tmpa, (const guint8*) data, tosend); append_padding(tmpa, padlen); li_chunkqueue_append_bytearr(out, tmpa); data += tosend; datalen -= tosend; } }
/* len != 0 */ static void http_chunk_append_len(liChunkQueue *cq, size_t len) { size_t i, olen = len, j; GByteArray *a; a = g_byte_array_sized_new(sizeof(len) * 2 + 2); for (i = 0; i < 8 && len; i++) { len >>= 4; } /* i is the number of hex digits we have */ g_byte_array_set_size(a, i); for (j = i, len = olen; j-- > 0; ) { a->data[j] = (len & 0xf) + (((len & 0xf) <= 9) ? '0' : 'a' - 10); len >>= 4; } g_byte_array_append(a, CONST_USTR_LEN("\r\n")); li_chunkqueue_append_bytearr(cq, a); }
/* returns padding length */ static guint8 stream_send_fcgi_record(liChunkQueue *out, guint8 type, guint16 requestid, guint16 datalen) { GByteArray *record = g_byte_array_sized_new(FCGI_HEADER_LEN); guint8 padlen = stream_build_fcgi_record(record, type, requestid, datalen); li_chunkqueue_append_bytearr(out, record); return padlen; }