114
114
-------------------------------------------------------------------------*/
116
116
INKVConnInternal *
117
TransformProcessor::range_transform(ProxyMutex *mut, RangeRecord *ranges, bool unsatisfiable, int num_fields, HTTPHdr *transform_resp, const char * content_type, int content_type_len, int64_t content_length)
117
TransformProcessor::range_transform(ProxyMutex *mut, RangeRecord *ranges, int num_fields, HTTPHdr *transform_resp, const char * content_type, int content_type_len, int64_t content_length)
119
RangeTransform *range_transform = NEW(new RangeTransform(mut, ranges, unsatisfiable, num_fields, transform_resp, content_type, content_type_len, content_length));
119
RangeTransform *range_transform = NEW(new RangeTransform(mut, ranges, num_fields, transform_resp, content_type, content_type_len, content_length));
120
120
return range_transform;
729
729
/*-------------------------------------------------------------------------
730
730
-------------------------------------------------------------------------*/
732
RangeTransform::RangeTransform(ProxyMutex *mut, RangeRecord *ranges,bool unsatisfiable, int num_fields, HTTPHdr * transform_resp, const char * content_type, int content_type_len, int64_t content_length)
732
RangeTransform::RangeTransform(ProxyMutex *mut, RangeRecord *ranges, int num_fields, HTTPHdr * transform_resp, const char * content_type, int content_type_len, int64_t content_length)
733
733
: INKVConnInternal(NULL, reinterpret_cast<TSMutex>(mut)),
734
734
m_output_buf(NULL),
735
735
m_output_reader(NULL),
736
736
m_transform_resp(transform_resp),
737
737
m_output_vio(NULL),
738
m_unsatisfiable_range(unsatisfiable),
739
738
m_range_content_length(0),
740
739
m_num_range_fields(num_fields),
741
740
m_current_range(0), m_content_type(content_type), m_content_type_len(content_type_len), m_ranges(ranges), m_output_cl(content_length), m_done(0)
969
968
m_done += m_output_buf->write("\r\n", 2);
970
969
m_done += m_output_buf->write(cont_range, sizeof(cont_range) - 1);
972
snprintf(numbers, sizeof(numbers), "%" PRId64 "d-%" PRId64 "d/%" PRId64 "d", m_ranges[index]._start, m_ranges[index]._end, m_output_cl);
971
snprintf(numbers, sizeof(numbers), "%" PRId64 "-%" PRId64 "/%" PRId64 "", m_ranges[index]._start, m_ranges[index]._end, m_output_cl);
973
972
len = strlen(numbers);
974
973
if (len < RANGE_NUMBERS_LENGTH)
975
974
m_done += m_output_buf->write(numbers, len);
992
991
HTTPStatus status_code;
994
993
ink_release_assert(m_transform_resp);
995
ink_release_assert(m_transform_resp->field_find(MIME_FIELD_CONTENT_RANGE, MIME_LEN_CONTENT_RANGE) == NULL);
997
995
status_code = HTTP_STATUS_PARTIAL_CONTENT;
998
996
m_transform_resp->status_set(status_code);
999
997
reason_phrase = (char *) (http_hdr_reason_lookup(status_code));
1000
998
m_transform_resp->reason_set(reason_phrase, strlen(reason_phrase));
1002
// set the right Content-Type for multiple entry Range
1003
field = m_transform_resp->field_find(MIME_FIELD_CONTENT_TYPE, MIME_LEN_CONTENT_TYPE);
1006
m_transform_resp->field_delete(MIME_FIELD_CONTENT_TYPE, MIME_LEN_CONTENT_TYPE);
1009
field = m_transform_resp->field_create(MIME_FIELD_CONTENT_TYPE, MIME_LEN_CONTENT_TYPE);
1010
field->value_append(m_transform_resp->m_heap, m_transform_resp->m_mime, range_type, sizeof(range_type) - 1);
1012
m_transform_resp->field_attach(field);
1000
if (m_num_range_fields > 1) {
1001
// set the right Content-Type for multiple entry Range
1002
field = m_transform_resp->field_find(MIME_FIELD_CONTENT_TYPE, MIME_LEN_CONTENT_TYPE);
1005
m_transform_resp->field_delete(MIME_FIELD_CONTENT_TYPE, MIME_LEN_CONTENT_TYPE);
1008
field = m_transform_resp->field_create(MIME_FIELD_CONTENT_TYPE, MIME_LEN_CONTENT_TYPE);
1009
field->value_append(m_transform_resp->m_heap, m_transform_resp->m_mime, range_type, sizeof(range_type) - 1);
1011
m_transform_resp->field_attach(field);
1013
char numbers[RANGE_NUMBERS_LENGTH];
1014
m_transform_resp->field_delete(MIME_FIELD_CONTENT_RANGE, MIME_LEN_CONTENT_RANGE);
1015
field = m_transform_resp->field_create(MIME_FIELD_CONTENT_RANGE, MIME_LEN_CONTENT_RANGE);
1016
snprintf(numbers, sizeof(numbers), "bytes %" PRId64"-%" PRId64"/%" PRId64, m_ranges[0]._start, m_ranges[0]._end, m_output_cl);
1017
field->value_set(m_transform_resp->m_heap, m_transform_resp->m_mime, numbers, strlen(numbers));
1018
m_transform_resp->field_attach(field);
1016
1022
#undef RANGE_NUMBERS_LENGTH