void XMLRPCResponder::completedRaw(U32 status, std::string const& reason, LLChannelDescriptors const& channels, buffer_ptr_t const& buffer) { if (mCode == CURLE_OK && !is_internal_http_error(status)) { mBufferSize = buffer->count(channels.in()); if (200 <= status && status < 400) { char* ptr = NULL; char* buf = NULL; LLMutexLock lock(buffer->getMutex()); LLBufferArray::const_segment_iterator_t const end = buffer->endSegment(); for (LLBufferArray::const_segment_iterator_t iter = buffer->beginSegment(); iter != end; ++iter) { LLSegment const& segment = *iter; if (segment.isOnChannel(channels.in())) { S32 const segment_size = segment.size(); if (!buf) { if (segment_size == mBufferSize) { // It's contiguous, no need for copying. mResponse = XMLRPC_REQUEST_FromXML((char const*)segment.data(), mBufferSize, NULL); break; } ptr = buf = new char [mBufferSize]; } llassert(ptr + segment_size <= buf + mBufferSize); memcpy(ptr, segment.data(), segment_size); ptr += segment_size; } } if (buf) { mResponse = XMLRPC_REQUEST_FromXML(buf, mBufferSize, NULL); delete [] buf; } } } }