Patch title: Release 93 bulk changes
Abstract:
File: /protocol/http/chunked.pli
Key:
    Removed line
    Added line
   
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


type ChunkedStreamDriver
  field Link:Stream s
  field Int flags
  field Int read_remain ; field CBool read_eof
  field Int read_counter write_counter
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


type ChunkedStreamDriver
  field Link:Stream s
  field Int flags
  field Int read_remain ; field CBool read_eof
  field Int read_counter write_counter
  field CBool browser
StreamDriver maybe ChunkedStreamDriver



method drv read buf mini maxi -> red
  oarg_rw ChunkedStreamDriver drv ; arg Address buf ; arg In
  red := 0
  while red<mini
    if drv:read_eof
      return
    eif drv:read_remain>0
      drv:s read_available (var Address adr) (var Int size) 
      memory_copy adr (buf translate Byte red) size ; red +=
      drv read_counter += size
StreamDriver maybe ChunkedStreamDriver



method drv read buf mini maxi -> red
  oarg_rw ChunkedStreamDriver drv ; arg Address buf ; arg In
  red := 0
  while red<mini
    if drv:read_eof
      return
    eif drv:read_remain>0
      drv:s read_available (var Address adr) (var Int size) 
      memory_copy adr (buf translate Byte red) size ; red +=
      drv read_counter += size
    else
    eif drv:browser
      var Str l := drv:s readline
      if not (l parse word:"b" drv:read_remain)
        drv:read_remain=undefined
        drv:s unreadline l
    else # HTTP chunking
      if drv:read_remain<>undefined
        drv:s readline
      drv read_remain := unhexa drv:s:readline
      if drv:read_remain=0
        drv:s readline
      if drv:read_remain<=0
        drv read_eof := true


method drv write buf mini maxi -> written
  oarg_rw ChunkedStreamDriver drv ; arg Address buf ; arg In
      if drv:read_remain<>undefined
        drv:s readline
      drv read_remain := unhexa drv:s:readline
      if drv:read_remain=0
        drv:s readline
      if drv:read_remain<=0
        drv read_eof := true


method drv write buf mini maxi -> written
  oarg_rw ChunkedStreamDriver drv ; arg Address buf ; arg In
  drv:s writechars (string maxi "radix 16")+"[cr][lf]"
  drv:s raw_write buf maxi
  drv:s writechars "[cr][lf]"
  if drv:browser
    drv:s writechars "b "+string:maxi+"[lf]"
    drv:s raw_write buf maxi
  else
    drv:s writechars (string maxi "radix 16")+"[cr][lf]"
    drv:s raw_write buf maxi
    drv:s writechars "[cr][lf]"
  drv write_counter += maxi
  written := shunt drv:s=success maxi 0



method drv close -> status
  oarg_rw ChunkedStreamDriver drv ; arg ExtendedStatus statu
  if (drv:flags .and. out)<>0
  drv write_counter += maxi
  written := shunt drv:s=success maxi 0



method drv close -> status
  oarg_rw ChunkedStreamDriver drv ; arg ExtendedStatus statu
  if (drv:flags .and. out)<>0
    drv:s writechars "0[cr][lf]"
    drv:s writechars "[cr][lf]"
    if drv:browser
      void
    else
      drv:s writechars "0[cr][lf]"
      drv:s writechars "[cr][lf]"
  status := success



method fs open name options flags stream support -> status
  oarg_rw ChunkedFileSystem fs ; arg Str name options ; arg 
  var Link:Stream s
  if exists:support
    s :> support
  else
    var Link:Stream s :> new Stream
    s open name options (flags .and. in+out+safe)
    if s=failure
      return failure
  var Link:ChunkedStreamDriver drv :> new ChunkedStreamDrive
  drv s :> s
  drv flags := flags
  drv read_remain := undefined ; drv read_eof := false
  drv read_counter := 0
  drv write_counter := 0
  status := success



method fs open name options flags stream support -> status
  oarg_rw ChunkedFileSystem fs ; arg Str name options ; arg 
  var Link:Stream s
  if exists:support
    s :> support
  else
    var Link:Stream s :> new Stream
    s open name options (flags .and. in+out+safe)
    if s=failure
      return failure
  var Link:ChunkedStreamDriver drv :> new ChunkedStreamDrive
  drv s :> s
  drv flags := flags
  drv read_remain := undefined ; drv read_eof := false
  drv read_counter := 0
  drv write_counter := 0
  drv browser := options option "pliant_browser_chunking"
  stream stream_driver :> drv
  status := success



  stream stream_driver :> drv
  status := success