Patch title: Replace minus with star in buttons encoding
Abstract:
File: /pliant/protocol/http/server.pli
Key:
    Removed line
    Added line
   
abstract
  [Pliant HTTP server implementation, according to RFC2616] 
  [This implementation also contains a very powerfull mecani



method request send_dynamic_file filename virtualpath -> sta
  arg_rw HttpRequest request ; arg Str filename virtualpath 
  var Link:DynamicPage sp :> request:server find_dynamic_pag
  if not exists:sp
    var Str err := request:server compile_dynamic_page filen
    if err<>""
      request send_simple_page "Bug in page "+request:path "
      return success
    sp :> request:server find_dynamic_page filename
  if not exists:sp
    return failure
  var Link:DynamicPage dp ; var Str context
abstract
  [Pliant HTTP server implementation, according to RFC2616] 
  [This implementation also contains a very powerfull mecani



method request send_dynamic_file filename virtualpath -> sta
  arg_rw HttpRequest request ; arg Str filename virtualpath 
  var Link:DynamicPage sp :> request:server find_dynamic_pag
  if not exists:sp
    var Str err := request:server compile_dynamic_page filen
    if err<>""
      request send_simple_page "Bug in page "+request:path "
      return success
    sp :> request:server find_dynamic_page filename
  if not exists:sp
    return failure
  var Link:DynamicPage dp ; var Str context
  if ("&"+request:form+"&"+request:encoded_options+"=" epars
  if ("&"+request:form+"&"+request:encoded_options+"=" eparse any "&button*" (var Int context_x) "*" (var Int context_y) "*" any:(var Str button) "*" any:(var Str scontext) "*" any:(var Str signature) "=" any)
    button := http_decode button
    context := request uncipher http_decode:scontext false
    signature := http_decode signature
    if (request check_signature button+" "+context signature
      void
    eif { context := request uncipher http_decode:scontext t
      void
    else
      request form := "" ; request encoded_options := ""
      request send_misc_answer "signature"
      return success # wrong signature
    dp :> request:server find_dynamic_page http_decode:butto
    if not exists:dp and (button parse any:(var Str modulena
      pliant_compiler_semaphore request
      pliant_load_module modulename+".pli" the_module:"/plia
      pliant_compiler_semaphore release
      dp :> request:server find_dynamic_page http_decode:but
    if not exists:dp and (button parse any:(var Str modulena
      request:server compile_dynamic_page modulename+".page"
      dp :> request:server find_dynamic_page http_decode:but
    if not exists:dp
      request form := "" ; request encoded_options := ""
      request send_misc_answer "obsolete"
      return success # there is no such button
  else
    dp :> sp
    context := ""
  request send_header "mime [dq]text/html; charset=iso-8859-
  (var HtmlPage page) bind request
  page file_name := dp filename
  page virtual_path := virtualpath
  check dp:function:nb_args=1
  if (dp:function arg 0):type=HtmlPage
    if not page:escape_html_page
      part execute "execute dynamic page "+filename
        page execute_style_setup sp:function
        page begin_end_hook_prototype page:begin_hook
        http_execute_dynamic_page page dp:function
        page begin_end_hook_prototype page:end_hook
    status := shunt request:answer_header_sent success failu
  eif { var Pointer:Type t :> unpointerto (dp:function arg 0
    var Str pc := "" ## section "copy context"
    var Address buf ; buf := memory_allocate t:size null
    t build_instance buf
    for (var Int i) 0 t:nb_fields-1
      var Pointer:TypeField tf :> t field i
      if tf:name="page"
        (buf translate Byte tf:offset) map Address := addres
      eif (tf:properties first "pliant editable")<>null and 
        value := replace (replace value "+" " ") "%0C%0A" "%
        pc += "&"+tf:name+"="+value
        from_string (buf translate Byte tf:offset) tf:type h
      eif ("&"+context+"&" eparse any (pattern "&"+tf:name+"
        pc += "&"+tf:name+"="+value
        if database and tf:type:is_data
          (buf translate Byte tf:offset) map Data_ := data_r
        else
          from_string (buf translate Byte tf:offset) tf:type
    var Str id := button
    request context_type :> t
    var Int pos_x := 0 ; var Int pos_y := 0
    var Str all := "&"+request:form+"&"
    while (all parse any "&_" any:(var Str variable) "=" any
      if variable="pliant_x"
        value parse pos_x
      eif variable="pliant_y"
        value parse pos_y
      else
        pc += "&_"+variable+"="+value
      all := "&"+remain
    button := http_decode button
    context := request uncipher http_decode:scontext false
    signature := http_decode signature
    if (request check_signature button+" "+context signature
      void
    eif { context := request uncipher http_decode:scontext t
      void
    else
      request form := "" ; request encoded_options := ""
      request send_misc_answer "signature"
      return success # wrong signature
    dp :> request:server find_dynamic_page http_decode:butto
    if not exists:dp and (button parse any:(var Str modulena
      pliant_compiler_semaphore request
      pliant_load_module modulename+".pli" the_module:"/plia
      pliant_compiler_semaphore release
      dp :> request:server find_dynamic_page http_decode:but
    if not exists:dp and (button parse any:(var Str modulena
      request:server compile_dynamic_page modulename+".page"
      dp :> request:server find_dynamic_page http_decode:but
    if not exists:dp
      request form := "" ; request encoded_options := ""
      request send_misc_answer "obsolete"
      return success # there is no such button
  else
    dp :> sp
    context := ""
  request send_header "mime [dq]text/html; charset=iso-8859-
  (var HtmlPage page) bind request
  page file_name := dp filename
  page virtual_path := virtualpath
  check dp:function:nb_args=1
  if (dp:function arg 0):type=HtmlPage
    if not page:escape_html_page
      part execute "execute dynamic page "+filename
        page execute_style_setup sp:function
        page begin_end_hook_prototype page:begin_hook
        http_execute_dynamic_page page dp:function
        page begin_end_hook_prototype page:end_hook
    status := shunt request:answer_header_sent success failu
  eif { var Pointer:Type t :> unpointerto (dp:function arg 0
    var Str pc := "" ## section "copy context"
    var Address buf ; buf := memory_allocate t:size null
    t build_instance buf
    for (var Int i) 0 t:nb_fields-1
      var Pointer:TypeField tf :> t field i
      if tf:name="page"
        (buf translate Byte tf:offset) map Address := addres
      eif (tf:properties first "pliant editable")<>null and 
        value := replace (replace value "+" " ") "%0C%0A" "%
        pc += "&"+tf:name+"="+value
        from_string (buf translate Byte tf:offset) tf:type h
      eif ("&"+context+"&" eparse any (pattern "&"+tf:name+"
        pc += "&"+tf:name+"="+value
        if database and tf:type:is_data
          (buf translate Byte tf:offset) map Data_ := data_r
        else
          from_string (buf translate Byte tf:offset) tf:type
    var Str id := button
    request context_type :> t
    var Int pos_x := 0 ; var Int pos_y := 0
    var Str all := "&"+request:form+"&"
    while (all parse any "&_" any:(var Str variable) "=" any
      if variable="pliant_x"
        value parse pos_x
      eif variable="pliant_y"
        value parse pos_y
      else
        pc += "&_"+variable+"="+value
      all := "&"+remain
    request context := "button-"+string:pos_x+"-"+string:pos
    request context := "button*"+string:pos_x+"*"+string:pos_y+"*"+http_encode:id+"*"+(request cipher pc)+"*"+(request generate_signature id+" "+pc)
    if not page:escape_html_page
      request:log trace "execute "+dp:position
      part execute "execute dynamic page "+dp:position
        page execute_style_setup sp:function
        page begin_end_hook_prototype page:begin_hook
        http_execute_dynamic_sub_page buf dp:function
        page begin_end_hook_prototype page:end_hook
    t destroy_instance buf
    memory_free buf
    status := shunt request:answer_header_sent success failu
  else
    status := failure
  page unbind
  if status=success
    request send_footer



export '. temporary_cleanup'
export '. send_static_file' '. execute_dynamic_page' '. do_c
export '. find_dynamic_page'
export '. forward'
    if not page:escape_html_page
      request:log trace "execute "+dp:position
      part execute "execute dynamic page "+dp:position
        page execute_style_setup sp:function
        page begin_end_hook_prototype page:begin_hook
        http_execute_dynamic_sub_page buf dp:function
        page begin_end_hook_prototype page:end_hook
    t destroy_instance buf
    memory_free buf
    status := shunt request:answer_header_sent success failu
  else
    status := failure
  page unbind
  if status=success
    request send_footer



export '. temporary_cleanup'
export '. send_static_file' '. execute_dynamic_page' '. do_c
export '. find_dynamic_page'
export '. forward'