@@ -93,14 +93,12 @@ typedef struct {
93
93
94
94
typedef struct ngx_http_upload_md5_ctx_s {
95
95
MD5_CTX md5 ;
96
- u_char md5_digest [MD5_DIGEST_LENGTH ];
97
- u_char md5_digest_hex [MD5_DIGEST_LENGTH * 2 ];
96
+ u_char md5_digest [MD5_DIGEST_LENGTH * 2 ];
98
97
} ngx_http_upload_md5_ctx_t ;
99
98
100
99
typedef struct ngx_http_upload_sha1_ctx_s {
101
100
SHA1_CTX sha1 ;
102
- u_char sha1_digest [SHA_DIGEST_LENGTH ];
103
- u_char sha1_digest_hex [SHA_DIGEST_LENGTH * 2 ];
101
+ u_char sha1_digest [SHA_DIGEST_LENGTH * 2 ];
104
102
} ngx_http_upload_sha1_ctx_t ;
105
103
106
104
/*
@@ -433,6 +431,16 @@ static ngx_http_variable_t ngx_http_upload_aggregate_variables[] = { /* {{{ */
433
431
434
432
static ngx_str_t ngx_http_upload_empty_field_value = ngx_null_string ;
435
433
434
+ static ngx_str_t ngx_upload_field_part1 = { /* {{{ */
435
+ sizeof ("\r\nContent-Disposition: form-data; name=\"" ) - 1 ,
436
+ (u_char * )"\r\nContent-Disposition: form-data; name=\""
437
+ }; /* }}} */
438
+
439
+ static ngx_str_t ngx_upload_field_part2 = { /* {{{ */
440
+ sizeof ("\"\r\n\r\n" ) - 1 ,
441
+ (u_char * )"\"\r\n\r\n"
442
+ }; /* }}} */
443
+
436
444
static ngx_int_t /* {{{ ngx_http_upload_handler */
437
445
ngx_http_upload_handler (ngx_http_request_t * r )
438
446
{
@@ -863,57 +871,55 @@ static ngx_int_t ngx_http_upload_flush_output_buffer(ngx_http_upload_ctx_t *u, u
863
871
}
864
872
} /* }}} */
865
873
866
- static ngx_int_t /* {{{ ngx_http_upload_append_field */
867
- ngx_http_upload_append_field (ngx_http_upload_ctx_t * u , ngx_str_t * name , ngx_str_t * value )
874
+ static void /* {{{ ngx_http_upload_append_str */
875
+ ngx_http_upload_append_str (ngx_http_upload_ctx_t * u , ngx_buf_t * b , ngx_chain_t * cl , ngx_str_t * s )
868
876
{
869
- ngx_int_t len ;
870
- ngx_chain_t * cl ;
871
- ngx_buf_t * b ;
877
+ b -> start = b -> pos = s -> data ;
878
+ b -> end = b -> last = s -> data + s -> len ;
879
+ b -> memory = 1 ;
880
+ b -> in_file = 0 ;
881
+ b -> last_buf = 0 ;
872
882
873
- len = u -> first_part ? u -> boundary . len - 2 : u -> boundary . len ;
883
+ b -> last_in_chain = 0 ;
874
884
875
- len += sizeof ("\r\nContent-Disposition: form-data; name=\"" ) - 1 ;
885
+ cl -> buf = b ;
886
+ cl -> next = NULL ;
876
887
877
- len += name -> len ;
888
+ if (u -> chain == NULL ) {
889
+ u -> chain = cl ;
890
+ u -> last = cl ;
891
+ }else {
892
+ u -> last -> next = cl ;
893
+ u -> last = cl ;
894
+ }
895
+ } /* }}} */
878
896
879
- len += sizeof ("\"\r\n\r\n" ) - 1 ;
897
+ static ngx_int_t /* {{{ ngx_http_upload_append_field */
898
+ ngx_http_upload_append_field (ngx_http_upload_ctx_t * u , ngx_str_t * name , ngx_str_t * value )
899
+ {
900
+ ngx_str_t boundary = { u -> first_part ? u -> boundary .len - 2 : u -> boundary .len ,
901
+ u -> first_part ? u -> boundary .data + 2 : u -> boundary .data };
880
902
881
- len += value -> len ;
903
+ ngx_buf_t * b ;
904
+ ngx_chain_t * cl ;
882
905
883
- b = ngx_create_temp_buf (u -> request -> pool , len );
906
+ b = ngx_palloc (u -> request -> pool , 5 * sizeof ( ngx_buf_t ) + 5 * sizeof ( ngx_chain_t ) );
884
907
885
908
if (b == NULL ) {
886
909
return NGX_UPLOAD_NOMEM ;
887
910
}
888
911
889
- cl = ngx_alloc_chain_link (u -> request -> pool );
890
- if (cl == NULL ) {
891
- return NGX_UPLOAD_NOMEM ;
892
- }
893
-
894
- b -> last = ngx_cpymem (b -> last , u -> first_part ? u -> boundary .data + 2 : u -> boundary .data ,
895
- u -> first_part ? u -> boundary .len - 2 : u -> boundary .len );
912
+ cl = (ngx_chain_t * )(b + 5 );
896
913
897
- b -> last = ngx_cpymem ( b -> last , "\r\nContent-Disposition: form-data; name=\"" , sizeof ( "\r\nContent-Disposition: form-data; name=\"" ) - 1 );
914
+ ngx_http_upload_append_str ( u , b , cl , & boundary );
898
915
899
- b -> last = ngx_cpymem ( b -> last , name -> data , name -> len );
916
+ ngx_http_upload_append_str ( u , b + 1 , cl + 1 , & ngx_upload_field_part1 );
900
917
901
- b -> last = ngx_cpymem ( b -> last , "\"\r\n\r\n" , sizeof ( "\"\r\n\r\n" ) - 1 );
918
+ ngx_http_upload_append_str ( u , b + 2 , cl + 2 , name );
902
919
903
- b -> last = ngx_cpymem (b -> last , value -> data , value -> len );
904
-
905
- b -> last_in_chain = 0 ;
906
-
907
- cl -> buf = b ;
908
- cl -> next = NULL ;
920
+ ngx_http_upload_append_str (u , b + 3 , cl + 3 , & ngx_upload_field_part2 );
909
921
910
- if (u -> chain == NULL ) {
911
- u -> chain = cl ;
912
- u -> last = cl ;
913
- }else {
914
- u -> last -> next = cl ;
915
- u -> last = cl ;
916
- }
922
+ ngx_http_upload_append_str (u , b + 4 , cl + 4 , value );
917
923
918
924
u -> first_part = 0 ;
919
925
@@ -1059,14 +1065,17 @@ ngx_http_upload_md5_variable(ngx_http_request_t *r,
1059
1065
v -> not_found = 0 ;
1060
1066
1061
1067
hex_table = (u_char * )data ;
1062
- c = u -> md5_ctx -> md5_digest_hex ;
1068
+ c = u -> md5_ctx -> md5_digest + MD5_DIGEST_LENGTH * 2 ;
1063
1069
1064
- for (i = 0 ; i < MD5_DIGEST_LENGTH ; i ++ ) {
1065
- * c ++ = hex_table [u -> md5_ctx -> md5_digest [i ] >> 4 ];
1066
- * c ++ = hex_table [u -> md5_ctx -> md5_digest [i ] & 0xf ];
1067
- }
1070
+ i = MD5_DIGEST_LENGTH ;
1071
+
1072
+ do {
1073
+ i -- ;
1074
+ * -- c = hex_table [u -> md5_ctx -> md5_digest [i ] & 0xf ];
1075
+ * -- c = hex_table [u -> md5_ctx -> md5_digest [i ] >> 4 ];
1076
+ }while (i != 0 );
1068
1077
1069
- v -> data = u -> md5_ctx -> md5_digest_hex ;
1078
+ v -> data = u -> md5_ctx -> md5_digest ;
1070
1079
v -> len = MD5_DIGEST_LENGTH * 2 ;
1071
1080
1072
1081
return NGX_OK ;
@@ -1093,14 +1102,17 @@ ngx_http_upload_sha1_variable(ngx_http_request_t *r,
1093
1102
v -> not_found = 0 ;
1094
1103
1095
1104
hex_table = (u_char * )data ;
1096
- c = u -> sha1_ctx -> sha1_digest_hex ;
1105
+ c = u -> sha1_ctx -> sha1_digest + SHA_DIGEST_LENGTH * 2 ;
1097
1106
1098
- for (i = 0 ; i < SHA_DIGEST_LENGTH ; i ++ ) {
1099
- * c ++ = hex_table [u -> sha1_ctx -> sha1_digest [i ] >> 4 ];
1100
- * c ++ = hex_table [u -> sha1_ctx -> sha1_digest [i ] & 0xf ];
1101
- }
1107
+ i = SHA_DIGEST_LENGTH ;
1108
+
1109
+ do {
1110
+ i -- ;
1111
+ * -- c = hex_table [u -> sha1_ctx -> sha1_digest [i ] & 0xf ];
1112
+ * -- c = hex_table [u -> sha1_ctx -> sha1_digest [i ] >> 4 ];
1113
+ }while (i != 0 );
1102
1114
1103
- v -> data = u -> sha1_ctx -> sha1_digest_hex ;
1115
+ v -> data = u -> sha1_ctx -> sha1_digest ;
1104
1116
v -> len = SHA_DIGEST_LENGTH * 2 ;
1105
1117
1106
1118
return NGX_OK ;
0 commit comments