Click here to Skip to main content
15,888,113 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I have a .NET web page with a html5 video player on in. The source of the video is a class that return partial range request. It works in desktop browsers and android, but it doesn't work on iOS devices.

What I have tried:

C#
Private Sub RangeDownload(fullpath As String, context As HttpContext)

        Dim size As Long
        Dim start As Long
        Dim theend As Long
        Dim length As Long
        Dim fp As Long = 0
        Using reader As New System.IO.StreamReader(fullpath)
            size = reader.BaseStream.Length
            start = 0
            theend = size - 1
            length = size
            '/ Now that we've gotten so far without errors we send the accept range header
            '* At the moment we only support single ranges.
            '* Multiple ranges requires some more work to ensure it works correctly
            '* and comply with the spesifications: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
            '*
            '* Multirange support annouces itself with:
            '* header('Accept-Ranges: bytes');
            '*
            '* Multirange content must be sent with multipart/byteranges mediatype,
            '* (mediatype = mimetype)
            '* as well as a boundry header to indicate the various chunks of data.
            '*/
            context.Response.AddHeader("Accept-Ranges", "0-" + size)
            '// header('Accept-Ranges: bytes')
            '// multipart/byteranges
            '// http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2

            If (Not String.IsNullOrEmpty(context.Request.ServerVariables("HTTP_RANGE"))) Then
                Dim anotherStart As Long = start
                Dim anotherEnd As Long = theend
                Dim arr_split As String() = context.Request.ServerVariables("HTTP_RANGE").Split("=") 'new char[] { Convert.ToChar("=") })
                Dim range As String = arr_split(1)

                '// Make sure the client hasn't sent us a multibyte range
                If (range.IndexOf(",") > -1) Then
                    '// (?) Shoud this be issued here, or should the first
                    '// range be used? Or should the header be ignored and
                    '// we output the whole content?
                    context.Response.AddHeader("Content-Range", "bytes " & start & "-" & theend & "/" & size)
                    Throw New HttpException(416, "Requested Range Not Satisfiable")
                End If

                '// If the range starts with an '-' we start from the beginning
                '// If not, we forward the file pointer
                '// And make sure to get the end byte if spesified
                If (range.StartsWith("-")) Then
                    '// The n-number of the last bytes is requested
                    anotherStart = size - Convert.ToInt64(range.Substring(1))
                Else
                    arr_split = range.Split("-")
                    anotherStart = Convert.ToInt64(arr_split(0))
                    Dim temp As Long = 0
                    If (arr_split.Length > 1 AndAlso Int64.TryParse(arr_split(1).ToString(), temp)) Then
                        anotherEnd = Convert.ToInt64(arr_split(1))
                    Else
                        anotherEnd = size
                    End If
                End If
                '/* Check the range and make sure it's treated according to the specs.
                ' * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
                ' */
                '// End bytes can not be larger than $end.
                If (anotherEnd > theend) Then
                    anotherEnd = theend
                Else
                    anotherEnd = anotherEnd
                End If
                '// Validate the requested range and return an error if it's not correct.
                If (anotherStart > anotherEnd Or anotherStart > size - 1 Or anotherEnd >= size) Then
                    context.Response.AddHeader("Content-Range", "bytes " + start + "-" + theend + "/" + size)
                    Throw New HttpException(416, "Requested Range Not Satisfiable")
                End If

                start = anotherStart
                theend = anotherEnd

                length = theend - start + 1 '// Calculate new content length
                fp = reader.BaseStream.Seek(start, System.IO.SeekOrigin.Begin)
                context.Response.StatusCode = 206
            End If
        End Using

        '// Notify the client the byte range we'll be outputting
        context.Response.AddHeader("Content-Range", "bytes " & start & "-" & theend & "/" & size)
        context.Response.AddHeader("Content-Length", length.ToString())
        '// Start buffered download
        context.Response.WriteFile(fullpath, fp, length)
        context.Response.End()
    End Sub
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900