예제 #1
0
LIB_EXPORT
rc_t CC
XFS_HttpStreamRead_ZHR (
                    const struct XFSHttpStream * self,
                    void * Buffer,
                    size_t Size,
                    size_t * NumRead
)
{
    struct XFSHttpStream * Stream = ( struct XFSHttpStream * ) self;

    if ( NumRead != NULL ) {
        * NumRead = 0;
    }

    if ( Stream == NULL || Buffer == NULL || Size == 0 || NumRead == NULL ) {
        return XFS_RC ( rcNull );
    }

    if ( Stream -> last_error != 0 ) {
        return Stream -> last_error;
    }

    if ( Stream -> completed ) {
        * NumRead = 0;

        return 0;
    }

    if ( Stream -> str == NULL ) {
        _HttpStreamCloseInternals_ZHR ( Stream );

        Stream -> last_error = XFS_RC ( rcInvalid );

        return Stream -> last_error;
    }

    Stream -> last_error = KStreamRead ( 
                                    Stream -> str,
                                    Buffer,
                                    Size,
                                    NumRead
                                    );
    if ( Stream -> last_error == 0 ) {
        if ( * NumRead == 0 ) {
            _HttpStreamCloseInternals_ZHR ( Stream );

            Stream -> completed = true;
        }
    }
    else {
        _HttpStreamCloseInternals_ZHR ( Stream );
    }

    return self -> last_error;
}   /* XFS_HttpStreamRead_ZHR */
예제 #2
0
static
rc_t CC KBufferedStreamRead ( const KBufferedStream *cself,
    void *buffer, size_t bsize, size_t *num_read )
{
    KBufferedStream * self = ( KBufferedStream * ) cself;

    size_t avail = self -> in_limit - self -> in_marker;
    if ( avail == 0 )
    {
        size_t limit;
        rc_t rc = KStreamRead ( self -> in, self -> in_buffer, self -> buffer_size, & limit );
        if ( rc != 0 )
        {
            * num_read = 0;
            return rc;
        }

        self -> in_marker = 0;
        avail = self -> in_limit = limit;

        if ( limit == 0 )
        {
            * num_read = 0;
            return 0;
        }
    }

    if ( bsize > avail )
        bsize = avail;

    memcpy ( buffer, & self -> in_buffer [ self -> in_marker ], bsize );
    self -> in_marker += bsize;

    * num_read = bsize;
    return 0;
}
예제 #3
0
static rc_t CC KNSManagerNewReleaseVersionImpl(const struct KNSManager *self,
    SraReleaseVersion *newVersion)
{
    rc_t rc = 0;
    KDataBuffer result;
    KHttpRequest *req = NULL;
    KHttpResult *rslt = NULL;
    if (newVersion == NULL) {
        return RC(rcNS, rcArgv, rcAccessing, rcParam, rcNull);
    }
    memset(newVersion, 0, sizeof *newVersion);
    if (self == NULL) {
        return RC(rcNS, rcArgv, rcAccessing, rcSelf, rcNull);
    }
    memset(&result, 0, sizeof result);
    if (rc == 0) {
        rc = KNSManagerMakeRequest(self, &req, 0x01010000, NULL,
  "https://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/current/sratoolkit.current.version"
        );
    }
    if (rc == 0) {
        rc = KHttpRequestGET(req, &rslt);
    }
    if (rc == 0) {
        uint32_t code = 0;
        rc = KHttpResultStatus(rslt, &code, NULL, 0, NULL);
        if (rc == 0) {
            if (code != 200) {
                rc = RC(rcNS, rcFile, rcReading, rcFile, rcInvalid);
            }
        }
    }
    if (rc == 0) {
        size_t total = 0;
        KStream *response = NULL;
        rc = KHttpResultGetInputStream(rslt, &response);
        if (rc == 0) {
            rc = KDataBufferMakeBytes(&result, 1024);
        }
        while (rc == 0) {
            size_t num_read = 0;
            uint8_t *base = NULL;
            uint64_t avail = result.elem_count - total;
            if (avail < 256) {
                rc = KDataBufferResize(&result, result.elem_count + 1024);
                if (rc != 0) {
                    break;
                }
            }
            base = result.base;
            rc = KStreamRead(response, &base[total], result.elem_count - total,
                &num_read);
            if (num_read > 0 || rc != 0) {
                DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS), ("KStreamRead"
                    "(sratoolkit.current.version, %zu) = %R\n", num_read, rc));
            }
            if (rc != 0) {
                /* TBD - look more closely at rc */
                if (num_read > 0) {
                    rc = 0;
                }
                else {
                    break;
                }
            }
            if (num_read == 0) {
                break;
            }
            total += num_read;
        }
        RELEASE(KStream, response);
        if (rc == 0) {
            DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS),
                ("sratoolkit.current.version (%zu)\n", total));
            result.elem_count = total;
        }
    }

    if (rc == 0) {
        const char *start = (const void*)(result.base);
        size_t size = KDataBufferBytes(&result);
        DBGMSG(DBG_VFS, DBG_FLAG(DBG_VFS),
            ("sratoolkit.current.version = '%.*s'\n", (uint32_t)size, start));
        rc = SraReleaseVersionInit(newVersion, start, size);
    }

    KDataBufferWhack(&result);
    RELEASE(KHttpResult, rslt);
    RELEASE(KHttpRequest, req);

    return rc;
}