Hypersonic
view release on metacpan or search on metacpan
lib/Hypersonic/Stream.pm view on Meta::CPAN
->xs_end
->blank;
}
sub gen_xs_is_started {
my ($class, $builder) = @_;
$builder->xs_function('xs_stream_is_started')
->xs_preamble
->check_items(1, 1, '$stream->is_started')
->line('int fd = SvIV(SvRV(ST(0)));')
->if('stream_registry[fd].state >= STREAM_STATE_STARTED')
->line('XSRETURN_YES;')
->else
->line('XSRETURN_NO;')
->endif
->xs_end
->blank;
}
sub gen_xs_is_finished {
my ($class, $builder) = @_;
$builder->xs_function('xs_stream_is_finished')
->xs_preamble
->check_items(1, 1, '$stream->is_finished')
->line('int fd = SvIV(SvRV(ST(0)));')
->if('stream_registry[fd].state >= STREAM_STATE_FINISHED')
->line('XSRETURN_YES;')
->else
->line('XSRETURN_NO;')
->endif
->xs_end
->blank;
}
sub gen_xs_headers {
my ($class, $builder) = @_;
$builder->xs_function('xs_stream_headers')
->xs_preamble
->line('int fd = SvIV(SvRV(ST(0)));')
->line('StreamState* s = &stream_registry[fd];')
->blank
->if('s->state != STREAM_STATE_INIT')
->line('croak("Cannot set headers after streaming started");')
->endif
->blank
->if('items >= 2')
->line('s->status = SvIV(ST(1));')
->endif
->blank
->line('s->extra_headers[0] = \'\\0\';')
->if('items >= 3 && SvROK(ST(2)) && SvTYPE(SvRV(ST(2))) == SVt_PVHV')
->line('HV* hv = (HV*)SvRV(ST(2));')
->line('int extra_pos = 0;')
->blank
->comment('Extract Content-Type')
->line('SV** ct = hv_fetchs(hv, "Content-Type", 0);')
->if('!ct')
->line('ct = hv_fetchs(hv, "content-type", 0);')
->endif
->if('ct && *ct')
->line('STRLEN len;')
->line('const char* val = SvPV(*ct, len);')
->if('len < sizeof(s->content_type)')
->line('memcpy(s->content_type, val, len);')
->line('s->content_type[len] = \'\\0\';')
->endif
->endif
->blank
->comment('Extract other headers (Cache-Control, Connection, X-Accel-Buffering)')
->line('SV** cc = hv_fetchs(hv, "Cache-Control", 0);')
->if('cc && *cc')
->line('STRLEN len;')
->line('const char* val = SvPV(*cc, len);')
->line('extra_pos += snprintf(s->extra_headers + extra_pos,')
->line(' sizeof(s->extra_headers) - extra_pos, "Cache-Control: %s\\r\\n", val);')
->endif
->line('SV** conn = hv_fetchs(hv, "Connection", 0);')
->if('conn && *conn')
->line('STRLEN len;')
->line('const char* val = SvPV(*conn, len);')
->line('extra_pos += snprintf(s->extra_headers + extra_pos,')
->line(' sizeof(s->extra_headers) - extra_pos, "Connection: %s\\r\\n", val);')
->endif
->line('SV** xab = hv_fetchs(hv, "X-Accel-Buffering", 0);')
->if('xab && *xab')
->line('STRLEN len;')
->line('const char* val = SvPV(*xab, len);')
->line('extra_pos += snprintf(s->extra_headers + extra_pos,')
->line(' sizeof(s->extra_headers) - extra_pos, "X-Accel-Buffering: %s\\r\\n", val);')
->endif
->endif
->blank
->line('ST(0) = ST(0);')
->line('XSRETURN(1);')
->xs_end
->blank;
}
sub gen_xs_content_type {
my ($class, $builder) = @_;
$builder->xs_function('xs_stream_content_type')
->xs_preamble
->if('items != 2')
->line('croak("Usage: $stream->content_type(type)");')
->endif
->line('int fd = SvIV(SvRV(ST(0)));')
->line('StreamState* s = &stream_registry[fd];')
->blank
->if('s->state != STREAM_STATE_INIT')
->line('croak("Cannot set content_type after streaming started");')
->endif
->blank
->line('STRLEN len;')
->line('const char* ct = SvPV(ST(1), len);')
->if('len < sizeof(s->content_type)')
->line('memcpy(s->content_type, ct, len);')
->line('s->content_type[len] = \'\\0\';')
( run in 0.600 second using v1.01-cache-2.11-cpan-524268b4103 )