Wapp

Diff
Login

Differences From Artifact [73baff4401]:

To Artifact [31929ee969]:


586
587
588
589
590
591
592
593

594
595
596
597
598
599

600
601

602
603
604
605
606
607
608
586
587
588
589
590
591
592

593
594
595
596
597
598

599
600

601
602
603
604
605
606
607
608







-
+





-
+

-
+







        set qsplit [split $qterm =]
        set nm [lindex $qsplit 0]
        if {[regexp {^[a-z][-a-z0-9_]*$} $nm]} {
          dict set wapp $nm [wappInt-decode-url [lindex $qsplit 1]]
        }
      }
    } elseif {[string match multipart/form-data* $ctype]} {
      regexp {^(.*?)\r\n(.*)$} [dict get $wapp CONTENT] all divider body
      regexp {^(.*?)\n(.*)$} [dict get $wapp CONTENT] all divider body
      set ndiv [string length $divider]
      while {[string length $body]} {
        set idx [string first $divider $body]
        set unit [string range $body 0 [expr {$idx-3}]]
        set body [string range $body [expr {$idx+$ndiv+2}] end]
        if {[regexp {^Content-Disposition: form-data; (.*?)\r\n\r\n(.*)$} \
        if {[regexp {^Content-Disposition: form-data; (.*?)\n\r?\n(.*)$} \
             $unit unit hdr content]} {
          if {[regexp {name="(.*)"; filename="(.*)"\r\nContent-Type: (.*?)$}\
          if {[regexp {name="(.*)"; filename="(.*)"\r?\nContent-Type: (.*?)$}\
                $hdr hr name filename mimetype]
              && [regexp {^[a-z][a-z0-9]*$} $name]} {
            dict set wapp $name.filename \
              [string map [list \\\" \" \\\\ \\] $filename]
            dict set wapp $name.mimetype $mimetype
            dict set wapp $name.content $content
          } elseif {[regexp {name="(.*)"} $hdr hr name]
745
746
747
748
749
750
751
752

753
754
755
756



757
758
759
760

761
762
763
764
765
766

767
768
769

770
771
772
773
774

775
776
777

778
779
780
781
782
783
784
785
786
787
788
789
790
791


792
793
794
795
796
797
798
799
800
801
802
803

804
805
806
807
808
809
810
745
746
747
748
749
750
751

752
753



754
755
756
757
758
759

760
761
762
763
764
765

766
767
768

769
770
771
772
773

774
775
776

777
778
779
780
781
782
783
784
785
786
787
788
789


790
791
792
793
794
795
796
797
798
799
800
801
802

803
804
805
806
807
808
809
810







-
+

-
-
-
+
+
+



-
+





-
+


-
+




-
+


-
+












-
-
+
+











-
+







  set rc [dict get $wapp .reply-code]
  if {$rc=="ABORT"} {
    # If the page handler invokes "wapp-reply-code ABORT" then close the
    # TCP/IP connection without sending any reply
    wappInt-close-channel $chan
    return
  } elseif {$chan=="stdout"} {
    puts $chan "Status: $rc\r"
    puts $chan "Status: $rc"
  } else {
    puts $chan "HTTP/1.1 $rc\r"
    puts $chan "Server: wapp\r"
    puts $chan "Connection: close\r"
    puts $chan "HTTP/1.1 $rc"
    puts $chan "Server: wapp"
    puts $chan "Connection: close"
  }
  if {[dict exists $wapp .reply-extra]} {
    foreach {name value} [dict get $wapp .reply-extra] {
      puts $chan "$name: $value\r"
      puts $chan "$name: $value"
    }
  }
  if {[dict exists $wapp .csp]} {
    set csp [dict get $wapp .csp]
    regsub {\n} [string trim $csp] { } csp
    puts $chan "Content-Security-Policy: $csp\r"
    puts $chan "Content-Security-Policy: $csp"
  }
  set mimetype [dict get $wapp .mimetype]
  puts $chan "Content-Type: $mimetype\r"
  puts $chan "Content-Type: $mimetype"
  if {[dict exists $wapp .new-cookies]} {
    foreach {nm val} [dict get $wapp .new-cookies] {
      if {[regexp {^[a-z][-a-z0-9_]*$} $nm]} {
        if {$val==""} {
          puts $chan "Set-Cookie: $nm=; HttpOnly; Path=/; Max-Age=1\r"
          puts $chan "Set-Cookie: $nm=; HttpOnly; Path=/; Max-Age=1"
        } else {
          set val [wappInt-enc-url $val]
          puts $chan "Set-Cookie: $nm=$val; HttpOnly; Path=/\r"
          puts $chan "Set-Cookie: $nm=$val; HttpOnly; Path=/"
        }
      }
    }
  }
  if {[string match text/* $mimetype]} {
    set reply [encoding convertto utf-8 [dict get $wapp .reply]]
    if {[regexp {\ygzip\y} [wapp-param HTTP_ACCEPT_ENCODING]]} {
      catch {wappInt-gzip-reply reply chan}
    }
  } else {
    set reply [dict get $wapp .reply]
  }
  puts $chan "Content-Length: [string length $reply]\r"
  puts $chan \r
  puts $chan "Content-Length: [string length $reply]"
  puts $chan ""
  puts -nonewline $chan $reply
  flush $chan
  wappInt-close-channel $chan
}

# Compress the reply content
#
proc wappInt-gzip-reply {replyVar chanVar} {
  upvar $replyVar reply $chanVar chan
  set x [zlib gzip $reply]
  set reply $x
  puts $chan "Content-Encoding: gzip\r"
  puts $chan "Content-Encoding: gzip"
}

# This routine runs just prior to request-handler dispatch.  The
# default implementation is a no-op, but applications can override
# to do additional transformations or checks.
#
proc wapp-before-dispatch-hook {} {return}